欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > (C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题

(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题

2024/10/25 13:22:15 来源:https://blog.csdn.net/2303_79502195/article/details/142675452  浏览:    关键词:(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题

目录

前言

实现效果

支持方向变换

修改默认效果

如何修改

总结


前言

        我们上节实现了不需要按下右键就可以是贪吃蛇自发的向右移动,本节我们主要来解决贪吃蛇方向移动和刷新界面所遇到的问题。

实现效果

e83a1f78c87043c98d3201d66f30a0ad.png

上图是我们希望实现的效果,我们可以自发地控制贪吃蛇的移动。

支持方向变换

        那么问题来了,我们想要支持控制方向变换,肯定要做一个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

修改默认效果

我们来看下运行效果

db10d017d13c4266a512094dc58ae324.png

 程序可以读取我们输入的按键,再回过头来看我们移动的封装函数。

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)的同时进行!

总结

        我们本节主要提出了关于贪吃蛇移动无法改变方向的问题。本节内容就到这里,提出的问 题会在下节解决,希望本期博客能对你有所帮助,同时发现错误请多多指正!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com