基於51單片機的貪吃蛇遊戲

1.簡介
本設計爲一款貪吃蛇遊戲,顯示器採用8*8點陣,主控制器採用51單片機,並通過按鍵實現對遊戲的操作。

2.貪吃蛇算法介紹
吃蛇遊戲算法的實現,即如何通過液晶屏顯示蛇的移動。

  1. 其實蛇看似移動的過程中,實質只有兩個點再變,即蛇頭前進方向增加一個點,蛇尾減少一個點。
  2. 知道如何顯示蛇的移動後,再一個關鍵問題就是蛇的轉折問題,如何控制蛇尾消失的點沿着蛇的路徑。通俗的說就是蛇怎麼實現曲折移動,這裏就用到了循環隊列,每次蛇頭前進方向發生變化後,隊列增加一個結點,結點中包含蛇頭方向變化的位置,以及蛇頭轉變的方向。
  3. 蛇尾每次移動的過程中都會與隊列頭指針所儲存的位置做一次判斷,當蛇尾到達這一位置後,從結點中取出保存的蛇頭的移動方向賦給蛇尾,結點出隊列即刪除這一結點。
  4. 由於隊列是頭出尾進,所以蛇頭先產生的結點,蛇尾會先與其進行判斷,並且刪除它,即實現了蛇的曲折運動。

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原理圖 下載:關注公衆號,首頁回覆“貪吃蛇”獲取資料
在這裏插入圖片描述

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