51单片机贪吃蛇

51单片机贪吃蛇,第1张

直接复制完整代码,里面带有完整注释
/*使用的说明

独立按键  k1,k2选择难度(改变循环次数来实现,因此数值越小移动越快)选完难度k3确定
按完k3矩阵的蛇才会出来,出来后蛇是暂停状态按任意方向键即可开始
当游戏结束重新开始的时候需要重新选难度在点开始有点麻烦,因此死后可以按k4直接重新开始次难度的游戏

矩阵的按键	中间的s11可以暂停游戏按任意方向键继续游戏
		    s7
		s10 s11 s12
			s15	
	数码管的第一个是难度,第八个是分数,
	由于51单片机结构的限制设置成了结束才显示分数,也可能是我的代码才菜了。。
*/

#include "REG52.H"

typedef unsigned char uchar;
typedef unsigned int uint ;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit SER=P3^4;
sbit rCLK=P3^5;
sbit SRCLK=P3^6;
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;

//我也不知道怎么解释,就是为了显示单个LED亮的数组。
uchar LED_x[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar LED_y[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
/*这里采用的是数组里面的内容存储坐标。
还有一个思路是用数组存储的内容代表坐标的内容。*/
uchar flag_x[32]={2,1,0};
uchar flag_y[32]={0};
//这个表示的是食物的坐标
uchar food_x=2;
uchar food_y=0;
//Long表示蛇的长度
uchar Long=3;
//move表示往哪个方向移动
uchar move=0;
//这个是调节速度用的可以根据按键修改flag_speed的值,改变循环的时间达到改变速度的目的
uchar flag_speed=40;
//为了方便大家查看每个函数是干嘛的我都在这里写了一下声明
void delay_10us(uint x);//10um延时函数
uchar key_move(uchar move);//检测是否有按键按下
void hc_595(uchar sum);//HC595芯片不用多解释了
void move_U();//蛇向上移(仅数据改变,led此时还没更新。)
void move_D();//蛇向下移
void move_L();//蛇向左移
void move_R();//蛇向右移
void LED_show();//LED显示函数
uchar validity();//检测是否结束游戏
void food();//生成食物
void key_speed();//调节速度
void display(uchar a);//LED显示

void main(){
	uchar i=0;
	uchar j=1;  
	uchar k=0;
	// TMOD = 0x11;
    // TH0  = 0xFC; 
    // TL0  = 0x67;
    ET0  = 1;   
    TR0  = 1;     
	TR1  = 1;     
	
	hc_595(0);
	while(K3){
		key_speed();
		display(1);
	}
	P0=0xFF;
	while(!move){
		LED_show();
		move=key_move(0);
	}
	food();
	while(1){
		if(validity()){
			uint t=3000;
			while(1){
				while(t--){
				P2=0;
				delay_10us(5);
				P2=0xFF;
				delay_10us(5);
				}
				t=0;
				display(0);
				if(!K4){
					//长度复位
					Long=3;
					//将蛇的位置复位
					for(t=0;t1;k--){
			LED_show();
			move=key_move(move);
			if(!(k%4)){
				P0=(LED_x[food_x]);
				hc_595(LED_y[food_y]);
				delay_10us(50);
				hc_595(0);
			}
		}
		switch(move){
			case 'U':move_U();break;
			case 'D':move_D();break;
			case 'L':move_L();break;
			case 'R':move_R();break;
		}
		//检测是否吃到了食物
		if(flag_x[0]==food_x&&flag_y[0]==food_y){
		Long++;
		food();
		}
	}
}
void delay_10us(uint x)		//@11.0592MHz
{
	uchar i;

	while(x--){
        i = 2;
	while (--i);
    }
}

uchar key_move(uchar move){
	uchar a=0xff;
	P1=0xf0;
	if(P1!=0xf0)delay_10us(10);
	if(P1!=0xf0){
		a=P1;
		P1=0x0f;
		if(P1!=0x0f)delay_10us(10);
		if(P1!=0x0f){
			P1+=a;
		}
	}
    if(P1==0XBD)move='U';
    if(P1==0XED)move='D';
    if(P1==0XDB)move='L';
    if(P1==0xDE)move='R';
    if(P1==0xDD)move=0;
	return move;
}

void hc_595(uchar sum){
	uchar i;
	rCLK=0;
	for(i=0;i<8;i++){
		SRCLK=0;
		SER=sum>>7;
		sum<<=1;
		SRCLK=1;
	}
	rCLK=1;
}

void move_U(){
	uchar i;
	for(i=Long;i>0;i--){
		flag_x[i]=flag_x[i-1];
		flag_y[i]=flag_y[i-1];
	}
	flag_y[0]--;
}
void move_D(){
	uchar i;
	for(i=Long;i>0;i--){
		flag_x[i]=flag_x[i-1];
		flag_y[i]=flag_y[i-1];
	}
	flag_y[0]++;
}
void move_L(){
	uchar i;
	for(i=Long;i>0;i--){
		flag_x[i]=flag_x[i-1];
		flag_y[i]=flag_y[i-1];
	}
	flag_x[0]--;
}
void move_R(){
	uchar i;
	for(i=Long;i>0;i--){
		flag_x[i]=flag_x[i-1];
		flag_y[i]=flag_y[i-1];
	}
	flag_x[0]++;
}

void LED_show(){
	uchar i;
	P0=0xFF;
	/*这个循环如果写成for(i=0;i=8||flag_y[0]>=8)return 1;
	//检测是否与自身重合
	for(i=1;i<=Long;i++){
	if(flag_x[0]==flag_x[i]&&flag_y[0]==flag_y[i])return 1;
	}
	return 0;
} 
void food(){
	uchar i,k;
	uchar food_flag=0;
	food_flag=0;
	while(1){
		k=1;
		food_x=TH1%8;
		food_y=TL1%8;
		for(i=0;i10&&!K1){
				flag_speed-=10;
				delay_10us(10);
				while(1)
					if(K1)break;
			}

			if(flag_speed<90&&!K2){
				flag_speed+=10;
				while(1)
					if(K2)break;
			}
		}
	}
}

void display(char a){
	uchar gsmg_code[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D
			,0x7D,0x07,0x7F,0x6F,0X00};
	if(a){
		P0=gsmg_code[flag_speed/10];
	}else{
		LSA=0;LSB=0;LSC=0;
		P0=gsmg_code[Long%10];
		delay_10us(10);
		P0=0x00;
		LSA=1;LSB=0;LSC=0;
		P0=gsmg_code[Long/10];
		delay_10us(12);
		P0=0x00;
	}
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/914624.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存