51单片机贪吃蛇程序

51单片机贪吃蛇程序

#include <reg51.h>#define uchar unsigned char#define SNAKE 30 //最大长度#define TIME 50 //显示延时时间#define SPEED 255 //速度控制sbit down=P2^2; //定义四个方向键sbit up=P2^1;sbit left=P2^3;sbit right=P2^0;uchar x[SNAKE+1];uchar y[SNAKE+1]; uchar time,n,i,e; //延时时间,当前蛇长,通用循环变量,当前速度 char addx,addy; //位移偏移量/延时程序*/void delay(char MS){char us,usn;while(MS!=0){usn = 0;while(usn!=0){us=0xff;while (us!=0){us–;};usn–;}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(!left){addy=0;if(addx!=1)addx=-1; else addx=1;}if(!right){addy=0;if(addx!=-1)addx=1; else addx=-1;}if(!up){addx=0;if(addy!=-1)addy=1; else addy=-1;}if(!down){addx=0;if(addy!=1)addy=-1; else addy=1;}}/乘方程序/uchar mux(uchar temp) {if(temp7)return 128;if(temp6)return 64;if(temp5)return 32;if(temp4)return 16;if(temp3)return 8;if(temp2)return 4;if(temp1)return 2;if(temp0)return 1;return 0;}/显示时钟 显示程序/void timer0(uchar k){while(k–){for(i=0;i<SNAKE+1;i++){P0=mux(x[i]);P1=255-mux(y[i]);turnkey(); //上下左右键位处理delay(TIME); //显示延迟P0=0x00;P1=0xff; //关闭显示 } }} /主程序/ void main(void){ P1 = 0xff; //P0,P1端口设置为推挽工作模式,目的是增加亮度 P1 = 0x00; //由于亮度较高,工作电流大,单片机可能会损坏! P0 = 0xff; P0 = 0x00;e=SPEED; P0=0x00; //设置端口上电后的状态 P1=0xff; P2=0xff;while(1){ for(i=3;i<SNAKE+1;i++)x[i]=100;for(i=3;i<SNAKE+1;i++)y[i]=100;//初始化 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){break;timer0(1);} while(1){ timer0(e); if(knock()){e=SPEED;break;} //判断碰撞 if((x[0]==x[1]+addx)&(y[0]y[1]+addy)) //是否吃东西 {n++; if(nSNAKE+1) {n=3;e=e-10; for(i=3;i<SNAKE+1;i++)x[i]=100; for(i=3;i<SNAKE+1;i++)y[i]=100; } x[0]=x[n-2]; y[0]=y[n-2]; } 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; //移动 } } }

猜你喜欢

转载自blog.csdn.net/weixin_45442198/article/details/118675112