一.游戏逻辑概述
游戏完成图如图下所示:
根据游戏设定,需要实现的总体框架如下:
- 场景中有玩家可以操纵的初始角色-贪吃蛇
- 场景中有AI自动操作的敌人-敌对贪吃蛇
- 场景中的彩色圆点可以被敌人或者玩家吃掉,并且增加分数
- 玩家触碰到敌人,或者场景地图边界,游戏失败
大体框架就如上面所示,后面我们将针对各个要点进行详细的要点拆分。
二.初始化
(一).地图和玩家视角
首先我们应该清楚地图大小和玩家视角大小的区别,方便我们后面使用:
程序中我们可以随意设定玩家可视区域与地图总大小,本文就按照以下所示大小,各位也可以自行修改:
(二).角色外观以及坐标设定
接下来需要对玩家角色、AI敌人进行初始化,根据游戏设定,不管是玩家可操纵的角色,还是AI自己操纵的角色,都只不过是好几个圆叠加在一起的:
知道之后我们就好办了,直接使用esayX中的画圆函数就好了:
根据easyX文档的函数,画圆就需要传入坐标值(x,y)以及圆的半径,所以我们可以定义一个结构体,定义角色的坐标、半径以及颜色等变量:
我们的角色需要很多个圆叠在一起,且我们的圆会随着吃掉敌人、食物会变得越来越长,所以需要一维数组(存储头部和尾巴的坐标、半径以及颜色的实际数据)来存储这些长度数据:
我们的角色设定初始长度(比如是5)后,需要怎么将这5个圆连着画在一起呢,请看下方定义图示:
如此便会得到以下的样子(图示需要后面才能看得见,前期初始化看不见,这里只是显示让你看一看长啥样子):
代码如下:
PS:上述的坐标值、半径可以按照自己的意愿随便设定。
本人喜欢两两圆形交替,显示如下:
而AI敌人的设定与我们玩家角色的设定基本一致可以直接沿用相同的结构体,不同的是AI敌人不只是一个,而是有很多很多个,所以AI敌人的数据应该用二维数组来存储,一维表示AI的数量,二维表示每个AI敌人的坐标、半径以及颜色:
这里的二维数组中的一维数组【99】就是指99个AI敌人,当然,你也可以设定一个全局变量用来专门管理AI敌人的数量:
初始化操作就和我们玩家的一样,区别就在于AI的坐标值是随机的,这时候就要用上随机函数:
AI初始化代码如下:
最后是遍布满地的食物,玩家/AI碰到之后可以增加相应的分数,我们同样用一个变量“food_num”来存储食物的数量,然后初始化它:
三.场景绘制
完成初始化后,我们就可以进行场景的绘制了。
(一).背景绘制
首先是绘制背景,本次讲使用easyX图形库的SetWorkingImage()函数设置画布,cleardevice()函数清空当前画布,setbkcolor()函数设置当前画布背景色,setlinecolor()函数设置画线颜色,最后使用line()函数进行画线操作,更加详细函数说明请参考easyX官方说明文档(https://docs.easyx.cn/zh-cn/):
然后你就能得到一个这样的背景:
(二)食物绘制
紧接着,将先前初始化的食物也显示出来,使用easyX图像库中的setfillcolor()函数填充圆形颜色,然后使用solidcircle()函数画圆:
然后你就能得到以下这个食物:
(三)玩家角色绘制
然后是玩家可操控的角色绘制,使用到的函数和上面的一样的,不再赘述:
效果图如下:
(四)AI敌人绘制
再来就是AI敌人了,依旧是上面那些函数:
效果图如下所示:
(五)其他杂项
最后,我们在玩家角色上方显示对应的长度以及分数,使用到easyX图形库中的settextcolor()函数改变文本颜色,swprintf_s()函数获取数据输入,setbkmode()函数设置当前设备图案填充和文字输出时的背景模式,settextstyle()函数设置字体,outtextxy()函数在指定位置显示文本:
效果图如下:
最后限制一下玩家视角,以防越界:
至此,显示部分已全部准备就绪,我们需要将上面的内容全部显示在画布上,并且输出到窗口:
四.显示
万事俱备,只欠东风,搞了这么久,我们终于可以运行看一下我们的成果了,我们直接在main函数中使用easyX图形库的initgraph()函数(该函数需要结合closepraph()函数使用)初始化画布,然后BeginBatchDraw()函数(该函数需要结合FlushBatchDraw()函数使用)开始绘图,不懂函数用法的建议查看easyX图形库官方文档,不在此赘述,以下是代码参考:
在下一篇文章中,我们将会让AI敌人全部动起来,并且加入玩家键盘操控,得分机制等完善游戏体验。