【Proteus仿真】【51单片机】俄罗斯方块&贪吃蛇游戏设计
本项目使用Proteus8仿真51单片机控制器,使用按键、LCD12864等。主要功能:系统运行后,LCD12864显示游戏界面,可按任意键进入游戏选择界面,按上下键可选择,按确认键进入游戏,当游戏需要暂停和开始,可按下确认键。
·
一、功能简介
本项目使用Proteus8仿真51单片机控制器,使用按键、LCD12864等。
主要功能:
系统运行后,LCD12864显示游戏界面,可按任意键进入游戏选择界面,按上下键可选择,按确认键进入游戏,当游戏需要暂停和开始,可按下确认键。
二、软件设计
/*
作者:嗨小易(QQ技术交流群:570487280)
*/
/*贪吃蛇子程序*/
void tanchishe(void)
{
uchar xdata length[102]={0,8,1,8}; //存放蛇身的数组;
uchar food[2]={12,8};
uchar i,x,y;
bit flag2,flag3,flag4;
TMOD=1; //定时器工作方式
IT0=1; //边延有效
IT1=1;
EA=1; //开CPU中断
ET0=1; //开定时器中断
EX0=1; //开外部中断
EX1=1;
TL0=0x00;
TH0=0x00; //定时器初值
TR0=1; //启动定时器
dengji=2;
p=20;
direction=1;
flag5=0;
choose12864(2);
clear12864();
vertical(1,61,30);
vertical(1,61,127);
for(i=0;i<98;i++)
{
dot(30+i,1);
dot(30+i,62);
}
play16(0,0,0,tan);
play16(0,0,1,chi);
play16(0,0,2,she);
change(length,(length+1));
change((length+2),(length+3));
change(food,food+1);
for(;;)
{
do
{
first=1;
while(flag5|!flag1);
x=*(length);
y=*(length+1);
switch(direction) //右
{
case 1:
{
for(i=0;i<dengji-1;i++)
{
*(length+(i<<1))=*(length+(i<<1)+2);
*(length+(i<<1)+1)=*(length+(i<<1)+3);
}
(*(length+(dengji<<1)-2))++;
flag=0;
break;
}
case 2: //下
{
for(i=0;i<dengji-1;i++)
{
*(length+(i<<1))=*(length+(i<<1)+2);
*(length+(i<<1)+1)=*(length+(i<<1)+3);
}
(*(length+(dengji<<1)-1))++;
flag=1;
break;
}
case 3: //左
{
for(i=0;i<dengji-1;i++)
{
*(length+(i<<1))=*(length+(i<<1)+2);
*(length+(i<<1)+1)=*(length+(i<<1)+3);
}
(*(length+(dengji<<1)-2))--;
flag=0;
break;
}
case 4:
{ //上
for(i=0;i<dengji-1;i++)
{
*(length+(i<<1))=*(length+(i<<1)+2);
*(length+(i<<1)+1)=*(length+(i<<1)+3);
}
(*(length+(dengji<<1)-1))--;
flag=1;
break;
}
}
flag4=((*(length+(dengji<<1)-2))==food[0])&&((*(length+(dengji<<1)-1))==food[1]);
if(flag4) //
{
for(i=dengji;i>0;i--)
{
*(length+(i<<1))=*(length+(i<<1)-2);
*(length+(i<<1)+1)=*(length+(i<<1)-1);
}
*length=x;
*(length+1)=y;
dengji++;
do
{
flag3=0;
food[0]=TL0%24;
food[1]=TL0%15;
for(i=0;i<dengji-1;i++) //食物是否在蛇身身上
{
if((*(length+(i<<1)))==food[0]&&((*(length+(i<<1)+1))==food[1]))
{
flag3=1;
break;
}
}
}while(flag3);
change(food,food+1);
}
flag2=1; //蛇头没有遇到蛇身
for(i=0;i<dengji-1;i++)
{
if(*(length+(i<<1))==*(length+(dengji<<1)-2)&&(*(length+(i<<1)+1)==*(length+(dengji<<1)-1)))
{
flag2=0;
break;
}
}
flag2=flag2&&*(length+(dengji<<1)-2)>=0&&*(length+(dengji<<1)-2)<24;//蛇头是否出边界
flag2=flag2&&*(length+(dengji<<1)-1)>=0&&*(length+(dengji<<1)-1)<15;
if(flag2)
{
clear(&x,&y);
{
change(length+(dengji<<1)-2,length+(dengji<<1)-1);
}
if(flag4)
{
change(&x,&y);
}
flag1=0;
play8(0,0,3,shu0+((dengji/10)<<4));
play8(0,1,3,shu0+(((dengji)%10)<<4));
}
}
while(flag2);
delay1ms(450);
delay1ms(450);
choose12864(2);
clear12864();
play16(0,4,1,over);
play16(0,6,1,over+32);
play16(1,0,1,over+64);
play16(1,2,1,over+96);
delay1ms(450);
delay1ms(450);
break;
}
}
//////////////////////////////
main(void)
{
uchar i;
uchar count=0;
P2=0xff;
EA=1; //开CPU中断
//ET0=1; //开定时器中断
EX0=1; //开外部中断
EX1=1;
choose12864(2);
init12864();
clear12864();
////////////////////
play16(0,4,0,tan);
play16(0,6,0,chi);
play16(1,0,0,she);
///////////////////
play16(0,4,1,els);
play16(0,6,1,els+32);
for(i=0;i<3;i++)
{
play16(1,i<<1,1,(els+64+(i<<5)));
}
//////////////////
play16(0,4,2,wnl);
play16(0,6,2,wnl+32);
play16(1,0,2,wnl+64);
//////////////////
for(;;)
{
if((k==0x03)&&((P3&0x04)==0x04))
{
count++;
k=0;
if(count==4)
count=1;
switch(count)
{
case 1:
{
play16(0,4,2,wnl);
play16(0,6,2,wnl+32);
play16(1,0,2,wnl+64);
play16_fb(0,4,0);
play16_fb(0,6,0);
play16_fb(1,0,0);
};break;
case 2: {
play16(0,4,0,tan);
play16(0,6,0,chi);
play16(1,0,0,she);
play16_fb(0,4,1);
play16_fb(0,6,1);
for(i=0;i<3;i++)
{
play16_fb(1,i<<1,1);
}
};break;
case 3:
{
play16(0,4,1,els);
play16(0,6,1,els+32);
for(i=0;i<3;i++)
{
play16(1,i<<1,1,(els+64+(i<<5)));
}
play16_fb(0,4,2);
play16_fb(0,6,2);
play16_fb(1,0,2);
};break;
default:break;
}
}
if(P3&0x04)
first=1;
if(flag5)
{
switch(count)
{
case 1:flag5=0;tanchishe();count=0;flag5=0;k=0;break;
case 2:flag5=0;fangkuai();count=0;flag5=0; k=0;break;
// case 3:flag5=0;wannianli();count=0;flag5=0;k=0;break;
default:count=0;k=3;flag5=0;break;
}
choose12864(2);
init12864();
clear12864();
////////////////////
play16(0,4,0,tan);
play16(0,6,0,chi);
play16(1,0,0,she);
///////////////////
play16(0,4,1,els);
play16(0,6,1,els+32);
for(i=0;i<3;i++)
{
play16(1,i<<1,1,(els+64+(i<<5)));
}
//////////////////
play16(0,4,2,wnl);
play16(0,6,2,wnl+32);
play16(1,0,2,wnl+64);
//////////////////
}
}
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619



联系作者
视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。
更多推荐



所有评论(0)