(*(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 
相关推荐: