基于點陣的貪吃蛇游戲設計
以上全部資料打包下載:
基于點陣的貪吃蛇游戲設計.zip
(538.51 KB, 下載次數: 137)
2016-5-2 03:23 上傳
點擊文件名下載附件
本題目要求設計一款貪吃蛇游戲,顯示器采用 8*8點陣,主控采用51單片機,如果開發板上有點陣可以直接在上面進行開發。
基本要求: 1、屏幕能夠顯示出一條蛇,并且能夠通過按鍵控制其移動。 2、能夠隨機產生食物。 3、完成上面兩個要求的前提下,實現完整的游戲功能。 提高: 1、實現難度選擇功能。 2、加入關卡機制。 3、用鏈表或者隊列這類高級數據結構來實現程序功能。
點陣: 實際元件中,點陣的封裝不盡相同,因此需要測試出每個引腳的功能,以便正確連線。 注意,每個像素點的額定電壓在3v左右,電壓過大將會徹底損壞。 點陣的驅動方法和數碼管一樣,通過動態掃描來顯示。驅動電路可以照搬數碼管,也可以直接接在單片機的IO口上,不過顯示亮度將會受到影響。
按鍵: 略。。
參考程序: 游戲的邏輯結構大體都差不多,主要考驗大家和硬件結合的能力。
編程的過程中大家不可避免的會遇見很多困難,希望大家多多堅持,越過這道坎后相信大家的能力也會提升不少。最后祝大家編程愉快!
部分源碼預覽(完整版本請下載附件):
- /*************8*8點陣 貪吃蛇 ***************.****/
- /*****定義的坐標原點在左下角(0,0),右上角為(7,7)*********////
- #include <reg52.h>
- #include <stdlib.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit we = P2^1;
- sbit du = P2^0;
- sbit CS88 = P2^2;//點陣使能
- sbit up = P3^4; //上。下。左。右
- sbit down = P3^5;
- sbit right = P3^7;
- sbit left = P3^6;
- sbit k3 = P3^2; //外部中斷0,k3用做暫停;
- char y_table[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- char x_table[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- char x[21];
- char y[21]; //存放蛇身 + 食物 行、列坐標
- int addx,addy; //相對位移偏移
- uchar n; //蛇長
- void delay(uint i) //毫秒
- {
- uint j;
- for(;i>0;i--)
- for(j=110;j>0;j--);
- }
- /**************************************************************
- 判斷是否碰撞,是則返回1,否則返回0
- **************************************************************/
- int knock()
- { int k=0,i;
- 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 display(uchar n,uchar speed) //利用speed控制速度,speed越小,速度越快
- {
- int j;
- while(speed--)
- {
- for(j=0;j<n;j++)
- {
- du=1; //消去鬼影
- P0=0x00;
- du=0;
- P0=0xff;
- CS88=1;
- P0=0xff;
- CS88=0;
- P0=0x00;
- du=1;
- P0=y_table[y[j]];
- du=0;
- P0=0xff;
- CS88=1;
- P0=x_table[x[j]];
- CS88=0;
- P0=0x00;
- delay(1); //延時1毫秒
- }
- }
- }
- void pause_she() interrupt 0 //暫停,獨立按鍵k3
- {
- int speed=100,j;
- while(speed--)
- { for(j=0;j<n;j++)
- {
- du=1; //消去鬼影
- P0=0x00;
- du=0;
- P0=0xff;
- CS88=1;
- P0=0xff;
- CS88=0;
- P0=0x00;
- du=1;
- P0=y_table[y[j]];
- du=0;
- P0=0xff;
- CS88=1;
- P0=x_table[x[j]];
- CS88=0;
- P0=0x00;
- delay(1); //延時1毫秒
- }
- }
-
- }
- void T0_time() interrupt 1 //每50ms掃描一次按鍵
- {
- ET0=0; //先關閉定時器0中斷
- TR0=0; //關閉定時器0
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256; //重裝初值 ,掃描結束后再打開定時器0
- if(!left)
- {
- addy=0;
- addx=-1;
- }
- if(!right)
- {
- addy=0;
- addx=1;
- }
- if(!up)
- {
- addx=0;
- addy=1;
- }
- if(!down)
- {
- addx=0;
- addy=-1;
- }
- ET0=1; //打開定時器0中斷
- TR0=1; //啟動定時器0
- }
- void main()
- {
- TMOD=0x01; //設置定時器0的工作方式1
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256; // 每50ms就申請中斷一次
- EA=1;
- EX0=1; //開外部中斷0
- ET0=1; //打開定時器0中斷
- TR0=1; //啟動定時器0
- while (1) //主循環
- {
-
- int speed=80;
- int i,again;
- du=0; //關點陣的行,即y
- we=0; //關數碼管
- CS88=0; //關點陣的列,即x
-
- /*****初始化*****/
- n=4; //蛇長為n-1,開始的時候蛇長為2
- x[1]=3;
- y[1]=6; //x[1],y[1],固定放置蛇頭
-
- x[2]=4;
- y[2]=6;
-
- x[3]=5;
- y[3]=6; //放置蛇尾
-
- x[0]=2;
- y[0]=2; //放置果實
-
- addx=0;addy=0;
- while(1)
- {
- display(n,speed); //顯示
- if(knock())
- {
- speed=80;
- break;
- } //判斷碰撞
- if((x[0]==x[1]+addx)&(y[0]==y[1]+addy)) //是否吃東西
- {
- n++;
- if(n==21)
- {
- speed=80;
- break;
- }
- do
- { x[0]=rand()%8;y[0]=rand()%8;//產生隨機果實
- again=0;
- for(i=1;i<n;i++) //判斷是否與蛇身重疊
- { if((x[0]==x[i])&(y[0]==y[i]))
- again=1; }
- }while(again); //若重疊則再次產生
- }
- for(i=n-1;i>1;i--)
- {
- x[i]=x[i-1];
- y[i]=y[i-1];
- }
- x[1]=x[2]+addx;y[1]=y[2]+addy; //移動
- }
- }
- }
復制代碼
|