基于51单片机的贪食蛇游戏机开发-精品 - 图文 联系客服

发布时间 : 星期三 文章基于51单片机的贪食蛇游戏机开发-精品 - 图文更新完毕开始阅读

{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};/*%uchar code shu2[]=

{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00};/*%uchar code shu3[]=

{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00};/*%uchar code shu4[]=

{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};/*%uchar code shu5[]=

{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};/*%uchar code shu6[]=

{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};/*%uchar code shu7[]=

{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};/*%uchar code shu8[]=

{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};/*%uchar code shu9[]=

{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};/*%uchar code GameOverWord[]= {

0x00,0x20,0x44,0x08,0x20,0xE0,0x92,0x94,0x10,0x28,0xAE,0x68,0x24,0x04,0x00,0x00, 0x00,0x0C,0x03,0x04,0x02,0x19,0x0C,0x03,0x02,0x12,0x22,0x1F,0x01,0x01,0x01,0x00,/*\游\0x00,0x20,0xA0,0x90,0x10,0xF0,0x00,0x40,0x7F,0xC0,0x20,0x24,0x88,0x00,0x00,0x00, 0x10,0x08,0x04,0x02,0x01,0x02,0x14,0x10,0x08,0x05,0x06,0x09,0x10,0x20,0x38,0x00,/*\戏\0x00,0x60,0x50,0xCC,0x40,0x30,0x40,0x40,0x40,0xFE,0x20,0x20,0x20,0x20,0x00,0x00, 0x00,0x12,0x13,0x0A,0x09,0x05,0x00,0x3A,0x2A,0x25,0x25,0x15,0x1D,0x00,0x00,0x00,/*\结\0x00,0x00,0x00,0x60,0xA8,0xA8,0xA8,0xFF,0x94,0x54,0x70,0x00,0x00,0x00,0x00,0x00, 0x10,0x10,0x08,0x08,0x04,0x02,0x01,0x7F,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x00 /*\束\};

uchar code fen[]= {

13

0x80, 0x40, 0x20, 0x98, 0x87, 0x82, 0x80, 0x80, 0x83, 0x84, 0x98, 0x30, 0x60, 0xc0, 0x40, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x0f, 0x00, 0x00, 0x20, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00/*\分\};

uchar code shu[]= {

0x10, 0x92, 0x54, 0x38, 0xff, 0x38, 0x54, 0x52, 0x80, 0xf0, 0x1f, 0x12, 0x10, 0xf0, 0x10, 0x00, 0x42, 0x42, 0x2a, 0x2e, 0x13, 0x1a, 0x26, 0x02, 0x40, 0x20, 0x13, 0x0c, 0x33, 0x60, 0x20, 0x00/*\数\};

/*贪食蛇身体最小单位为4*4像素,活动空间被划分成多个4*4的小方块,共有16行25列,用x表示列,y表示行的话我们可以(X,Y)来表示蛇身体的一个单元的位置,从蛇头开始,我们将蛇的身体所有单元置于一个数组内,该数组为SnakeBody, SnakeBody[0] 存蛇尾。食物也是4*4的,处理方法类似*/ uchar SnakeBody[80]={0,8,1,8}; sbit deep=P2^5;

bit IsMovInVetical=0; //IsMovInVetical为0表示当前蛇头移动是水平向,1表垂直向 bit IsNotEatSelf; //为0表蛇头碰到蛇身,为1表未碰到。

bit IsToStep=0; //步进标志,主循环发现此位为1,让蛇进一步且将该位置0. bit IsT0GenNewFood; //是否需要重新产生食物(重置食物) uchar SnakeLength=2; //蛇体当前长度 uchar p=20; //定时次数

uchar ButtonNum,MovDirection=1; //k是按键号,MovDirection是移动方向

//液晶显示器相关全局变量 sbit E=P2^0; sbit RW=P2^1; sbit RS=P2^2; sbit CS2=P2^3; sbit CS1=P2^4;

14

/************************************************************************* 函数名:main

说明: 液晶屏初始化,定时器初始化后进入一个主循环,在主循环内等待到定时中 断服务程序将全局变量IsToStep置1,控制蛇产生步进。判断是否碰到食物,若碰到 食物则将蛇身与食物合并,并产生新的食物。每步进一次,主循环内还要判断蛇是否 吃到自己,若是,则退出主循环提示结束程序。

***************************************************************************/ void main() {

uchar food[2]={12,8}; //食物的位置(位于哪个4*4小格) uchar i,x,y;

choose12864(2); //选定左右屏幕 init_lcd(); //初始化 clear12864();

//清屏

vertical(1,61,30); //画左垂直边框线 vertical(1,61,127); //画右垂直边框线 for(i=0;i<98;i++) //画上下水平边框线 {

dot(30+i,1);

dot(30+i,62);

}

Play16(0,0,1,fen); //在屏幕左侧显示\分数\字样 Play16(0,0,2,shu);

DisplayBodyCell(SnakeBody,(SnakeBody+1));//显示贪食蛇 DisplayBodyCell((SnakeBody+2),(SnakeBody+3));//显示食物 DisplayBodyCell(food,food+1); TMOD=0x01; //定时器工作方式 IT0=1; //边延有效 EX0=1; //开外部中断 TL0=0x00;

15

TH0=0x00; //定时器初值 TR0=1; //启动定时器 ET0=1; //开定时器中断 IP=0x01; EA=1; do {

while(!IsToStep);//等待到定时中断给步进标记置位后,控制蛇身向前一步 x=*(SnakeBody); //暂存蛇尾位置 y=*(SnakeBody+1); switch(MovDirection)//东

{

case 1: {

//蛇步进,原次尾单元变成尾单元。SnakeBody向前挪两个字节。

for(i=0;i

*(SnakeBody+(i<<1))=*(SnakeBody+(i<<1)+2);

*(SnakeBody+(i<<1)+1)=*(SnakeBody+(i<<1)+3);

//设置中断优先级 //开CPU中断

}

(*(SnakeBody+(SnakeLength<<1)-2))++; //设定新蛇头的位置

IsMovInVetical=0; break;

}

case 2:

//南

{ //蛇步进,原次尾单元变成尾单元。SnakeBody向前挪两个字节。

for(i=0;i

*(SnakeBody+(i<<1)+1)=*(SnakeBody+(i<<1)+3);

}

16