您当前的位置:首页 > 计算机 > 编程开发 > C语言

C语言推箱子游戏源码下载、源码解析和设计思路

时间:12-29来源:作者:点击数:

《C语言推箱子游戏演示和说明》一节中,我们对推箱子游戏的玩法进行了介绍和演示,这节就来分析一下它的源码。推箱子源代码百度网盘下载地址:

各位读者不妨先将源码下载下来浏览一遍,记住关键的几个函数,整理一下不了解的知识点,做到心中有数。

关键知识点

下面请各位读者先学习一下该游戏中涉及到的几个关键知识点,有了这些必备条件,我们才好讲解推箱子游戏的设计思路。

1) 改变输出文本的颜色

推箱子游戏中的边框是灰色的,小人是湖蓝色的,箱子是淡红色的,星星是黄色的,等等这些涉及到如何改变文本的输出颜色,请大家猛击《彩色版的C语言》了解详情。

2) 键盘监听

推箱子游戏中,人在移动过程中,必须能够及时捕获用户按下的方向键,并改变移动方向,具体是如何做到的,请大家猛击《C语言非阻塞式键盘监听》了解详情。

设置游戏地图

推箱子游戏的地图,由于是二维结构,所以采用二维数组进行存储,再合适不过。

具体方案是采用整形数组设计地图,地图中不同的道具,用不同的数字表示

  • 箱子所在的位置,用数字 2 表示;
  • 人所在的位置,用数字 3 表示;
  • 边框的位置,用数字 1 表示;
  • 箱子最终需到达的位置,用数字 4 表示;
  • 地图中可行的道路,可用数字 0 表示;

如下的 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 }
};

地图中的道具分别用不同的数字表示完成后,当输出到窗口上时,可对二维数组进行加工,即用适当的字符代替不同的数字:

  • 1 表示边框,可用 “■” 代替;
  • 3 表示人物,可用 ”♀” 代替;
  • 2 表示箱子,可用 “■” 代替;
  • 4 表示箱子要去的目标位置,可用 ”☆” 代替;
  • 0 表示道路,可用 “空格” 代替;

需要说明的是:所有的字符都不是普通字符,都为特殊字符,每个特殊字符占用 2 个普通字符的位置(一个特殊“空格”可用两个普通空格来表示)。

除了以上几种情况外,在游戏过程中,还有可能出现以下几种情况,仍需要使用不同的数字表示:

  1. 箱子到达目标位置 ”☆”  时,需要用不同的标志显示出来,证明箱子已经达到目标位置,程序中用“★”表示,对应的数字为 5;
  2. 人物到达有”☆” 的位置时,此时需要特殊标记,程序中用数字 6 表示这个特殊位置(图标没变)。人物移动后,此处再恢复成 ”☆”;

综上所述,实现代码可见分享给大家的源码中的 render() 函数。

代码中,设定地图的最大规格为 10*10,在显示时,只需遍历整个二维数组,不同的数字采用不同的字符表示,同时赋予每个字符不同的颜色(color() 函数的作用就是赋予字符颜色),最终的效果如图所示:

人物和箱子的移动

整个游戏过程中,玩家时刻都是在控制人物的移动,所以,程序中应为人物为出发点,采用穷举法罗列出所有由于人物移动而导致的情况。

另外,人物在移动过程中,无论人物是向哪个方向移动,程序中都可归为一种情况,那就是:人物在向前移动

当人物向前移动之前,首先根据人物当前所在的位置不同,分为两种情况:

  1. 当前人物位于道路上(即空格上),则当人物移动后,此位置应恢复为空格;
  2. 当前人物位于箱子要去的目标位置上,则当人物移动后,此位置要恢复为目标位置,而不是空格;

如下图所示,即使是在第 1 种情况下,由于人物前方道路状况不同,处理方案也不一样:

 
  • 第 1 种情况处理方案:人物移动后,原位置恢复为空格(即数字0),人物移动后位于空格上,所以该位置对应的数字为 3,箱子也向前一步,此时箱子位于空格上,所有该位置对应的数字为2。
  • 第 2 种情况处理方案:人物移动后,原位置恢复为空格,人物站在空格上,该位置对应的数字为 3,箱子向前一步,恰好对于目标位置处,对应的数字为 5。
  • 第 3 种情况处理方案:人物移动后,原位置恢复为空格,人物位于箱子的目标位置上,此位置对应的数字为 6,箱子向前一步,位于空格上,该位置对应的数字为 2。
  • 第 4 种情况处理方案:人物移动后,原位置恢复为空格,人物位于箱子的目标位置上,此位置对应的数字为 6,箱子向前一步,还是位于目标位置处,对应的数字还是 5。
  • 第 5 种情况处理方案:人物移动后,原位置恢复为空格,移动后的人物位于空格处,该位置对应的数字为 3。
  • 第 6 种情况处理方案:人物移动后,原位置恢复为空格,移动后的人物位于箱子的目标位置上,此位置对应的数字为 6。

以上仅是第一种情况下,面临的 6 种可能。当人物位于箱子的目标位置时,也同样面临以上 6 种情况。每种情况的处理方案中,同第一种情况不同的是,人物移动后,原位置应恢复为箱子的目标位置,对应的数字为 4。

以上 12 种情况,及各自的处理方案的具体实现,可见源码中的 move() 函数,其中附带有详细的代码注释。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门