首先我们要知道蛇身向右移动的原理:
当蛇向右移动一个单位的时候,头部要加一个身子,尾部要减少一个身子,循环遍历就能实现蛇身向右移动了。我们来看代码:
首先定义一个con变量,来接受键盘的输入,在main函数中,进入循环语句,当我们接收到键盘向右的指令(con == KEY_RIGHT)时,我们执行移动蛇身的函数,函数很简单,就是头部增加一个身子,尾巴减少一个身子,即:
void MoveSnake(){
addnode();
deletnode();
}
addnode函数在上篇文章中提到过了,接下来我们构建deletnode()函数:
void deletnode(){
struct Snake *p;
p = head; //接受首地址
head = head->next; //直接将首地址的下一个地址赋值给head就可以删除头部
free(p);//在删除后我们应该使用free语句来释放,避免空间占用;
}
在main函数中我又重新调用了Gamepic()函数,原因是因为如果不重新调用刷新游戏界面,可能代码已经运行了,但是却还是没有显示变化,所以需要调用Gamepic()刷新游戏界面,大家可以尝试一下将Gamepic注释掉,验证一下。将代码修改完整后,我们验证一下,可以得到下面的结果:
从上图可以看到,我们的蛇身虽然向右移动了,但是我们移动的图在下面,我们更倾向于向右移动后的图将之前的图覆盖,产生这样的原因是什么呢?
这主要是由于ncurses中,printw主要是看光标的位置打印的,当我们打印一次之后,光标移动到了最底下,所以打印也从地下开始打印,我们可以通过使用ncurses中的move函数来将移动到初始位置(0,0),这样每次打印都能将上一次打印的覆盖了:
这样我们就能实现往右的循环了,验证一下:
好了,今天的内容就到这里了,大家一起加油哦~如果又看不懂的,可以看一下我之前的几篇文章~