基于51单片机的8*8点阵贪吃蛇游戏
1、器件:51单片机、点阵、数码管、三极管、按键等
2。可以累积分数
附上protues仿真、及程序
单片机源程序如下:
- #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黑下载附件…………
复制代码
所有资料51hei提供下载:
共阳数码管计分点阵贪吃蛇.rar
(63.87 KB, 下载次数: 102)
|