当前位置:首页 > 基于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
共分享92篇相关文档