1.簡介
本設計爲一款貪吃蛇遊戲,顯示器採用8*8點陣,主控制器採用51單片機,並通過按鍵實現對遊戲的操作。
2.貪吃蛇算法介紹
吃蛇遊戲算法的實現,即如何通過液晶屏顯示蛇的移動。
- 其實蛇看似移動的過程中,實質只有兩個點再變,即蛇頭前進方向增加一個點,蛇尾減少一個點。
- 知道如何顯示蛇的移動後,再一個關鍵問題就是蛇的轉折問題,如何控制蛇尾消失的點沿着蛇的路徑。通俗的說就是蛇怎麼實現曲折移動,這裏就用到了循環隊列,每次蛇頭前進方向發生變化後,隊列增加一個結點,結點中包含蛇頭方向變化的位置,以及蛇頭轉變的方向。
- 蛇尾每次移動的過程中都會與隊列頭指針所儲存的位置做一次判斷,當蛇尾到達這一位置後,從結點中取出保存的蛇頭的移動方向賦給蛇尾,結點出隊列即刪除這一結點。
- 由於隊列是頭出尾進,所以蛇頭先產生的結點,蛇尾會先與其進行判斷,並且刪除它,即實現了蛇的曲折運動。
3.硬件設計
此設計的硬件相對簡單,主要由四部分組成,分別爲單片機最小系統、8x8LED矩陣模塊、按鍵電路、系統電源。硬件框圖如下,
(1)8*8LED矩陣電路
8X8點陣LED結構如下圖所示:
從圖中可以看出,8X8點陣共需要64個發光二極管組成,且每個發光二極管是放置在行線和列線的交叉點上,當對應的某一列置1電平,某一行置0電平,則相應的二極管就亮;要實現顯示圖形或字體,只需考慮其顯示方式。通過編程控制各顯示點對應LED陽極和陰極端的電平,就可以有效的控制各顯示點的亮滅。
例如:要實現一根柱形的亮法,如圖所示,對應的一列爲一根豎柱,或者對應的一行爲一根橫柱,因此實現柱的亮的方法如下所述:
一根豎柱:對應的列置1,而行則採用掃描的方法來實現。
一根橫柱:對應的行置0,而列則採用掃描的方法來實現。
此外,爲了增大單片機的驅動能力,在單片機的P0腳上增加了一個74HC245緩衝器,增強對LED的驅動能力,電路如下
(2)按鍵電路
在此設計中設置了五個按鍵,分別爲方向使能、上、下、左、右,方式爲當方向使能按鍵按下後,四個方向的按鍵動作纔有效。電路如圖,
(3)硬件電路圖
4.軟件設計
(1) 按鍵操作程序
/*******************************************
判斷碰撞
*******************************************/
bit knock()
{
bit k;
k=0;
if(x[1]>7||y[1]>7)
k=1; //撞牆
for(i=2;i<n;i++)
if((x[1]==x[i])&(y[1]==y[i]))
k=1; //撞自己
return k;
}
/*****************
上下左右鍵位處理
*****************/
void turnkey()// interrupt 0 using 2
{
if(keyenable == 0)
{
key_en ^= 1; //取反操作
}
if(key_en)
{
if(left==0){addy=0;if(addx!=1)addx=-1; else addx=1;}
if(right==0){addy=0;if(addx!=-1)addx=1; else addx=-1;}
if(up==0){addx=0;if(addy!=-1)addy=1; else addy=-1;}
if(down==0){addx=0;if(addy!=1)addy=-1; else addy=1;}
}
}
/*****************
乘方程序
*****************/
uchar mux(uchar temp)
{
if(temp==7)return 128;
if(temp==6)return 64;
if(temp==5)return 32;
if(temp==4)return 16;
if(temp==3)return 8;
if(temp==2)return 4;
if(temp==1)return 2;
if(temp==0)return 1;
return 0;
}
(2)主程序
/*****************
主程序
*****************/
void main(void)
{
e=SPEED;
P0=0x00;
P1=0xff;
P2=0x00;
P3=0x00;
while(1)
{
//if(keyenable==1){P1=0x00;P2=0xff;}else{P1=0xff;P2=0x00;}
for(i=3;i<SNAKE+1;i++)
x[i]=100;
for(i=3;i<SNAKE+1;i++)
y[i]=100;//初始化
x[0]=4;y[0]=4; //果子
n=3; //蛇長 n=-1
x[1]=1;y[1]=0; //蛇頭
x[2]=0;y[2]=0; //蛇尾1
addx=0;addy=0; //位移偏移
//k=1;
while(1)
{
if(keyenable)
break;
timer0(1);
}
while(1)
{
timer0(e);
if(knock())
{
e=SPEED;
break;
} //判斷碰撞
if((x[0]==x[1]+addx)&(y[0]==y[1]+addy)) //是否吃東西
{
n++;
if(n==SNAKE+1)
{
n=3;
e=e-10;
for(i=3;i<SNAKE+1;i++)
x[i]=100;
for(i=3;i<SNAKE+1;i++)
y[i]=100;
}
x[0]=x[n-2];
y[0]=y[n-2];
}
for(i=n-1;i>1;i--){x[i]=x[i-1];y[i]=y[i-1];}
//x[n-1]=x[2];y[n-1]=y[2];
x[1]=x[2]+addx;y[1]=y[2]+addy; //移動
}
}
}
源碼+PCB+AD原理圖 下載:關注公衆號,首頁回覆“貪吃蛇”獲取資料