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

📄 main.c

📁 一个推箱子的游戏,编程思想很值得借鉴,对大家会很有帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
**********************************************************/
void UpMove()
{
   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(GamePic);//显示游戏界面
	  Next();       //判断是否满足进入下一关
   }
}
/**********************************************************
*函数名: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(GamePic);//显示游戏界面
	  Next();       //判断是否满足进入下一关
   }
}
/**********************************************************
*函数名: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(GamePic);//显示游戏界面
	  Next();       //判断是否满足进入下一关
   }
}
/**********************************************************
*函数名: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(GamePic);//显示游戏界面
   Next();       //判断是否满足进入下一关
   }
}
/**********************************************************
*延时400us
**********************************************************/
void Delay400us() //晶振=12MHz 延时时间=404us
 {				  //晶振=11.0592MHz 延时时间≈438us
 	uchar i,j;	  //总的延时时间=[(2*i)+1]*j+1+1
 	for (j=4;j>0;j--) //j=2用12MHz,j=4 是24MHz晶振
 		for (i=100;i>0;i--);
 }
/**********************************************************
*函数名:Sound()
*功  能:音效子程序
**********************************************************/
void Sound()
{
 uchar i;
 for (i=40;i>0;i--)
 {
	 Beep=~Beep;
	 Delay400us();
 }
}
/**********************************************************
*函数名:IR()
*功  能:外中断遥控按键解码程序(108ms)
**********************************************************/
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;
	}
  }
  //按键判断也可以放到这里
  Sound();	//解码成功声音提示.
  EA = 1; 	//开外中断
}
/**********************************************************
*函数名:LOGO()
*功  能:开机画面
**********************************************************/
LOGO()
{
  uchar i,j;
  LCDWriteCommand(0x30);//基本指令集
  LCDWriteCommand(0x80);//从第一行开始显示
  for (i=0;i<4;i++)
  {
	  for (j=0;j<16;j++)
	  {
		  LCDWriteData(logotab[i][j]);
	  }
  }
}
/**********************************************************
*函数名:Delay1S()
*功  能:初始化
**********************************************************/
Delay1S(uchar n)
{
  uchar i,j,k,l;
  for (l=n;l>0;l--)
  {
  	for (i=100;i>0;i--)
  	{
  		for (j=40;j>0;j--)
			for (k=250;k>0;k--);
  	}
  }
}
/**********************************************************
*函数名:Init(void)
*功  能:初始化
**********************************************************/
void Init()
{
 	EA  = 1; //开总中断
	IT0 = 1; //外中断0边沿触发
	EX0 = 1; //开外中断0
}
/**********************************************************
*函数名:main (void)
*功能:主函数
**********************************************************/
void main (void)
{
  uint i;
  Delay1S(1);//等待电源稳定
  LCDInit();   //液晶初始化程序
  for (i=1024;i>0;i--) GamePic[i] = 0;	//外部RAM清0
  LOGO(); //
  Delay1S(4);
  LCDWriteCommand(0x01);
  Delay400us();
  CopyMap(0);  //复制地图数据
  MapCreate(); //地图生成程序
  GameDisplay(GamePic);//游戏界面显示程序
  Readyuan();	//读得圆形的坐标位置和个数
  Init();	   //
  while(1)
  {
	 switch (KeyCoding[2])	//可以放到主程序的while(1)循环中.
 	{//按键判断
	  case 	0x51:  //确定键
	  		guanka++; //关卡选择(测试地图编辑的是否正确用的)
			if (guanka==20) guanka=0;
			CopyMap(guanka);  //复制地图数据
  			MapCreate();  //地图生成程序
  			GameDisplay(GamePic);//游戏界面显示程序
			Readyuan();   //读圆形的坐标和数目
	  		KeyCoding[2] = 0;
	  		break;
	  case  0x06:  //向上键
	  		UpMove();
			KeyCoding[2] = 0;
	  		break;
	  case  0x44:  //向下键
	  		DownMove();
			KeyCoding[2] = 0;
	  		break;
	  case  0x47:  //向左键
	  		LeftMove();
			KeyCoding[2] = 0;
	  		break;
	  case  0x40:  //向右键
	  		RightMove();
			KeyCoding[2] = 0;
	  		break;
	  case	0x02:  //第一次按进入设置,第二次退出设置状态
	  		KeyCoding[2] = 0;
	  		break;
	  case  0x07:  //系统设定键
	  		KeyCoding[2] = 0;
	  		break;
	}
  }
}

⌨️ 快捷键说明

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