📄 snake.c
字号:
case 0x06: //向上键
if (DownMove ==0)//防止向相反的方向运动
{
UpMove = 1;//向上移动标志位
DownMove = 0;//向下移动标志位
LeftMove = 0;//向左移动标志位
RightMove = 0;//向右移动标志位
MoveDirection=1;
}
KeyCoding[2] = 0;
break;
case 0x44: //向下键
if (UpMove ==0)
{
UpMove = 0;//向上移动标志位
DownMove = 1;//向下移动标志位
LeftMove = 0;//向左移动标志位
RightMove = 0;//向右移动标志位
MoveDirection=2;
}
KeyCoding[2] = 0;
break;
case 0x47: //向左键
if (RightMove==0)
{
UpMove = 0;//向上移动标志位
DownMove = 0;//向下移动标志位
LeftMove = 1;//向左移动标志位
RightMove = 0;//向右移动标志位
MoveDirection=3;
}
KeyCoding[2] = 0;
break;
case 0x40: //向右键
if (LeftMove==0)
{
UpMove = 0;//向上移动标志位
DownMove = 0;//向下移动标志位
LeftMove = 0;//向左移动标志位
RightMove = 1;//向右移动标志位
MoveDirection=4;
}
KeyCoding[2] = 0;
break;
case 0x02: //第一次按进入设置,第二次退出设置状态
KeyCoding[2] = 0;
break;
case 0x07: //系统设定键
KeyCoding[2] = 0;
break;
}
}
}
/*---------------------------------------------------------
函数:Int0()
说明:定时器0溢出中断
---------------------------------------------------------*/
Int0() interrupt 0
{
uchar i,k;
EA = 0; //关外中断0
if (P3_2==0) //P3.2低电平继续
{
for (i=8;i>0;i--) //循环检测10次,低电平引导信号干扰检测(9ms)
{
Delay400us(); //延时438us
if (P3_2==1) //低电平引导信号出现高电平就跳出
{
EA = 1; //开外中断
return;
}
}
while(P3_2==0); //等待高电平引导信号到了.
for (i=8;i>0;i--) //循环检测10次,高电平引导信号干扰检测(4.5ms)
{
Delay400us();
if (P3_2==0) //高电平引导信号出现低电平就跳出
{
EA = 1; //开外中断
return;
}
}
while(P3_2==1); //等待高电平引导信号结束.
//接收4个字节的数据
for (k=0;k<4;k++)
{
for (i=8;i>0;i--) //8位数据
{
while(P3_2==0); //等待第一个地址码的高电平到了.(保证判断每位数据的起点一致)
Delay400us();
Delay400us(); //延时0.876ms去判断P3.2的状态(0.56ms<延时时间<1.125ms)
KeyCoding[k]>>= 1; //右移1位
if(P3_2==1) //仍是1,最高位写入1,0跳过
KeyCoding[k]|= 0x80;
while(P3_2==1); //等待高电平结束
}
}
//比较地址码和地址反码,不同解码错误退出
if (KeyCoding[0]!=~KeyCoding[1]&&KeyCoding[2]!=~KeyCoding[3])
{
EA = 1; //开外中断
return;
}
}
//按键判断也可以放到这里
Sound(); //解码成功声音提示.
EA = 1; //开外中断
}
/*---------------------------------------------------------
函数:Timer0()
说明:定时器0溢出中断
---------------------------------------------------------*/
Timer0() interrupt 1
{
uchar head,i;
TH0 = 0xB1; //定时10mS
TL0 = 0xE0;
counter++; //计数器加1
if (counter ==50) //50*10mS(0.5秒)执行一次
{
counter = 0; //计数器清0
if (SnakeLong<20)
{
PlacedFood(); //放置食物
head = SnakeCoor();//读取蛇头当前位置
switch (MoveDirection)//判断蛇的移动方向
{//在移动时不能向相反的方向移动.
case 1: //向上移动-16
if (Map[head-16]==0) //蛇头前面是空
{
Map[head-16] = 4;//蛇头新位置
Map[Snake[SnakeLong]]=0;//将蛇尾清0
for (i=SnakeLong;i>0;i--)
{
Snake[i]=Snake[i-1];//将(蛇身长度-1)的坐标给蛇尾
Map[Snake[i-1]]=3;//刷新地图上的蛇身
}
Snake[0] = head-16;//存蛇头新位置
}
else if (Map[head-16]==2)//蛇头前面是食物
{
FoodFlag = 0;//食物标志位清0
SnakeLong +=1;
Map[head-16] = 4;//蛇头新位置
for (i=SnakeLong;i>0;i--)
{
Snake[i]=Snake[i-1];//将(蛇身长度-1)的坐标给蛇尾
Map[Snake[i-1]]=3;//刷新地图上的蛇身
}
Snake[0] = head-16;//存蛇头新位置
Map[Snake[SnakeLong]]=0;//将蛇尾清0
}
else if (Map[head-16]==1||Map[head-16]==3)//蛇头前面是墙和蛇身
{
GameOver = 1;//游戏结束
}
break;
case 2: //向下移动+16
if (Map[head+16]==0) //蛇头前面是空
{
Map[head+16] = 4;//蛇头新位置
Map[Snake[SnakeLong]]=0;//将蛇尾清0
for (i=SnakeLong;i>0;i--)
{
Snake[i]=Snake[i-1];//将(蛇身长度-1)的坐标给蛇尾
Map[Snake[i-1]]=3;//刷新地图上的蛇身
}
Snake[0] = head+16;//存蛇头新位置
}
else if (Map[head+16]==2)//蛇头前面是食物
{
FoodFlag = 0;//食物标志位清0
SnakeLong +=1;
Map[head+16] = 4;//蛇头新位置
for (i=SnakeLong;i>0;i--)
{
Snake[i]=Snake[i-1];//将(蛇身长度-1)的坐标给蛇尾
Map[Snake[i-1]]=3;//刷新地图上的蛇身
}
Snake[0] = head+16;//存蛇头新位置
Map[Snake[SnakeLong]]=0;//将蛇尾清0
}
else if (Map[head+16]==1||Map[head+16]==3)//蛇头前面是墙和蛇身
{
GameOver = 1;//游戏结束
}
break;
case 3: //向左移动-1
if (Map[head-1]==0) //蛇头前面是空
{
Map[head-1] = 4;//蛇头新位置
Map[Snake[SnakeLong]]=0;//将蛇尾清0
for (i=SnakeLong;i>0;i--)
{
Snake[i]=Snake[i-1];//将(蛇身长度-1)的坐标给蛇尾
Map[Snake[i-1]]=3;//刷新地图上的蛇身
}
Snake[0] = head-1;//存蛇头新位置
}
else if (Map[head-1]==2)//蛇头前面是食物
{
FoodFlag = 0;//食物标志位清0
SnakeLong +=1;
Map[head-1] = 4;//蛇头新位置
for (i=SnakeLong;i>0;i--)
{
Snake[i]=Snake[i-1];//将(蛇身长度-1)的坐标给蛇尾
Map[Snake[i-1]]=3;//刷新地图上的蛇身
}
Snake[0] = head-1;//存蛇头新位置
Map[Snake[SnakeLong]]=0;//将蛇尾清0
}
else if (Map[head-1]==1||Map[head-1]==3)//蛇头前面是墙和蛇身
{
GameOver = 1;//游戏结束
}
break;
case 4: //向右移动+1
if (Map[head+1]==0) //蛇头前面是空
{
Map[head+1] = 4;//蛇头新位置
Map[Snake[SnakeLong]]=0;//将蛇尾清0
for (i=SnakeLong;i>0;i--)
{
Snake[i]=Snake[i-1];//将(蛇身长度-1)的坐标给蛇尾
Map[Snake[i-1]]=3;//刷新地图上的蛇身
}
Snake[0] = head+1;//存蛇头新位置
}
else if (Map[head+1]==2)//蛇头前面是食物
{
FoodFlag = 0;//食物标志位清0
SnakeLong +=1;
Map[head+1] = 4;//蛇头新位置
for (i=SnakeLong;i>0;i--)
{
Snake[i]=Snake[i-1];//将(蛇身长度-1)的坐标给蛇尾
Map[Snake[i-1]]=3;//刷新地图上的蛇身
}
Snake[0] = head+1;//存蛇头新位置
Map[Snake[SnakeLong]]=0;//将蛇尾清0
}
else if (Map[head+1]==1||Map[head+1]==3)//蛇头前面是墙和蛇身
{
GameOver = 1;//游戏结束
}
break;
}
MapCreate(); //生成地图
GameDisplay(GDRAM);//地图刷新显示
}
else//SnakeLong >=20 就过关
{
TR0=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -