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

C语言2048游戏源码下载、源码解释和设计思路

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

《C语言2048游戏演示和说明》一节中,我们对 2048 游戏进行和简单的介绍和演示,这节就来分析一下它的源码。2048游戏的源码下载地址:

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

关键知识点

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

1) 改变文本颜色

2048 游戏设置的格子边框颜色为湖蓝色,其中的数字颜色设有淡绿色、绿色等,所有的这些设置都涉及到如何改变文本的输出颜色,请大家猛击《彩色版的C语言》了解详情。

2) 键盘监听

在2048 游戏中,玩家可通过 W\A\S\D 或者方向键来控制数字的移动方向,具体实现方法请大家猛击《C语言非阻塞式键盘监听》了解详情。

3) 获取随机数

2048 游戏中,对于每次产生的新的数字所处位置,是随机的,这就需要通过产生随机数来完成,请大家猛击《C语言获取随机数》了解详情。

2048游戏整体设计思路

2048小游戏的整体的设计思路是:

  1. 游戏界面初始化,共有 4 行 4 列,总计 16 个位置,游戏开始时,在任意的两个位置上,随机产生数字 2 或 4(产生 2 的几率更大一些);
  2. 玩家可通过 W\A\S\D 或者键盘方向键来控制所有数字的移动,游戏过程中,要符合 2048 游戏的基本规则;
  3. 当游戏中无空余位置,且相邻数字之间无法合并,则 game over;

提示:我们提供的 2048游戏,并不是合并为 2048 即为结束,结束标志只有一个,就是第 3 条所说,直到游戏无法进行,才会结束。

数字移动和合并的算法实现

在2048 游戏中,数字移动和合并为游戏的核心,在游戏过程中,无论数字向那个方向移动,其实现所用的算法都是相同的。

这里我们用 "左移" 操作来给大家讲解算法的实现过程。

如上图所示,若这种情况下玩家进行“左移”操作,我们首先拿最后一行来具体分析源码中的实现过程(左移执行 move_left()函数)。

首先,我们用变量 k 表示坐标为 (4,1) 位置存放的数据,然后用变量 i 从(4,2)开始遍历,到有数字的位置就停止,一直到此行的最后位置(4,4),如下图所示:

在 i 移动的过程中,我们统一做以下操作:

  • 如果 k 指向位置的数字同 i 指向位置的数字相等:则消除 i 位置的数字,k 指向位置的数字*2,然后 k 本身 +1(即 k 指向下一个位置),i 向后移动;
  • 如果 k 指向位置的数字同 i 指向位置的数字不相等:则将 i 位置的数字移动到 k+1 的位置,同时 k本身要 +1(即 k 指向下一个位置),i 向后移动;
  • 如果 k 指向位置没有数字:则将 i 位置的数字直接移动到 k 所指向的位置,同时消除 i 位置处的数字。k位置不动,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 个格子全部被数字占用,且无论做哪种方向的移动,数字之间都无法完成合并,此时,游戏无法继续,视为结束的标志。

所以,在游戏的运行过程中,我们只需要判断以下两种状态:

  • 16 个格子是否全部沾满,如果有空格子,则游戏继续;
  • 如果 16 个格子全部沾满,可使用嵌套循环判断:是否存在相邻数字之间相等,如果存在,游戏继续;如果不存在,游戏结束。

具体游戏结束的算法实现,可参考源代码的 refresh_show() 函数中,对游戏结束的判断。

至于该游戏中界面的搭建,实则是使用特殊字符组成,即以 printf() 输出特殊字符的形式组成,具体实现可见 refresh_show() 函数,并无什么技术含量,这里不再详细介绍,大家可以参照源码。

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