在《C语言2048游戏演示和说明》一节中,我们对 2048 游戏进行和简单的介绍和演示,这节就来分析一下它的源码。2048游戏的源码下载地址:
各位读者不防先将源码下载下来浏览一遍,记住关键的几个函数,整理一下不了解的知识点,做到心中有数。
下面请各位读者先学习一下该游戏中涉及到的几个关键知识点,有了这些必备条件,我们才好讲解 2048 游戏的设计思路。
2048 游戏设置的格子边框颜色为湖蓝色,其中的数字颜色设有淡绿色、绿色等,所有的这些设置都涉及到如何改变文本的输出颜色,请大家猛击《彩色版的C语言》了解详情。
在2048 游戏中,玩家可通过 W\A\S\D 或者方向键来控制数字的移动方向,具体实现方法请大家猛击《C语言非阻塞式键盘监听》了解详情。
2048 游戏中,对于每次产生的新的数字所处位置,是随机的,这就需要通过产生随机数来完成,请大家猛击《C语言获取随机数》了解详情。
2048小游戏的整体的设计思路是:
提示:我们提供的 2048游戏,并不是合并为 2048 即为结束,结束标志只有一个,就是第 3 条所说,直到游戏无法进行,才会结束。
在2048 游戏中,数字移动和合并为游戏的核心,在游戏过程中,无论数字向那个方向移动,其实现所用的算法都是相同的。
这里我们用 "左移" 操作来给大家讲解算法的实现过程。
如上图所示,若这种情况下玩家进行“左移”操作,我们首先拿最后一行来具体分析源码中的实现过程(左移执行 move_left()函数)。
首先,我们用变量 k 表示坐标为 (4,1) 位置存放的数据,然后用变量 i 从(4,2)开始遍历,到有数字的位置就停止,一直到此行的最后位置(4,4),如下图所示:
在 i 移动的过程中,我们统一做以下操作:
采用以上规则,第一次运行,k=2,同时 i=2,符合第 1 条,做相应改变之后,如下图所示:
继续运行,此时 k 位置无数字,i=4,符合第 3条,改变之后,如下图所示:
继续运行,此时 k=4,i=2,符合第 2 条,做相应改变后,如下图所示:
此时,由于 i 超出了指定的遍历区间,所以此次移动任务结束。以上是第 4 行移动的过程。
同理可见,第 2 行中,i 可从坐标(2,2)位置向后移动,但是一直没有数字,所以不需任何移动;
第 3 行中,第一次运行,k 处无数字, i 指向的是最后的数字 4,按照第 3 条规则,直接将 4 移动到 k 处,此行移动就结束了。
所以,在实现左移操作的实现时,我们只需要遍历每一行,在每行的遍历过程中,嵌套遍历每一个非 0 数,根据以上规则,做相应移动即可。
举一反三,上移、下移、右移,都是如此实现。具体实现过程,可见源代码中 move_left()、move_right()、move_up()、move_down() 函数的代码实现。
我们设计的 2048 游戏,由于其并不是产生 2048 即为结束标志,所以对于此游戏来说,玩家甚至可合并处 4096 、8192、16384 等。
游戏一旦开始,唯一的正常结束标志就是:16 个格子全部被数字占用,且无论做哪种方向的移动,数字之间都无法完成合并,此时,游戏无法继续,视为结束的标志。
所以,在游戏的运行过程中,我们只需要判断以下两种状态:
具体游戏结束的算法实现,可参考源代码的 refresh_show() 函数中,对游戏结束的判断。
至于该游戏中界面的搭建,实则是使用特殊字符组成,即以 printf() 输出特殊字符的形式组成,具体实现可见 refresh_show() 函数,并无什么技术含量,这里不再详细介绍,大家可以参照源码。