C51自动贪吃蛇程序
C51平台加点阵屏可以贪吃蛇,程序实现如下,但还不够智能,只能看一步路,还是会出现把自己困死的情况,看提供一种思路,请大家能加以补充,提供更好的思路,感谢大家
单片机:STC89C52RC
点阵:8*8单色点阵
点阵驱动:
行:74HC595
列:P0口
主函数
#include "config.h"//*********主函数*************//
void main()
{initTimer0(); while(1)startSnake();
}
贪吃蛇源码
/*********************************************************************贪吃蛇源码snake.c
**********************************************************************/
#include "config.h"#define snake_fast 5//******与蛇相关的结构体定义*************//
static struct Food
{unsigned char x; // 食物的横坐标unsigned char y; // 食物的纵坐标
// unsigned char yes;
}food; // 食物结构体struct Snake
{char x[SNAKE_Max_Long];char y[SNAKE_Max_Long];unsigned char Long; // 蛇的长度unsigned char Life; // 蛇的生命
// unsigned char Score; // 蛇的分数,本例中没使用unsigned char Level; // 蛇的等级unsigned char Dir; // 蛇移动方向
}snake; // 蛇结构体struct VSnake
{char x[SNAKE_Max_Long];char y[SNAKE_Max_Long];unsigned char Long; // 蛇的长度unsigned char Life; // 蛇的生命
// unsigned char Score; // 蛇的分数,本例中没使用unsigned char Level; // 蛇的等级unsigned char Dir; // 蛇移动方向
}vsnake; // 蛇结构体
//****************************************//enum Dir{up, down, left, right}; //方向枚举//***********变量声明***************//
unsigned char DispRAM[8]={0}; // 蛇坐标缓存
unsigned char tCount;
unsigned char keyValue=right;
unsigned char speedLevel=snake_fast;
extern uchar keyVal; // 来源于key.c
//**********************************//// 用此函数来产生食物最好使蛇的长度不要那么长,蛇越长,点越难找,递归越深
static void createFood()
{unsigned char i;food.x = rand()%WIDTH;food.y = rand()%LENGTH;for(i=0; i<snake.Long; i++){if(food.x==snake.x[i] && food.y==snake.y[i])createFood(); }
}//****************初始化蛇的位置等***********************//
static void initSnake()
{//********清除内存数据**********//unsigned char i;for(i=0; i<SNAKE_Max_Long; i++){snake.x[i]=-1;snake.y[i]=-1;}//********初始化蛇参数**********//snake.Long=2; // 初始化蛇的长度为两节snake.Life=1; //初始化蛇活着snake.Dir=right;snake.x[1]=0;snake.y[1]=2;snake.x[0]=1;snake.y[0]=2;createFood();
}//********************刷新界面*******************//
static void drawSnake()
{unsigned char i=0;for(i=0; i<8; i++) DispRAM[i]=0;for(i=0; i<snake.Long; i++)DispRAM[snake.y[i]] |= 1<<snake.x[i];scanDisplay(DispRAM);drawPoint(food.x, food.y);
}char SnakeTryDead()
{char i;
//**********************蛇之dead***************************//// 限定蛇活动范围,超范围就deadif((vsnake.x[0]>(WIDTH-1)) || (vsnake.x[0]<0) || (vsnake.y[0]>(LENGTH-1)) || (vsnake.y[0]<0)){return 0; }// 蛇自杀检测for(i=4; i<=vsnake.Long; i++){if(vsnake.x[i-1]==vsnake.x[0] && vsnake.y[i-1]==vsnake.y[0]){return 0;}}return 1;
}char SnakeAutuRun(char myDir)
{char i;char scal=1;vsnake.Dir = snake.Dir;vsnake.Long=snake.Long;for(i=0;i<=snake.Long;i++){vsnake.x[i]=snake.x[i];vsnake.y[i]=snake.y[i];}switch(myDir){case up: if(vsnake.Dir != down) vsnake.Dir=up; break;case down: if(vsnake.Dir != up) vsnake.Dir=down; break;case left: if(vsnake.Dir != right) vsnake.Dir=left; break;case right: if(vsnake.Dir != left) vsnake.Dir=right; break;default: break;}// 蛇身体坐标移动,蛇头方向坐标逐渐向蛇尾方向移动for(i=vsnake.Long; i>0; i--){ vsnake.y[i]=vsnake.y[i-1];vsnake.x[i]=vsnake.x[i-1];}// 重新获得蛇的头部位置switch(vsnake.Dir){ case up: vsnake.y[0]-=1; break;case down: vsnake.y[0]+=1; break;case left: vsnake.x[0]-=1; break;case right: vsnake.x[0]+=1; break;default: break;}// 蛇吃到食物if(vsnake.x[0]==food.x && vsnake.y[0]==food.y){scal+=1;}if(SnakeTryDead()){return scal;}else{return 0;}}char SnakeGetApple()
{char step=0;char i=0;if(food.x>snake.x[0])step = 3;else if(food.x<snake.x[0])step = 2;if(food.y>snake.y[0])step = 1;else if(food.y<snake.y[0])step = 0;return step;
}//********************蛇运动坐标刷新*******************//
static void runSnake()
{unsigned char i;char step;step=SnakeGetApple();if(SnakeAutuRun(step))keyVal=step;else{for(i=0;i<4;i++){if(SnakeAutuRun(i))keyVal=i;}}changeDir(keyVal);// 蛇身体坐标移动,蛇头方向坐标逐渐向蛇尾方向移动for(i=snake.Long; i>0; i--){ snake.y[i]=snake.y[i-1];snake.x[i]=snake.x[i-1];}// 重新获得蛇的头部位置switch(snake.Dir){ case up: snake.y[0]-=1; break;case down: snake.y[0]+=1; break;case left: snake.x[0]-=1; break;case right: snake.x[0]+=1; break;default: break;}// 蛇吃到食物if(snake.x[0]==food.x && snake.y[0]==food.y){snake.Long++;createFood();}}//*******************方向按键处理***********************//
static void changeDir(unsigned char key)
{// 方向按键的规则switch(key){case up: if(snake.Dir != down) snake.Dir=up; break;case down: if(snake.Dir != up) snake.Dir=down; break;case left: if(snake.Dir != right) snake.Dir=left; break;case right: if(snake.Dir != left) snake.Dir=right; break;default: break;}
}//********************启动贪吃蛇游戏(主函数)*********************//
void startSnake()
{uchar i=0;int j;initSnake();while(snake.Life){changeDir(keyValue);// 蛇运行的速度,由speedLevel决定if(tCount >= speedLevel){tCount=0;runSnake();}//**********************蛇之dead***************************//// 限定蛇活动范围,超范围就deadif((snake.x[0]>(WIDTH-1)) || (snake.x[0]<0) || (snake.y[0]>(LENGTH-1)) || (snake.y[0]<0)){for(j=0;j<1000;j++){drawSnake();}snake.Life=0; snake.Level=1;speedLevel=snake_fast;keyVal=right; }// 蛇自杀检测for(i=4; i<=snake.Long; i++){if(snake.x[i-1]==snake.x[0] && snake.y[i-1]==snake.y[0]){for(j=0;j<1000;j++){drawSnake();}delayMs(500); // 延一下时snake.Life=0;snake.Level=1;speedLevel=snake_fast;keyVal=right; }}//***********************************************************//// 等级越高速度越快if(snake.Long >= SNAKE_Max_Long){for(j=0;j<100;j++){drawSnake();}initSnake();
// speedLevel-=5;keyVal=right; if(++snake.Level > 5){// 大神,你已经打爆机了,现在从头再来。。。snake.Level=1;speedLevel=snake_fast; }tCount=0;}drawSnake();}
}
贪吃蛇头文件
#ifndef __SNAKE_H
#define __SNAKE_H#define WIDTH 8
#define LENGTH 8
#define SNAKE_Max_Long 25 // 蛇最大长度static void createFood();
static void initSnake();
static void drawSnake();
static void runSnake();
static void changeDir(unsigned char key);
void startSnake();#endif
延时函数
#include "config.h"
/**************************************************************************
****** 下面所有延时函数均从软件STC-ISP中获得,以12MHz晶振为时钟源
****** STC-ISP软件下载地址:WWW.STCMCU.COM
**************************************************************************///void delayUs(unsigned int i)
//{
// while(i--)
// _nop_();
//}void delay1Ms() //@12.000MHz
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}void delayMs(unsigned int i)
{while(i--){delay1Ms();}
}
中断函数
#include "config.h"extern unsigned char tCount; //来源于snake.c文件
extern unsigned char keyValue; //来源于snake.c文件//******定时器0初始化*************//
void initTimer0()
{TMOD |= 0x01;TL0 = TIMER;TH0 = TIMER>>8;TR0 = 1;ET0 = 1;EA = 1;
}//******定时器0中断服务处理*************//
void timer0Handle() interrupt 1
{ // 20ms中断TL0 = TIMER;TH0 = TIMER>>8;keyValue=scanKey();tCount++;
}
显示函数
#include "8x8lattice.h"void hc595Write(unsigned char writeVal)
{unsigned char i;ST_CP=0;for(i=0; i<8; i++){SH_CP=0;DS=((writeVal<<i)&0x80)?1:0;SH_CP=1;}ST_CP=1;
}void hc238Write(unsigned char writeVal)
{switch(writeVal){case 0: P0=~(0x01);break;case 1: P0=~(0x02);break;case 2: P0=~(0x04);break;case 3: P0=~(0x08);break;case 4: P0=~(0x10);break;case 5: P0=~(0x20);break;case 6: P0=~(0x40);break;case 7: P0=~(0x80);break;default: P0=~(0x00); break; }
}void drawPoint(unsigned char x, unsigned char y)
{hc238Write(y);hc595Write(0x00);hc595Write((1<<x));}void scanDisplay(unsigned char *pbuff)
{unsigned char i=0;hc595Write(0x00);for(i=0; i<8; i++){ hc238Write(i);hc595Write(pbuff[i]);hc595Write(0x00);}
}
显示函数头文件
#ifndef __8X8LATTICE_H
#define __8X8LATTICE_H
#include <reg52.h>
#include <intrins.h>
//=====hc595 引脚定义========
sbit DS = P3^4;
sbit SH_CP = P3^6;
sbit ST_CP = P3^5;//=====hc238 引脚定义========
//sbit hc238A = P2^0;
//sbit hc238B = P2^1;
//sbit hc238C = P2^2;
//sbit hc238EN = P2^6;void hc595Write(unsigned char writeVal);
void hc238Write(unsigned char writeVal);
void drawPoint(unsigned char x, unsigned char y);
void scanDisplay(unsigned char *pbuff);#endif
C51自动贪吃蛇程序相关推荐
- 【python教程入门学习】Python实现自动玩贪吃蛇程序
这篇文章主要介绍了通过Python实现的简易的自动玩贪吃蛇游戏的小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学一学 实现效果 先看看效果 这比我手动的快多了,而且是单机的,自动玩没惹 ...
- c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...
求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束 /* 以下是主要的逻辑代码,还有些.c和.h就没发了 ...
- JAVA小程序:一个基于MVC框架的贪吃蛇程序
学习JAVA也有一段时间了,之前看了翁恺老师的视频,跟着做了一个细胞自动机,粗浅地了解了一点MVC框架的知识,感觉获益匪浅.但是细胞自动机毕竟是跟着视频完成的,有很大程度上都是参考了视频里的代码,没有 ...
- 用python写一个贪吃蛇程序
我可以为您提供一些有关如何使用Python编写贪吃蛇程序的指导.首先,您需要确定您的程序所需的功能,以及游戏的规则和特性.接下来,您可以编写代码来实现这些功能,并使用Python的图形库来绘制游戏界面 ...
- 模仿别人的简单贪吃蛇程序
参考的别人的贪吃蛇程序,只做了少许的更改,惭愧.http://bbs.csdn.net/topics/350080780 #include <stdio.h> #include <s ...
- 代码全解:Python实现自动玩贪吃蛇程序
录 实现效果 代码 实现效果 先看看效果 这比我手动的快多了,而且是单机的,自动玩没惹骂我,哈哈 ,多人游戏整个自动玩会被骂死~ 代码 没装软件的先安装一下软件,没装模块的安装一下pygame模块. ...
- html+JavaScript 实现贪吃蛇程序
<!doctype html> <html> <head> <!-- 当前文档的字符集编码GBK,UTF-8,GB2312(GBK的子集)--> < ...
- 贪吃蛇程序(金沙滩51单片机)-启动篇-1(含演示GIF)
点击获取工程源码 首先声明:本代码中不含中断程序(因为当时没学,后来觉得51过于落伍,故没有深学),以下的代码只是挑出其中主要的进行细讲,源码点击上方获取. 我们将启动贪吃蛇分为以下5个步骤: 1.初 ...
- 贪吃蛇程序不要白不要,一个赞就够了
#include<stdio.h> #include<conio.h> #include<windows.h> #include<time.h> #de ...
- python贪吃蛇程序_Python 实现 贪吃蛇大作战 代码分享
感觉游戏审核新政实施后,国内手游市场略冷清,是不是各家的新游戏都在排队等审核.媒体们除了之前竞相追捧<Pokemon Go>热闹了一把,似乎也听不到什么声音了.直到最近几天,突然听见好几人 ...
最新文章
- 应用程序服务器和Web服务器之间有什么区别?
- java深度优先迷宫生成_通过深度优先搜索产生的迷宫的Java代码
- 78、VLAN间路由配置实验之单臂路由
- 基于FPGA的IIR滤波器设计
- docker探索-docker安装运行tomcat(六)
- MariaDB:删除数据库报错:error: 'Error dropping database (can't rmdir './shiro', errno: 39)'
- 今天拜读了X先生的作品,深受其益
- 51单片机(STC15W408AS)映射printf函数 串口收发实现
- android studio生成jks,Android Studio生成keystore签名文件步骤讲解
- “7天”连锁酒店郑南雁
- Arcmap出了问题--显示“ArcGIS Initializing Application”
- 网易企业邮箱 服务器 端口,网易企业邮箱客户端——Thunderbird设置
- GFS —— 分布式文件系统
- 郭德纲相声里的插入广告
- UiBot If(如果条件成立)
- 线程竞争导致的EOFException解决 --- 一次线上问题解决流程
- 字节面试杂谈——计算机网络原理
- 复古拼贴_创建数码照片拼贴的最佳免费应用
- 解决ceph 100.000% pgs not active
- 3GPP R15 5GNR 协议概述
热门文章
- react 截取视频随意一帧裁剪图片存为base64格式
- 计算机二级VEP考试内容,2017计算机二级VEP知识点:报表设计与应用
- windows 安装使用luarocks
- [转]VS2013+简单稀疏光束调整库SSBA配置(64位编译)
- CIFAR10 代码分析详解——cifar10_train.py
- Altium Designer库文件与Protel 99SE库文件转化
- 【免费】雪糕刺客小程序,天价雪糕查询表,简单小程序框架
- 可编辑的电子海图系统功能拓展与应用
- 备战数学建模10-主成分分析模型与因子分析模型
- 机器码、序列号、认证码、注册码的生成算法(四)