📄 snake.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 + -