C语言小项目——小游戏贪吃蛇的实现
时间:2024-04-28 16:40:16 来源:网络cs 作者:纳雷武 栏目:卖家故事 阅读:
一、Win32API处理控制台界面
1.设置控制台界面大小以及控制台标题
我们可以使用mode命令来设置控制台的大小,使用title命令来设置控制台标题。在C语言中调用库函数system来使用这些作用于控制台的命令。使用代码如下:
采用该命令后控制台界面大概如下:
2.定位光标位置以及隐藏光标
控制台坐标系以控制台左上角为原点从上往下y轴坐标增大,从左往右x轴坐标增大。GOORD是一个结构体表示一个字符在控制台的坐标。GetStdHandle是⼀个WindowsAPI函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备。GetConsoleCursorInfo检索有关指定控制台屏幕缓冲区的光标⼤⼩和可⻅性的信息。那么我们可以将定位光标坐标封装为一个函数 如下:
二、蛇身的定义以及维护
1.蛇身的定义
我们采用链表来定义蛇,可以使用一个结构体定义蛇身一个节点的x坐标以及y坐标,使用链表链接。具体如下:
2.蛇的维护
同样利用结构体,定义出蛇头的位置,食物的位置以及蛇的运动方向,蛇本身的状态,蛇每次运动的休眠时长,每个食物的分值,玩家的得分。 其中蛇的运动方向以及本身的状态可以通过枚举变量的方法来定义。具体实现如下:
三、游戏的开始界面
1.打印欢迎界面
欢迎界面的打印主要在于将光标定在一个合适的位置,让打印变得好看些,还有pause命令的使用,这点较为简单不过多赘述。实现代码如下:
2.地图的打印
为了降低代码维护难度,我们可以在头文件中定义墙的符号,蛇身的符号以及代表食物的符号。如下:
首先要使用setlocale将C语言环境改为本地环境,支持打印宽字符。然后将符号打印为宽字符。具体打印过程如下:
3.初始化蛇
为降低代码维护难度我们将第一个节点的坐标定义在头文件:
然后采用链表的头插的方法将每个节点链接在一起,然后打印出蛇身,再将蛇的状态设置好。
4.初始化食物位置
由于食物的位置是随机的,所以食物的坐标可以使用rand函数来取随机值,那么主函数要调用一次srand函数:
然后为保证食物在地图里面且能被蛇吃掉我们x坐标必须是二的倍数且取值范围在2-54,y坐标在1-25。然后将食物打印出来:
5.帮助信息的打印
也就是游戏的操作问题,找一个合适的位置打印即可。
然后游戏的开始界面就实现完毕了:
四、游戏的运行
1.得分信息的打印以及蛇运动的方向
得分信息的打印跟上面帮助信息一样,找个合适的时间打印即可,蛇的运动方向的改变我们可以使用do...while循环来实现。其中于我们的按键有关,GetAsyncKeyState函数可以检测按键,如果按了最低位为1否则为0,我们可以在头文件定义一个宏来实现对按键的判断。
2.按下空格时的暂停
写一个死循环让它一直停止直到再次按下空格即可:
3.蛇的运动
根据蛇的运动方向获取蛇头的下一个位置的坐标,然后如果下一个位置有食物的话蛇身变长,没有食物将原来蛇的最后一个节点打印为空格,总长度不变。每走一步判断一次蛇是否死亡。具体实现过程如下:
(1)下个位置有无食物的判断及蛇身变化
下个位置是否是食物直接比较坐标即可,实现代码如下:
如果是食物的话就是吃食物,就是蛇身加长然后再次在地图上更新一个食物:
没有食物就是继续往下走,将原来蛇身最后一个节点打印为空格:
(2)蛇是否死亡的判断
蛇死亡有两种情况:第一是撞墙死亡,还有就是蛇头撞到蛇身的任一坐标。知道这两点之后实现起来就很简单:
五、游戏结束
游戏结束分三种情况:第一为正常结束,也就是玩家按下ESC键结束。第二种是撞到自己最后一种是撞到墙。结束后将蛇身的每个节点释放了即可。
在写完每个函数接口后,我们在主函数调用即可,为保证玩家能够多次游玩,我们可以用一个循环来实现,然后用getchar来接收玩家每次开始输入的字符。
到这里我们贪吃蛇的实现就完成了,也可以有更多别的功能待大家发掘。如果有问题可以评论哦,博主看到必回的。
阅读本书更多章节>>>>
本文链接:https://www.kjpai.cn/gushi/2024-04-28/163292.html,文章来源:网络cs,作者:纳雷武,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!
上一篇:Nginx正则表达式
下一篇:返回列表