📄 main.c
字号:
}
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 + -