目录
前言
我们上节实现了贪吃蛇四方向走位,但是出现了一些不合理的走位,比如说身体节点和头节点重合等等,本节我们便来解决这个问题。
我们希望贪吃蛇撞到自身时游戏会重新开始,并且贪吃蛇的运动方向不能与上一秒的运动方向相反,即贪吃蛇的身体节点不能重合。
解决方式
对于我们上节宏定义的四个方向需要改变其值,为了更好的以绝对值的方式判断方向。
#define UP 1#define DOWN 2
#define LEFT 3
#define RIGHT 4
修改后:
#define UP 1
#define DOWN -1
#define LEFT 2
#define RIGHT -2
我们这样修改的目的是:之前我们改变方向的时候是通过change()函数,只要我们有按键被按下的时候就改变他的方向,现在我们封装一个函数turn()来判断不合理走位。
cpp
void turn()
{
int direction;
if(dir != abs(dir))
{
dir = direction;
}
}
这个函数用来判断贪吃蛇的走位是否合理,如果按下的按键方向和之前运动的方向相反,那么就不执行,那么我们就解决了贪吃蛇的一个不合理走位了。
cpp
void turn(int direction)
{
if(abs(dir) != abs(direction))
{
dir = direction;
}
}
void* changeDir()
{
while (1)
{
key = getch();
switch (key)
{
case 0402:
turn(DOWN);
break;
case 0403:
turn(UP);
break;
case 0404:
turn(LEFT);
break;
case 0405:
turn(RIGHT);
break;
}
}
}
该文件默认名称为snake13.c
打开终端运行以下指令编译该文件
"gcc snake13.c -lcurses"
系统默认生成一个名为"a.out"的可执行文件,输入以下指令运行该文件
"./a.out"
运行效果
打开终端运行该程序,可以看出贪吃蛇已经正常运行,不会出现不合理的走位。
在Windows环境中可能会出现乱码,因为上下左右键作为相应键会返回出一些值出现在屏幕上导致乱码,我们只需要加上ncurses库里自带的函数即可。
(出现问题的友友这样修改就行了)
cpp
void initNcurse()
{
initscr();
keypad(stdscr,1);
noecho();
}
此时我们的贪吃蛇就不会出现不合理的走位了!
总结
我们本节解决了贪吃蛇不合理走位的问题,通过宏定义改变数值然后封装函数解决问题。