⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snake.c

📁 单片机控制实现几个小游戏:贪吃蛇、俄罗斯方块、推箱子
💻 C
字号:
#ifndef __snake_C__
#define __snake_C__

void snake(void)
{
currspeed=SNAKE_SPEED;	//游戏速度初始化
LED_UEN_012;//显示器2初始化
addspeed=0;				//速度控制初始化
total_NO=0;				//分数初始化
display_LED_total_NO();
n=3;					//初始化蛇长
display_cmd(DISPLAY_CMD_CLR,NULL);	//清空显示缓冲区
//display_LED_total_NO(total_NO);	//初始化分数显示
snake_x[0]=rand()%16;snake_y[0]=rand()%16;	//初始化果子
snake_x[1]=1;snake_y[1]=0;					//初始化蛇头
snake_x[2]=0;snake_y[2]=0;					//初始化蛇尾
displaybuffer_16mux16[0]=0x0003;			//初始化显示
addx=0;addy=1;							//初始化开始位移
while(1)
	{uint8_t i;
	if(keyenable)addspeed=0;				//若按键没有按下恢复正常速度
	delay_long(currspeed-addspeed);			//游戏速度控制
	while(stop_game);						//停止
	if((snake_x[0]==snake_x[1]+addx)&(snake_y[0]==snake_y[1]+addy))//是否吃东西
		{(n)++;					//蛇长度增加
		total_NO++;					//加分
		if(n==SNAKE_LEN+1)			//是否过关
			{
			n=3;currspeed=currspeed-10000;total_NO+=10;	//缩短蛇身,加速,加分
			}
		display_LED_total_NO();//显示分数
		//make_sound();				//吃东西发声
		snake_x[0]=rand()%16;snake_y[0]=rand()%16;		//生成新果子
		}
	for(i=SNAKE_LEN;i>1;i--){snake_x[i]=snake_x[i-1];snake_y[i]=snake_y[i-1];}//蛇身位移速度修正
	snake_x[1]=snake_x[2]+addx;snake_y[1]=snake_y[2]+addy;//蛇移动
	if(knock())break;										//判断碰撞
	display_cmd(DISPLAY_CMD_CLR,0);						//清空显示缓冲区
	for(i=0;i<(n);i++)displaybuffer_16mux16[snake_y[i]]|=mux_int[snake_x[i]];//蛇身信息输入到显缓区
	for(i=n;i<SNAKE_LEN+1;i++)keywords|=mux_int[snake_x[0]];	//速度修正
	}
//当前游戏结束执行
//main_display();
display_cmd(DISPLAY_CMD_OVER,0);	//显示游戏结束
Current_game=DEFAULTS;	//等待游戏选择
stop_game=GANE_BEGIN;	//游戏不停止
LED_UEN_0123;//LED显示所有位
keywords=0;
}

void key_snake(void)//键盘处理函数 
{RA0=1;
switch(keywords)
{//若上次按键为向上,即使这次按向下,还是作为向上处理,防止倒退,其它类推	

	case UP:
		addx=0;if(addy!=-1)addy=1; else addy=-1;break;
	case DOWN :
		addx=0;if(addy!=1)addy=-1; else addy=1;break;
	case LEFT:
		addy=0;if(addx!=1)addx=-1; else addx=1;break;
	case RIGHT:
		addy=0;if(addx!=-1)addx=1; else addx=-1;break;
	case OK:
		addspeed=-40999;break;
	case STOP:
		stop_game=~stop_game;
	default:
		break;
}
keywords=0;
}

int1_t knock(void)			//判断碰撞
{
uint8_t i;
if(snake_x[1]>15||snake_y[1]>15)return 1;						//是否撞墙
for(i=1;i<(n);i++)if((snake_x[1]==snake_x[i])&(snake_y[1]==snake_y[i])&i!=1)return 1;	//是否撞自己
for(i=n;i<SNAKE_LEN+1;i++)if((snake_x[1]==snake_x[i])&(snake_y[1]==snake_y[i])&i!=1)keywords=0;//速度修正
//速度修正 指的是无论蛇多长,所做的判断以及运算都尽量按最长处理,防止蛇越短处理越快
return 0;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -