基于點陣的貪吃蛇游戲設(shè)計
0.png (46.95 KB, 下載次數(shù): 122)
下載附件
2016-5-2 03:20 上傳
以上全部資料打包下載:
基于點陣的貪吃蛇游戲設(shè)計.zip
(538.51 KB, 下載次數(shù): 137)
2016-5-2 03:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
本題目要求設(shè)計一款貪吃蛇游戲,顯示器采用 8*8點陣,主控采用51單片機,如果開發(fā)板上有點陣可以直接在上面進行開發(fā)。
0.png (849.5 KB, 下載次數(shù): 147)
下載附件
2016-5-2 03:16 上傳
0.png (797.46 KB, 下載次數(shù): 108)
下載附件
2016-5-2 03:16 上傳
基本要求: 1、屏幕能夠顯示出一條蛇,并且能夠通過按鍵控制其移動。 2、能夠隨機產(chǎn)生食物。 3、完成上面兩個要求的前提下,實現(xiàn)完整的游戲功能。 提高: 1、實現(xiàn)難度選擇功能。 2、加入關(guān)卡機制。 3、用鏈表或者隊列這類高級數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)程序功能。
參考電路:
0.png (82.33 KB, 下載次數(shù): 97)
下載附件
2016-5-2 03:18 上傳
0.png (26.8 KB, 下載次數(shù): 91)
下載附件
2016-5-2 03:18 上傳
0.png (104.22 KB, 下載次數(shù): 118)
下載附件
2016-5-2 03:19 上傳
點陣: 實際元件中,點陣的封裝不盡相同,因此需要測試出每個引腳的功能,以便正確連線。 注意,每個像素點的額定電壓在3v左右,電壓過大將會徹底損壞。 點陣的驅(qū)動方法和數(shù)碼管一樣,通過動態(tài)掃描來顯示。驅(qū)動電路可以照搬數(shù)碼管,也可以直接接在單片機的IO口上,不過顯示亮度將會受到影響。
按鍵: 略。。
參考程序: 游戲的邏輯結(jié)構(gòu)大體都差不多,主要考驗大家和硬件結(jié)合的能力。
編程的過程中大家不可避免的會遇見很多困難,希望大家多多堅持,越過這道坎后相信大家的能力也會提升不少。最后祝大家編程愉快!
部分源碼預(yù)覽(完整版本請下載附件):
- /*************8*8點陣 貪吃蛇 ***************.****/
- /*****定義的坐標(biāo)原點在左下角(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]; //存放蛇身 + 食物 行、列坐標(biāo)
- 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; //先關(guān)閉定時器0中斷
- TR0=0; //關(guān)閉定時器0
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256; //重裝初值 ,掃描結(jié)束后再打開定時器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; //設(shè)置定時器0的工作方式1
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256; // 每50ms就申請中斷一次
- EA=1;
- EX0=1; //開外部中斷0
- ET0=1; //打開定時器0中斷
- TR0=1; //啟動定時器0
- while (1) //主循環(huán)
- {
-
- int speed=80;
- int i,again;
- du=0; //關(guān)點陣的行,即y
- we=0; //關(guān)數(shù)碼管
- CS88=0; //關(guān)點陣的列,即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;//產(chǎn)生隨機果實
- again=0;
- for(i=1;i<n;i++) //判斷是否與蛇身重疊
- { if((x[0]==x[i])&(y[0]==y[i]))
- again=1; }
- }while(again); //若重疊則再次產(chǎn)生
- }
- 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; //移動
- }
- }
- }
復(fù)制代碼
|