C语言小项目——小游戏贪吃蛇的实现

 一、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来接收玩家每次开始输入的字符。

 

到这里我们贪吃蛇的实现就完成了,也可以有更多别的功能待大家发掘。如果有问题可以评论哦,博主看到必回的。 

 

  • 64
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值