基于51單片機的8*8點陣貪吃蛇游戲
1、器件:51單片機、點陣、數碼管、三極管、按鍵等
2?梢岳鄯e分數
附上protues仿真、及程序
360截圖20180609135647302.jpg (101.35 KB, 下載次數: 39)
下載附件
2018-6-9 13:57 上傳
單片機源程序如下:
- #include <reg51.h>
- #include<stdlib.h>
- #define SNAKE 17 //最大長度
- #define TIME 50 //顯示延時時間
- #define SPEED 40 //速度控制
- //計分
- sbit sw=P3^0; //十位公共極
- sbit gw=P3^1; //個位公共極
- unsigned char tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x82,0xf8,0x80,0x90}; //個位
- 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]; //蛇身的坐標 行
- unsigned char y[SNAKE+1]; //蛇身的坐標 列
- unsigned char time,n,i,e; //延時時間,當前蛇長,通用循環變量,當前速度
- char addx,addy; // 移動方向,同直角坐標系,addx為橫向,addy為縱向
- bit again ;//再次產生果實變量,
-
- //延時程序
- 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;
- }
-
- }
- //判斷具體的亮點
- 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;
- }
- //顯示函數,按點從頭到尾掃描,周期為SNAKE,掃描k個周期運動一格
- void time0 (unsigned char k,unsigned char f) //顯示k次
- {
- while(k--)
- {
-
- for(i=0;i<SNAKE+1;i++) //掃描整個虛擬蛇身
- {
- P2=mux(x[i]); P0=255-mux(y[i]); //按點依次顯示
- turnkey(); //上下左右鍵位處理
- score(f); //顯示延遲
- P2=0x00; P0=0xff; //滅燈
-
- }
- }
- }
- void main(void)
- {
- unsigned char f=0; pause=1;
- e=SPEED; //給運動速度賦初值
- while(1)
- {
- for(i=3;i<SNAKE+1;i++) { x[i]=20; y[i]=20; } //初始化虛擬蛇身
-
- 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; //位移偏移
-
- 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) //如果蛇達到最大長度,進入下一關
- {
- n=3; e-=10; //蛇身長從2開始,運動加速
- for(i=3;i<SNAKE+1;i++) {x[i]=20; y[i]=20;} //初始化虛擬蛇身
- }
-
- 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); //若重疊則再次產生
-
- }
- if(pause)
- {
- 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; //蛇頭移動1格
- }
-
-
- }
-
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (45.75 KB, 下載次數: 46)
下載附件
2018-6-9 17:05 上傳
所有資料51hei提供下載:
共陽數碼管計分點陣貪吃蛇.rar
(63.87 KB, 下載次數: 102)
2018-6-9 13:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|