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

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

(*(SnakeBody+(SnakeLength<<1)-1))++; IsMovInVetical=1; break; } case 3:

//西

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

for(i=0;i

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

}

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

IsMovInVetical=0; break; } case 4:

{ //北, 蛇步进,原次尾单元变成尾单元。SnakeBody向前挪两个字节。 for(i=0;i

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

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

}

(*(SnakeBody+(SnakeLength<<1)-1))--;//设定新蛇头的位置 IsMovInVetical=1; break; }

}

if(((*(SnakeBody+(SnakeLength<<1)-2))==food[0])&&

((*(SnakeBody+(SnakeLength<<1)-1))==food[1]))

{ //若碰到食物,调整蛇体

for(i=SnakeLength;i>0;i--)

17

{

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

*SnakeBody=x; *(SnakeBody+1)=y;

SnakeLength++;//蛇体长度加 do //产生新的有效的食物 {

IsT0GenNewFood=0; food[0]=TL0$; //产生食物

food[1]=TL0;

//检查Food位置是否被蛇身覆盖,若是需重置食

for(i=0;i

if((*(SnakeBody+(i<<1)))==food[0]&&

((*(SnakeBody+(i<<1)+1))==food[1]))

{

IsT0GenNewFood=1; break; } } }

while(IsT0GenNewFood);

DisplayBodyCell(food,food+1); //显示食物

}

IsNotEatSelf=1;

for(i=0;i

{ //判断是否吃到自己,蛇头坐标与身体某单元相同

18

if(*(SnakeBody+(i<<1))==*(SnakeBody+(SnakeLength<<1)-2)

&&(*(SnakeBody+(i<<1)+1)==*(SnakeBody+(SnakeLength<<1)-1)))

{

IsNotEatSelf=0;//吃到自己 break; } }

IsNotEatSelf=IsNotEatSelf&&*(SnakeBody+(SnakeLength<<1)-2)>=0

&&*(SnakeBody+(SnakeLength<<1)-2)<24;

IsNotEatSelf=IsNotEatSelf&&*(SnakeBody+(SnakeLength<<1)-1)>=0

&&*(SnakeBody+(SnakeLength<<1)-1)<15;

if(IsNotEatSelf) //如果未吃到自己 {

clear(&x,&y);

for(i=0;i

DisplayBodyCell(SnakeBody+(i<<1),SnakeBody+(i<<1)+1); }

IsToStep=0;

Play8(0,0,3,shu0+((SnakeLength/10)<<4));//显示得分 Play8(0,1,3,shu0+(((SnakeLength))<<4)); }

}

while(IsNotEatSelf);

//如果吃到自己,则上面大循环结束,游戏结束。 TR0=0; DelayINms(450); DelayINms(450); choose12864(2); clear12864();

19

Play16(0,4,1,GameOverWord); //显示“游戏结束”字样。 Play16(0,6,1,GameOverWord+32); Play16(1,0,1,GameOverWord+64); Play16(1,2,1,GameOverWord+96); while(1); }

/*********************************************************************** 函数名:DelayINms 说 明: 延时

输入参数:uint k,要延时的ms数

************************************************************************/ void DelayINms(uint k) {

k=k*125; while(k--); }

/*********************************************************************** 函数名:chekbusy12864

说 明: 检查液晶是否忙,若忙,等到其空闲再退出函数

************************************************************************/ void chekbusy12864() {

uchar dat; EX0=0;

RS=0; //指令模式 RW=1; //读数据 do {

P0=0x00; E=1;

20