|
基于51單片機(jī)的8*8點(diǎn)陣貪吃蛇游戲
1、器件:51單片機(jī)、點(diǎn)陣、數(shù)碼管、三極管、按鍵等
2。可以累積分?jǐn)?shù)
附上protues仿真、及程序
360截圖20180609135647302.jpg (101.35 KB, 下載次數(shù): 39)
下載附件
2018-6-9 13:57 上傳
單片機(jī)源程序如下:
- #include <reg51.h>
- #include<stdlib.h>
- #define SNAKE 17 //最大長(zhǎng)度
- #define TIME 50 //顯示延時(shí)時(shí)間
- #define SPEED 40 //速度控制
- //計(jì)分
- sbit sw=P3^0; //十位公共極
- sbit gw=P3^1; //個(gè)位公共極
- unsigned char tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x82,0xf8,0x80,0x90}; //個(gè)位
- unsigned char tab2[]= {0xc0,0xf9,0xa4,0xb0}; //十位
- sbit pause=P3^7;
- //定義方向
- sbit left=P3^3;
- sbit down=P3^4;
- sbit right=P3^5;
- sbit up=P3^6;
- unsigned char x[SNAKE+1]; //蛇身的坐標(biāo) 行
- unsigned char y[SNAKE+1]; //蛇身的坐標(biāo) 列
- unsigned char time,n,i,e; //延時(shí)時(shí)間,當(dāng)前蛇長(zhǎng),通用循環(huán)變量,當(dāng)前速度
- char addx,addy; // 移動(dòng)方向,同直角坐標(biāo)系,addx為橫向,addy為縱向
- bit again ;//再次產(chǎn)生果實(shí)變量,
-
- //延時(shí)程序
- void delay(char MS)
- {
- while(MS--)
- ;
- }
- //判斷碰撞
- 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()
- {
- if(right==0) {addy=0; if(addx!=-1) addx=1; else addx=-1;}
- if(left==0) {addy=0; if(addx!=1) addx=-1; else addx=1;}
- if(down==0) {addx=0; if(addy!=1) addy=-1; else addy=1;}
- if(up==0) {addx=0; if(addy!=-1) addy=1; else addy=-1;}
- }
-
- void score(unsigned char j)
- {
- if(j<40)
- { P1=tab1[j%10];
- gw=1;
- delay(TIME+10) ;
- gw=0;
-
- P1=tab2[j/10];
- sw=1;
- delay(TIME+10);
- sw=0;
- }
-
- }
- //判斷具體的亮點(diǎn)
- char mux(unsigned char 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;
- }
- //顯示函數(shù),按點(diǎn)從頭到尾掃描,周期為SNAKE,掃描k個(gè)周期運(yùn)動(dòng)一格
- void time0 (unsigned char k,unsigned char f) //顯示k次
- {
- while(k--)
- {
-
- for(i=0;i<SNAKE+1;i++) //掃描整個(gè)虛擬蛇身
- {
- P2=mux(x[i]); P0=255-mux(y[i]); //按點(diǎn)依次顯示
- turnkey(); //上下左右鍵位處理
- score(f); //顯示延遲
- P2=0x00; P0=0xff; //滅燈
-
- }
- }
- }
- void main(void)
- {
- unsigned char f=0; pause=1;
- e=SPEED; //給運(yùn)動(dòng)速度賦初值
- while(1)
- {
- for(i=3;i<SNAKE+1;i++) { x[i]=20; y[i]=20; } //初始化虛擬蛇身
-
- x[0]=4; y[0]=4; //果子位置
- n=3; //起始蛇長(zhǎng) n-=1
- x[1]=1; y[1]=0; //蛇頭
- x[2]=0; y[2]=0; //蛇尾1
-
- addx=0; addy=0; //位移偏移
-
- while(1)
- {
- time0(e,f) ;
-
- if( knock() ) { e=SPEED;break; } //判斷碰撞
- if( (x[0]==x[1]+addx) & (y[0]==y[1]+addy) ) //如果吃到東西
- {
- if(f<40) { f++; score(f); } //加分
- else f=0;
- n++; //蛇身加1
- if(n==SNAKE+1) //如果蛇達(dá)到最大長(zhǎng)度,進(jìn)入下一關(guān)
- {
- n=3; e-=10; //蛇身長(zhǎng)從2開(kāi)始,運(yùn)動(dòng)加速
- for(i=3;i<SNAKE+1;i++) {x[i]=20; y[i]=20;} //初始化虛擬蛇身
- }
-
- do //產(chǎn)生果實(shí)
- {
- x[0]=rand()%8;y[0]=rand()%8;//產(chǎn)生隨機(jī)果實(shí)
- again=0;
- for(i=1;i<n;i++) //判斷是否與蛇身重疊
- if((x[0]==x[i])&(y[0]==y[i])) again=1;
- }while(again); //若重疊則再次產(chǎn)生
-
- }
- if(pause)
- {
- for(i=n-1;i>1;i--) //蛇身從尾到頭移動(dòng)
- {x[i]=x[i-1];y[i]=y[i-1];}
- x[1]=x[2]+addx; y[1]=y[2]+addy; //蛇頭移動(dòng)1格
- }
-
-
- }
-
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png (45.75 KB, 下載次數(shù): 46)
下載附件
2018-6-9 17:05 上傳
所有資料51hei提供下載:
共陽(yáng)數(shù)碼管計(jì)分點(diǎn)陣貪吃蛇.rar
(63.87 KB, 下載次數(shù): 102)
2018-6-9 13:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|