分享一个8X8点阵贪吃蛇 看图:
整体
按右键开始、
中间可以选择速度1最慢9最快(飞一般的感觉)
速度2和9
哎呀呀,自己撞死了(可以穿墙,撞到自己的身体死亡)
按中间确定可查看吃到了多少
暂停
单片机源程序:
- #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黑下载附件…………
复制代码
下载:
8x8点阵贪吃蛇.rar
(2.68 KB, 下载次数: 251)
|