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

📄 main.c

📁 推箱子游戏]基于AT89S51+62256+12864LCD
💻 C
📖 第 1 页 / 共 2 页
字号:
				}
		   		break;
		   case 5: //移动方向前面是十字执行这里
				//十字的前面不是墙或箱子或十字就可以移动
				if (Map[pos-16]==0)
				{
					Map[pos-16]= 3;//显示箱子
				  	Map[pos-8] = 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
				else if (Map[pos-16]==2)
				{
					Map[pos-16]= 5;//显示十字形
				  	Map[pos-8] = 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
		   		break;
	  }
	   Refyuan();//刷新圆形并判断是否满足(过关!)
	  MapCreate(); //刷新地图
      GameDisplay();//显示游戏界面
	 
   }
}
/**********************************************************
*函数名:DownMove() 
*功  能:娃娃脸向下移动 +8
**********************************************************/
void DownMove()
{
   uchar pos;
   pos = ReadPosition(); //获得娃娃脸的位置
   if (Map[pos+8]!=1)//判断移动方向前面是否是墙
   {
	 switch (Map[pos+8]) //得到娃娃脸前面的图形
	  {
		   case 0: //移动方向前面是空的执行这里
				Map[pos+8] = 4;//娃娃脸的新位置
				Map[pos] = 0; //清空娃娃脸位置
		   		break;
		   case 2: //是圆形执行这里
				Map[pos+8] = 4;//娃娃脸的新位置
				Map[pos] = 0; //清空娃娃脸位置
		   		break;
		   case 3: //移动方向前面是箱子执行这里
		   //箱子的前面不是墙或箱子或十字就可以移动
				if (Map[pos+16]==0)
				{
					Map[pos+16]= 3;//显示箱子
				  	Map[pos+8] = 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
				else if(Map[pos+16]==2)
				{
					Map[pos+16]= 5;//显示十字形
				  	Map[pos+8] = 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
		   		break;
		   case 5: //移动方向前面是十字执行这里
				//十字的前面不是墙或箱子或十字就可以移动
				if (Map[pos+16]==0)
				{
					Map[pos+16]= 3;//显示箱子
				  	Map[pos+8] = 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
				else if(Map[pos+16]==2)
				{
					Map[pos+16]= 5;//显示十字形
				  	Map[pos+8] = 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
		   		break;
	  }
	   Refyuan();//刷新圆形并判断是否满足(过关!)
	  MapCreate(); //刷新地图
      GameDisplay();//显示游戏界面
   }
}
/**********************************************************
*函数名:LeftMove() 
*功  能:娃娃脸向左移动 -1
**********************************************************/
void LeftMove()
{
   uchar pos;
   pos = ReadPosition(); //获得娃娃脸的位置
   if (Map[pos-1]!=1)//判断移动方向前面是否是墙
   {
	  switch (Map[pos-1]) 
	  {
		   case 0: //移动方向前面是空的执行这里
				Map[pos-1] = 4;//娃娃脸的新位置
				Map[pos] =0; //清空娃娃脸位置
		   		break;
		   case 2: //是圆形执行这里
				Map[pos-1] = 4;//娃娃脸的新位置
				Map[pos] =0; //清空娃娃脸位置
		   		break;
		   case 3: //移动方向前面是箱子执行这里
				//箱子的前面不是墙或箱子或十字就可以移动
				if (Map[pos-2]==0)
				{
					Map[pos-2]= 3;//显示箱子
				  	Map[pos-1]= 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
				else if (Map[pos-2]==2)
				{
				    Map[pos-2]= 5; //显示十字形
				  	Map[pos-1]= 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
		   		break;
		   case 5: //移动方向前面是十字执行这里
				//十字的前面不是墙或箱子或十字就可以移动
				if (Map[pos-2]==0)
				{
					Map[pos-2]= 3;//显示箱子
				  	Map[pos-1]= 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
				else if (Map[pos-2]==2)
				{
				    Map[pos-2]= 5;//显示十字形
				  	Map[pos-1]= 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
		   		break;
	  }
      Refyuan();//刷新圆形并判断是否满足(过关!)
   	  MapCreate(); //刷新地图
   	  GameDisplay();//显示游戏界面
	
   }
}
/**********************************************************
*函数名:RightMove() 
*功  能:娃娃脸向右移动 +1
**********************************************************/
void RightMove()
{
   uchar pos;
   pos = ReadPosition(); //获得娃娃脸的位置
   if (Map[pos+1]!=1)//判断移动方向前面是否是墙
   {
	  switch (Map[pos+1]) 
	  {
		   case 0: //移动方向前面是空的执行这里
				Map[pos+1] = 4;//娃娃脸的新位置
				Map[pos] =0; //清空娃娃脸位置
		   		break;
		   case 2: //是圆形执行这里
				Map[pos+1] = 4;//娃娃脸的新位置
				Map[pos] =0; //清空娃娃脸位置
		   		break;
		   case 3: //移动方向前面是箱子执行这里
				//箱子的前面不是墙或箱子或十字就可以移动
				if (Map[pos+2]==0)
				{
					Map[pos+2]= 3;//显示箱子
				  	Map[pos+1]= 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
				else if(Map[pos+2]==2)
				{
					Map[pos+2]= 5; //显示十字形
				  	Map[pos+1]= 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
		   		break;
		   case 5: //移动方向前面是十字执行这里
				//十字形的前面不是墙或箱子或十字就可以移动
				if (Map[pos+2]==0)
				{
					Map[pos+2]= 3;//显示箱子
				  	Map[pos+1]= 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
				else if(Map[pos+2]==2)
				{
					Map[pos+2]= 5; //显示十字形
				  	Map[pos+1]= 4;//娃娃脸的新位置
					Map[pos] = 0; //清空娃娃脸位置
				}
		   		break;
	  }
   Refyuan();//刷新圆形并判断是否满足(过关!)
   MapCreate(); //刷新地图
   GameDisplay();//显示游戏界面
   }
}
/**********************************************************
*延时400us
**********************************************************/
void Delay400us() //晶振=12MHz 延时时间=404us
 {				  //晶振=11.0592MHz 延时时间≈438us
 	uchar i,j;	  //总的延时时间=[(2*i)+1]*j+1+1
 	for (j=2;j>0;j--)
 		for (i=100;i>0;i--);
 }
/**********************************************************
*函数名:Sound()
*功  能:音效子程序
**********************************************************/
void Sound()
{
 uchar k;
 for (k=40;k>0;k--)
 {
	 Beep=~Beep;
	 Delay400us();
 }
}

/**********************************************************
*函数名:IR()
*功  能:外中断遥控解码程序
**********************************************************/
void IR() 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;
	}
  }
  switch (KeyCoding[2])
 	{//按键判断
	  case 	0x51:  //确定键
	  		guanka++;
			if (guanka==10) guanka=0;
			CopyMap(guanka);  //复制地图数据
  			MapCreate(); //地图生成程序
  			GameDisplay();//游戏界面显示程序
			Readyuan();//
	  		KeyCoding[2] = 0;
			Sound();	//解码成功声音提示.
	  		break;
	  case  0x06:  //向上键
	  		UpMove();
			KeyCoding[2] = 0;
			Sound();	//解码成功声音提示.
	  		break;
	  case  0x44:  //向下键
	  		DownMove();
			KeyCoding[2] = 0;
			Sound();	//解码成功声音提示.
	  		break;
	  case  0x47:  //向左键
	  		LeftMove();
			KeyCoding[2] = 0;
			Sound();	//解码成功声音提示.
	  		break;
	  case  0x40:  //向右键
	  		RightMove();
			KeyCoding[2] = 0;
			Sound();	//解码成功声音提示.
	  		break;
	  case	0x02:  //第一次按进入设置,第二次退出设置状态
	  		KeyCoding[2] = 0;
			Sound();	//解码成功声音提示.
	  		break;
	  case  0x07:  //系统设定键
	  		KeyCoding[2] = 0;
			Sound();	//解码成功声音提示.
	  		break;
	}
  EA = 1; 	//开外中断
}

/**********************************************************
*函数名:Init(void)
*功能:初始化
**********************************************************/
void Init()
{
 	EA  = 1; //开总中断
	IT0 = 1; //外中断0边沿触发
	EX0 = 1; //开外中断0
}

/**********************************************************
*函数名:main (void)
*功能:主函数
**********************************************************/
void main (void)
{
  uint i;
  Delay400us();//等待电源稳定
  Init();	   //
  LCDInit();   //液晶初始化程序
  for (i=0;i<1024;i++)
  {
   	GamePic[i] = 0;	//外部RAM清0
  }
  CopyMap(0);  //复制地图数据
  MapCreate(); //地图生成程序
  GameDisplay();//游戏界面显示程序
  Readyuan();	//读得圆形的坐标位置
  while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -