⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snake.c

📁 键盘控制游戏液竟晶12864的,通过一般的控制新片就可以实现!供大家参考
💻 C
📖 第 1 页 / 共 2 页
字号:
	  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 + -