目录
前言
实现效果
支持方向变换
修改默认效果
如何修改
总结
前言
我们上节实现了不需要按下右键就可以是贪吃蛇自发的向右移动,本节我们主要来解决贪吃蛇方向移动和刷新界面所遇到的问题。
实现效果
上图是我们希望实现的效果,我们可以自发地控制贪吃蛇的移动。
支持方向变换
那么问题来了,我们想要支持控制方向变换,肯定要做一个while(1)循环,然而小蛇在运动的过程中是不断刷新链表节点的位置,也需要做一个while(1)循环。
我们先来看一下以前用来读取用户按键输入的代码:
int main()
{
int key;
initscr();
keypad(stdscr,1);
while (1)
{
key = getch();
switch (key)
{
case 0402:
printw("DOWN\n");
break;
case 0403:
printw("UP\n");
break;
case 0404:
printw("LEFT\n");
break;
case 0405:
printw("RIGHT\n");
break;
}
}
getch();//防止程序跳出
endwin();
return 0;
}
在这里我们通过定义'key'和'switch'语句来检测用户输入的是哪个按键,而我们上一节写的'snake10.c'里面也有'while(1)'循环不断的刷新界面(传送门:贪吃蛇自行向右移动)
int main()
{
int key;
initNcurse();
initSnake();
gamePic();
while(1)
{
moveSnake();
gamePic();
refresh();
usleep(100000);
}
while (1)
{
key = getch();
switch (key)
{
case 0402:
printw("DOWN\n");
break;
case 0403:
printw("UP\n");
break;
case 0404:
printw("LEFT\n");
break;
case 0405:
printw("RIGHT\n");
break;
}
}
getch();//防止程序退出
endwin();
return 0;
}
该程序默认为snake11.c
我们打开终端运行以下指令gcc snake11.c -lcurses
系统会默认生成一个可执行文件a.out
输入该指令运行该文件./a.out
修改默认效果
我们来看下运行效果
程序可以读取我们输入的按键,再回过头来看我们移动的封装函数。
void moveSnake()
{
addNode();
deleNode();
if(tail ->hang == 0 || tail->lie == 0 || tail->hang == 20 || tail ->lie == 20)
{
initSnake();
}
}
此函数里面套用了addNode()用来添加节点,因为贪吃蛇本质是以链表方式存在,我们来看向addNode()。
void addNode()
{
struct Snake * new = (struct Snake *)malloc(sizeof(struct Snake));
new->hang = head->hang;
new->lie = tail->lie+1;
new->next = NULL;
tail->next = new;
tail = new;
}
该函数本质是:向右加一个节点,并没有方向的概念。
在尾节点插入新的节点,然后把头节点删掉,就实现了贪吃蛇向右移动一格的效果。
如何修改
那我们想真正地实现贪吃蛇移动的效果应该怎么做呢?
原先的代码里有两个while(1)循环,我们都知道while(1)是死循环,当程序进入第一个循环后就一定不会进入第二个循环。
int main()
{
int key;
initNcurse();
initSnake();
gamePic();
while(1)
{
moveSnake();
gamePic();
refresh();
usleep(100000);
}
while (1)
{
key = getch();
switch (key)
{
case 0402:
printw("DOWN\n");
break;
case 0403:
printw("UP\n");
break;
case 0404:
printw("LEFT\n");
break;
case 0405:
printw("RIGHT\n");
break;
}
}
getch();//防止程序退出
endwin();
return 0;
}
我们下一节再来解决两个while(1)的同时进行!
总结
我们本节主要提出了关于贪吃蛇移动无法改变方向的问题。本节内容就到这里,提出的问 题会在下节解决,希望本期博客能对你有所帮助,同时发现错误请多多指正!