分享一個8X8點陣貪吃蛇 看圖:
1.gif (774.22 KB, 下載次數: 90)
下載附件
2017-5-7 01:33 上傳
2.gif (765.4 KB, 下載次數: 108)
下載附件
2017-5-7 01:33 上傳
整體
0.png (302.1 KB, 下載次數: 85)
下載附件
2017-5-7 01:29 上傳
按右鍵開始、
中間可以選擇速度1最慢9最快(飛一般的感覺)
速度2和9
哎呀呀,自己撞死了(可以穿墻,撞到自己的身體死亡)
按中間確定可查看吃到了多少
暫停
0.png (565.96 KB, 下載次數: 71)
下載附件
2017-5-7 01:29 上傳
0.png (493.82 KB, 下載次數: 73)
下載附件
2017-5-7 01:30 上傳
0.png (527.82 KB, 下載次數: 78)
下載附件
2017-5-7 01:30 上傳
0.png (341.28 KB, 下載次數: 66)
下載附件
2017-5-7 01:30 上傳
0.png (327.97 KB, 下載次數: 73)
下載附件
2017-5-7 01:30 上傳
0.png (416.96 KB, 下載次數: 67)
下載附件
2017-5-7 01:30 上傳
0.png (365.71 KB, 下載次數: 90)
下載附件
2017-5-7 01:30 上傳
0.png (383.98 KB, 下載次數: 89)
下載附件
2017-5-7 01:31 上傳
0.png (382.58 KB, 下載次數: 88)
下載附件
2017-5-7 01:31 上傳
0.png (762.8 KB, 下載次數: 81)
下載附件
2017-5-7 01:31 上傳
0.png (661.57 KB, 下載次數: 78)
下載附件
2017-5-7 01:31 上傳
0.png (597.32 KB, 下載次數: 83)
下載附件
2017-5-7 01:31 上傳
0.png (485.42 KB, 下載次數: 79)
下載附件
2017-5-7 01:31 上傳
0.png (603.82 KB, 下載次數: 84)
下載附件
2017-5-7 01:32 上傳
0.png (394.33 KB, 下載次數: 95)
下載附件
2017-5-7 01:32 上傳
0.png (431.22 KB, 下載次數: 76)
下載附件
2017-5-7 01:32 上傳
單片機源程序:
- #include"reg52.h"
- sbit d=P2^4;
- sbit a=P2^0;
- sbit w=P2^2;
- sbit s=P2^6;
- sbit key=P2^7;
- unsigned char code n[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01},n0[8]={0x08,0x04,0x02,0x01,0x10,0x20,0x40,0x80};
- unsigned char snake[8][8],xmax,ymax,xmin,ymin,max=0,min=200,eat=0,ch='d',num=0,f=0,cun=0,food=1,hz=0,n1=0,v=2;
- void late(unsigned int i)
- {
- for(;i>0;i--);
- }
- void xian(unsigned char y0,unsigned char x0,unsigned char y1,unsigned char x1,unsigned char on)
- //在數組snake[][]中繪直線的函數,(x0,y0)to(x1,y1) on,0:off 1:長亮 2:以1:1亮滅時間比閃爍
- {
- char i,j,nx,ny;
- if(x0>x1)
- nx=-1;
- else if(x0==x1)
- nx=0;
- else
- nx=1;
- if(y0>y1)
- ny=-1;
- else if(y0==y1)
- ny=0;
- else
- ny=1;
- for(i=y0,j=x0;i!=y1+ny||j!=x1+nx;i=ny+i,j=nx+j)
- snake[j][i]=on;
- }
- void print(void)//把二維數組snake[][]轉換點陣的函數,數組某元素為0時,對應的led滅,1為亮,2為閃爍。(以后用多色led點陣時也可以用這種方法控制顏色)
- {
- unsigned char i,j;
- P3=0x00;
- P1=0x00;
- for(i=0;i<8;i++)
- {
- P3=0x00;
- P1=~n[i];
- for(j=0;j<8;j++)
- {
- if(snake[j][i]==1)
- {
- P3|=n0[j];
- }
- else if(snake[j][i]==2)
- {
- if(hz%125>=60)
- P3|=n0[j];
- else
- P3&=~n0[j];
- }
- else if(snake[j][i]==0)
- P3&=~n0[j];
- }
- late(10);
- }
- }
- void number(unsigned char su,unsigned char x,unsigned char y,unsigned char on,unsigned char in)
- { //在數組snake[][]從某坐標起繪數字的函數,on:顯示樣式,in:背景樣式
- xian(x+2,y,x+2,y+4,on);
- if(su==7||su==4||su==1)
- {
-
- if(su==7)
- xian(x,y,x+2,y,on);
- if(su==4)
- {
- xian(x,y,x,y+2,on);
- snake[y+2][x+1]=on;
- }
- }
- else
- {
- xian(x,y,x+2,y,on);
- if(su!=0)
- xian(x,y+2,x+2,y+2,on);
- xian(x,y+4,x+2,y+4,on);
- xian(x,y,x,y+4,on);
- switch(su)
- {
- case 5:snake[y+3][x]=in;
- case 6:snake[y+1][x+2]=in;break;
- case 9:snake[y+3][x]=in;break;
- case 2:snake[y+1][x]=snake[y+3][x+2]=in;break;
- case 3:snake[y+1][x]=snake[y+3][x]=in;
- }
- }
- }
- void main(void)
- {
- unsigned int i,j;
- TMOD=0x01;
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;//每10000微秒中斷一次(每0.01秒執行一次中斷函數)
- EA=1;
- ET0=1;
- TR0=1;
- //以上是有關時間中斷的設置
- start:
- P3=0x00;
- P1=0x00;
-
-
- f=1;
- cun=1;
- while(cun)//等待開始
- {
- n1++;
- if(n1==240)
- n1=0;
-
- for(i=0;i<8;i++)
- for(j=0;j<8;j++)
- snake[j][i]=0;
- switch(f)
- {
- case 1://主界面:開>
- xian(0,1,4,1,1);
- xian(0,3,4,3,1);
- xian(1,1,1,5,1);
- xian(3,1,3,6,1);
- xian(6,2,6,4,2);
- snake[3][7]=2;
- snake[6][0]=1;
- print();
- P3=0x00;
- P1=0x00;
- if(d==0)
- cun=0;
- break;
- case 2://選擇速度等級的界面
- number(v,2,1,1,0);
- snake[3][6]=2;
- snake[3][0]=2;
- if(d==0&&v<9)
- {
- v++;
- while(!d);
- }
- if(a==0&&v>1)
- {
- v--;
- while(!a);
- }
- print();
- }
- if(key==0)
- {
- while(!key);
- if(f==2)
- f=1;
- else
- f++;
- }
- }
- f=0;
- cun=0;
- for(i=0;i<8;i++)//snake[][]數組的初始化
- for(j=0;j<8;j++)
- snake[j][i]=100;//100代表空
- snake[0][0]=101;snake[0][1]=102;snake[0][2]=103;//大于100代表蛇身,其中最大值代表蛇頭,101代表蛇尾。
-
-
- for(;;)//游戲運行部分
- {
- for(i=0;i<8;i++)
- {
- P3=0x00;
- P1=~n[i];
- for(j=0;j<8;j++)
- {
- if(snake[j][i]>100)
- {
- P3|=n0[j];
- if(f==1&&eat==0)
- {
- snake[j][i]--;
- }
- }
- else if(snake[j][i]==100)
- P3&=~n0[j];
- else if(snake[j][i]==50)//值為50的點代表食物
- {
- cun++;//統計現在存在的食物數
- if(hz%25<10)
- P3|=n0[j];
- else
- P3&=~n0[j];
- if(hz>120)
- hz=0;
- //以上幾行:閃爍顯示食物
- }
- if(snake[j][i]>max)//以下:把蛇頭和蛇尾及其坐標找出來,以便后面對蛇移動的操作
- {
- max=snake[j][i];
- xmax=j;
- ymax=i;
- }
- if(snake[j][i]<min&&snake[j][i]>100)
- {
- min=snake[j][i];
- xmin=j;
- ymin=i;
- }
- }
- late(10);
- n1++;
- }
- if(f==1)
- f=0;
-
- if(d==0)//方向按鍵的識別
- {
- if(ch!='a')
- ch='d';
- }
- else if(a==0)
- {
- if(ch!='d')
- ch='a';
- }
- else if(w==0)
- {
- if(ch!='s')
- ch='w';
- }
- else if(s==0)
- {
- if(ch!='w')
- ch='s';
- }
- if(key==0)//暫停功能
- {
- while(!key);
- late(200);
- P1=~0x24;
- while(key)
- {
- if(hz%125>60)
- P3=n0[2]+n0[3]+n0[4]+n0[5];
- else
- P3=0x00;
- }
- while(!key);
- }
- //下面:食物坐標的生成(用以時間為種子的隨機數%8得到)
- if(cun<food)//如果存在的食物數<food
- {
- sui:
- i=hz%8;
- j=n1%8;
- if(snake[j][i]==100)//如果該坐標點為空(沒有蛇身,障礙物和食物)
- snake[j][i]=50;//該坐標點生成食物
- else //否則回到sui,重新生成食物坐標
- goto sui;
- }
- cun=0;//初始化食物數為0,以便下一次循環的統計
- if(num==0)
- {
- num=1;
- f=1;
- eat=0;
- switch(ch)
- {
- case 'a'://貪吃蛇左走
- if(ymax<1)
- {
- if(snake[xmax][ymax+7]>100)
- goto end;
- else if(snake[xmax][ymax+7]==50)
- {
- eat++;
- goto b72;
- }
- else
- b72:snake[xmax][ymax+7]=max+1;
- }
- else
- {
- if(snake[xmax][ymax-1]>100)
- goto end;
- else if(snake[xmax][ymax-1]==50)
- {
- eat++;
- goto o72;
- }
- else
- o72:snake[xmax][ymax-1]=max+1;
- }
- break;
- case 'd'://右走
- if(ymax+1>=8)
- {
- if(snake[xmax][ymax+1-8]>100)
- goto end;
- else if(snake[xmax][ymax+1-8]==50)
- {
- eat++;
- goto b80;
- }
- else
- b80:snake[xmax][ymax+1-8]=max+1;
- }
- else
- {
- if(snake[xmax][ymax+1]>100)
- goto end;
- else if(snake[xmax][ymax+1]==50)
- {
- eat++;
- goto o80;
- }
- else
- o80:snake[xmax][ymax+1]=max+1;
- }
- break;
- case 'w'://上走
- if(xmax<1)
- {
- if(snake[xmax+7][ymax]>100)
- goto end;
- else if(snake[xmax+7][ymax]==50)
- {
- eat++;
- goto b75;
- }
- else
- b75:snake[xmax+7][ymax]=max+1;
- }
- else
- {
- if(snake[xmax-1][ymax]>100)
- goto end;
- else if(snake[xmax-1][ymax]==50)
- {
- eat++;
- goto o75;
- }
- else
- o75:snake[xmax-1][ymax]=max+1;
- }
- break;
- case 's'://下走
- if(xmax+1>=8)
- {
- if(snake[xmax+1-8][ymax]>100)
- goto end;
- else if(snake[xmax+1-8][ymax]==50)
- {
- eat++;
- goto b77;
- }
- else
- b77:snake[xmax+1-8][ymax]=max+1;
- }
- else
- {
- if(snake[xmax+1][ymax]>100)
- goto end;
- else if(snake[xmax+1][ymax]==50)
- {
- eat++;
- goto o77;
- }
- else
- o77:snake[xmax+1][ymax]=max+1;
- }
- break;
- }
- max=0;min=200;
- }
-
- }
- end:
- f=0;
- while(key)//游戲結束,顯示“X”
- {
- xian(0,0,7,7,1);
- xian(0,7,7,0,1);
- print();
- }
- while(!key);
- for(i=0;i<8;i++)
- for(j=0;j<8;j++)
- snake[j][i]=0;
- while(key)//顯示游戲得分
- {
- number((max-103)/10,0,2,1,0);
- number((max-103)%10,4,2,1,0);
- print();
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (46.44 KB, 下載次數: 97)
下載附件
2017-5-7 01:34 上傳
下載:
8x8點陣貪吃蛇.rar
(2.68 KB, 下載次數: 251)
2017-5-6 22:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|