2048小游戏编写思路

6 篇文章 1 订阅
4 篇文章 0 订阅

有点难
关键知识点
下面请各位读者先学习一下该游戏中涉及到的几个关键知识点,有了这些必备条件,我们才好讲解 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条,改变之后,如下图所示:
    在这里插入图片描述
    此时,由于 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() 函数,并无什么技术含量,这里不再详细介绍,大家可以参照源码。
  • 19
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值