趣味小遊戲:用單片機和LED燈陣製作的貪喫蛇趣味小遊戲 製作過程設計源代碼

最近幾天天氣總是在下雨,對於不愛玩手機遊戲的我來說過得太無聊了。
想想咋麼才能讓時間過得快一點呢,這個時候我看到電視裏的一個廣告類似貪喫蛇的,於是抱着試試看的想法 用單片機和LED燈陣做了一個貪喫蛇的遊戲
基本功能都有,玩起來體驗還可以,總算可以充分利用時間了。
下面我就把製作過程和文件分享給大家
用一個18650電池供電,用一個單片機進行控制
名稱:8X8點陣貪喫蛇
功能:
按右鍵開始、中間可以選擇速度1最慢9最快(飛一般的感覺)
速度2和9,哎呀呀,自己撞死了(可以穿牆,撞到自己的身體死亡)
按中間確定可查看喫到了多少
暫停

廢話不多說先上實物圖

實物圖1
在這裏插入圖片描述

實物圖2
在這裏插入圖片描述
在這裏插入圖片描述
焊接實物圖1 由於時間比較急線布的有點亂啊
在這裏插入圖片描述
焊接實物圖2
在這裏插入圖片描述
#include"reg52.h"
sbit d=P2^4;
sbit a=P2^0;
sbit w=P2^2;
sbit s=P2^6;
sbit key=P2^7;
unsigned char code n[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01},n0[8]={0x08,0x04,0x02,0x01,0x10,0x20,0x40,0x80};
unsigned char snake[8][8],xmax,ymax,xmin,ymin,max=0,min=200,eat=0,ch=‘d’,num=0,f=0,cun=0,food=1,hz=0,n1=0,v=2;
void late(unsigned int i)
{
for(;i>0;i–);
}
void xian(unsigned char y0,unsigned char x0,unsigned char y1,unsigned char x1,unsigned char on)
//在數組snake[][]中繪直線的函數,(x0,y0)to(x1,y1) on,0:off 1:長亮 2:以1:1亮滅時間比閃爍
{
char i,j,nx,ny;

if(x0>x1)
nx=-1;
else if(x0x1)
nx=0;
else
nx=1;
if(y0>y1)
ny=-1;
else if(y0
y1)
ny=0;
else
ny=1;
for(i=y0,j=x0;i!=y1+ny||j!=x1+nx;i=ny+i,j=nx+j)
snake[j][i]=on;

}
void print(void)//把二維數組snake[][]轉換點陣的函數,數組某元素爲0時,對應的led滅,1爲亮,2爲閃爍。(以後用多色led點陣時也可以用這種方法控制顏色)
{
unsigned char i,j;
P3=0x00;
P1=0x00;
for(i=0;i<8;i++)
{
P3=0x00;
P1=~n[i];
for(j=0;j<8;j++)
{
if(snake[j][i]==1)
{
P3|=n0[j];
}
else if(snake[j][i]==2)
{
if(hz%125>=60)
P3|=n0[j];
else
P3&=~n0[j];
}
else if(snake[j][i]==0)
P3&=~n0[j];
}
late(10);
}

}
void number(unsigned char su,unsigned char x,unsigned char y,unsigned char on,unsigned char in)
{ //在數組snake[][]從某座標起繪數字的函數,on:顯示樣式,in:背景樣式
xian(x+2,y,x+2,y+4,on);
if(su7||su4||su==1)
{

if(su7)
xian(x,y,x+2,y,on);
if(su
4)
{
xian(x,y,x,y+2,on);
snake[y+2][x+1]=on;
}
}
else
{
xian(x,y,x+2,y,on);
if(su!=0)
xian(x,y+2,x+2,y+2,on);
xian(x,y+4,x+2,y+4,on);
xian(x,y,x,y+4,on);
switch(su)
{
case 5:snake[y+3][x]=in;
case 6:snake[y+1][x+2]=in;break;
case 9:snake[y+3][x]=in;break;
case 2:snake[y+1][x]=snake[y+3][x+2]=in;break;
case 3:snake[y+1][x]=snake[y+3][x]=in;
}
}
}
void main(void)
{
unsigned int i,j;
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;//每10000微秒中斷一次(每0.01秒執行一次中斷函數)
EA=1;
ET0=1;
TR0=1;
//以上是有關時間中斷的設置

start:
P3=0x00;
P1=0x00;

f=1;
cun=1;
while(cun)//等待開始
{
n1++;
if(n1==240)
n1=0;

for(i=0;i<8;i++)
for(j=0;j<8;j++)
snake[j][i]=0;

switch(f)
{
case 1://主界面:開>
xian(0,1,4,1,1);
xian(0,3,4,3,1);
xian(1,1,1,5,1);
xian(3,1,3,6,1);
xian(6,2,6,4,2);
snake[3][7]=2;
snake[6][0]=1;
print();
P3=0x00;
P1=0x00;
if(d==0)
cun=0;
break;

case 2://選擇速度等級的界面
number(v,2,1,1,0);
snake[3][6]=2;
snake[3][0]=2;
if(d0&&v<9)
{
v++;
while(!d);
}
if(a
0&&v>1)
{
v–;
while(!a);
}
print();
}

if(key0)
{
while(!key);
if(f
2)
f=1;
else
f++;
}
}
f=0;
cun=0;
for(i=0;i<8;i++)//snake[][]數組的初始化
for(j=0;j<8;j++)
snake[j][i]=100;//100代表空
snake[0][0]=101;snake[0][1]=102;snake[0][2]=103;//大於100代表蛇身,其中最大值代表蛇頭,101代表蛇尾。

for(;😉//遊戲運行部分
{
for(i=0;i<8;i++)
{
P3=0x00;
P1=~n[i];
for(j=0;j<8;j++)
{
if(snake[j][i]>100)
{
P3|=n0[j];
if(f1&&eat0)
{
snake[j][i]–;
}
}
else if(snake[j][i]==100)
P3&=~n0[j];
else if(snake[j][i]==50)//值爲50的點代表食物
{
cun++;//統計現在存在的食物數
if(hz%25<10)
P3|=n0[j];
else
P3&=~n0[j];
if(hz>120)
hz=0;
//以上幾行:閃爍顯示食物
}

if(snake[j][i]>max)//以下:把蛇頭和蛇尾及其座標找出來,以便後面對蛇移動的操作
{
max=snake[j][i];
xmax=j;
ymax=i;
}
if(snake[j][i]<min&&snake[j][i]>100)
{
min=snake[j][i];
xmin=j;
ymin=i;
}
}
late(10);
n1++;
}

if(f==1)
f=0;

if(d0)//方向按鍵的識別
{
if(ch!=‘a’)
ch=‘d’;
}
else if(a
0)
{
if(ch!=‘d’)
ch=‘a’;
}
else if(w0)
{
if(ch!=‘s’)
ch=‘w’;
}
else if(s
0)
{
if(ch!=‘w’)
ch=‘s’;
}
if(key==0)//暫停功能
{
while(!key);
late(200);
P1=~0x24;
while(key)
{
if(hz%125>60)
P3=n0[2]+n0[3]+n0[4]+n0[5];
else
P3=0x00;
}
while(!key);
}

//下面:食物座標的生成(用以時間爲種子的隨機數%8得到)
if(cun<food)//如果存在的食物數<food
{
sui:
i=hz%8;
j=n1%8;
if(snake[j][i]==100)//如果該座標點爲空(沒有蛇身,障礙物和食物)
snake[j][i]=50;//該座標點生成食物
else //否則回到sui,重新生成食物座標
goto sui;
}
cun=0;//初始化食物數爲0,以便下一次循環的統計

if(num==0)
{
num=1;
f=1;
eat=0;

switch(ch)
{
case ‘a’😕/貪喫蛇左走
if(ymax<1)
{
if(snake[xmax][ymax+7]>100)
goto end;
else if(snake[xmax][ymax+7]==50)
{
eat++;
goto b72;
}
else
b72:snake[xmax][ymax+7]=max+1;
}
else
{
if(snake[xmax][ymax-1]>100)
goto end;
else if(snake[xmax][ymax-1]==50)
{
eat++;
goto o72;
}
else
o72:snake[xmax][ymax-1]=max+1;
}
break;
case ‘d’😕/右走
if(ymax+1>=8)
{
if(snake[xmax][ymax+1-8]>100)
goto end;
else if(snake[xmax][ymax+1-8]==50)
{
eat++;
goto b80;
}
else
b80:snake[xmax][ymax+1-8]=max+1;
}
else
{
if(snake[xmax][ymax+1]>100)
goto end;
else if(snake[xmax][ymax+1]==50)
{
eat++;
goto o80;
}
else
o80:snake[xmax][ymax+1]=max+1;
}
break;
case ‘w’😕/上走
if(xmax<1)
{
if(snake[xmax+7][ymax]>100)
goto end;
else if(snake[xmax+7][ymax]==50)
{
eat++;
goto b75;
}
else
b75:snake[xmax+7][ymax]=max+1;
}
else
{
if(snake[xmax-1][ymax]>100)
goto end;
else if(snake[xmax-1][ymax]==50)
{
eat++;
goto o75;
}
else
o75:snake[xmax-1][ymax]=max+1;
}
break;
case ‘s’😕/下走
if(xmax+1>=8)
{
if(snake[xmax+1-8][ymax]>100)
goto end;
else if(snake[xmax+1-8][ymax]==50)
{
eat++;
goto b77;
}
else
b77:snake[xmax+1-8][ymax]=max+1;
}
else
{
if(snake[xmax+1][ymax]>100)
goto end;
else if(snake[xmax+1][ymax]==50)
{
eat++;
goto o77;
}
else
o77:snake[xmax+1][ymax]=max+1;
}
break;
}
max=0;min=200;
}

}
end:
f=0;
while(key)//遊戲結束,顯示“X”
{
xian(0,0,7,7,1);
xian(0,7,7,0,1);
print();
}
while(!key);
for(i=0;i<8;i++)
for(j=0;j<8;j++)
snake[j][i]=0;
while(key)//顯示遊戲得分
{
number((max-103)/10,0,2,1,0);
number((max-103)%10,4,2,1,0);
print();

鑑於篇幅限制只能寫以上部分內容,最後,如果有什麼意見或者建議歡迎您留言給我,讓我們共同學習一起進步,
如果需要完整代碼或設計文件,請加QQ粉絲羣自行下載或者私信我,看到後會第一時間回覆。
謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章