在 《C语言推箱子游戏演示和说明》一节中,我们对推箱子游戏的玩法进行了介绍和演示,这节就来分析一下它的源码。推箱子源代码百度网盘下载地址:
各位读者不妨先将源码下载下来浏览一遍,记住关键的几个函数,整理一下不了解的知识点,做到心中有数。
下面请各位读者先学习一下该游戏中涉及到的几个关键知识点,有了这些必备条件,我们才好讲解推箱子游戏的设计思路。
推箱子游戏中的边框是灰色的,小人是湖蓝色的,箱子是淡红色的,星星是黄色的,等等这些涉及到如何改变文本的输出颜色,请大家猛击《彩色版的C语言》了解详情。
推箱子游戏中,人在移动过程中,必须能够及时捕获用户按下的方向键,并改变移动方向,具体是如何做到的,请大家猛击《C语言非阻塞式键盘监听》了解详情。
推箱子游戏的地图,由于是二维结构,所以采用二维数组进行存储,再合适不过。
具体方案是采用整形数组设计地图,地图中不同的道具,用不同的数字表示:
如下的 map_1 这个二维数组,记录的就是第一关卡地图所对应的初始数据:
int map_1[10][10] = {
{ 0,0,1,1,1,0,0,0 },
{ 0,0,1,4,1,0,0,0 },
{ 0,0,1,0,1,1,1,1 },
{ 1,1,1,0,0,2,4,1 },
{ 1,4,2,2,0,1,1,1 },
{ 1,1,1,3,2,1,0,0 },
{ 0,0,0,1,4,1,0,0 },
{ 0,0,0,1,1,1,0,0 }
};
地图中的道具分别用不同的数字表示完成后,当输出到窗口上时,可对二维数组进行加工,即用适当的字符代替不同的数字:
需要说明的是:所有的字符都不是普通字符,都为特殊字符,每个特殊字符占用 2 个普通字符的位置(一个特殊“空格”可用两个普通空格来表示)。
除了以上几种情况外,在游戏过程中,还有可能出现以下几种情况,仍需要使用不同的数字表示:
综上所述,实现代码可见分享给大家的源码中的 render() 函数。
代码中,设定地图的最大规格为 10*10,在显示时,只需遍历整个二维数组,不同的数字采用不同的字符表示,同时赋予每个字符不同的颜色(color() 函数的作用就是赋予字符颜色),最终的效果如图所示:
整个游戏过程中,玩家时刻都是在控制人物的移动,所以,程序中应为人物为出发点,采用穷举法罗列出所有由于人物移动而导致的情况。
另外,人物在移动过程中,无论人物是向哪个方向移动,程序中都可归为一种情况,那就是:人物在向前移动。
当人物向前移动之前,首先根据人物当前所在的位置不同,分为两种情况:
如下图所示,即使是在第 1 种情况下,由于人物前方道路状况不同,处理方案也不一样:
以上仅是第一种情况下,面临的 6 种可能。当人物位于箱子的目标位置时,也同样面临以上 6 种情况。每种情况的处理方案中,同第一种情况不同的是,人物移动后,原位置应恢复为箱子的目标位置,对应的数字为 4。
以上 12 种情况,及各自的处理方案的具体实现,可见源码中的 move() 函数,其中附带有详细的代码注释。