所在位置 : 首页 > 手游攻略 > 详情

2048,效果如下:方块移动和合并算法的核心算法

文章来源:网络整理作者:滴滴速下发布时间:2022-09-18 18:13:09

今天无聊游戏数字,带大家写个黑窗版2048,效果如下:

一、游戏介绍

《2048》是最近比较火的数字游戏之一。最初的 2048 首次发布于 .原作者是。是一款基于《1024》和《小3传奇》(!)的玩法开发的全新数字游戏。

二、游戏规则

游戏规则非常简单。您需要控制所有方块向同一方向移动。两个具有相同数字的正方形碰撞在一起并合并为它们的总和。每次操作后,会在空白方格中生成一个随机方格。 2或4(产生2的概率更高),最后得到一个“2048”方格就是胜利。

三、核心算法

1、方块移动和合并算法。

主要思想:将游戏编号面板抽象成一个4行4列的二维数组a[4][4],值为0的位置代表空方格,另一个代表对应的数字方格对每一行一视同仁,只研究一行的移动合并算法,然后通过遍历行来实现所有行的移动合并算法。在一行中,用b[4]表示一行的一位数组,用两个下标变量遍历列项,这里用j和k,其中j总是在k之后,用来求k items 后面的第一个不为 0 的数字,第 k 个 item 用来表示当前要比较的 item,它总是与第 j 个 item 之间用多个 0 隔开,或者就在它的旁边。不失一般性,在考虑向左滑动时,在初始情况下,j等于1,k等于0,然后判断第j项的个数是否大于0。如果是,则判断item j 和 item k 的关系,分为 3 种情况。处理,分别为P1: , P2: b[k]==0 and P3: b[k]!=0 and b[k]!=b[j];如果不是,则 j 加 1,然后继续搜索第 k 项后的第一个非零数。其中,P1、P2、P3分别对应如下:

P1:b[k]==b[j],则b[k] = 2 * b[k](表示两个数合并),b[j] = 0(合并后,剩余的第j项的值清零),然后k加1,然后进行下一个循环。

P2:b[k]==0,表示b[j]中全是空格。此时直接将b[j]移动到k的位置,即b[k] = b[j],则b[j] = 0(移动后剩余j值清零),则k值不变,然后进行下一个循环。

P3:b[k]!=0 and b[k]!=b[j],表示两个数不相等,也不为0。此时,把两个数放在一起游戏数字,即, b[k +1] = b[j]。然后是两个小案例。若j!=k+1,则b[j] = 0(移动后剩余j值清零);如果不是,则说明这两个数本来就靠得很近,那么就没有特殊处理(相当于不动)。然后k加1,然后进行下一个循环。

以P1为例,流程如下:

游戏数字_数字圆圈游戏_数字版游戏

行内移动合并的算法描述如下(本例为左移的情况,其他方向类似,区别仅在于遍历两者的行项和列项的方式——维数组):

2、判断游戏是否结束的算法

核心思想:遍历二维数组,看是否有两个横向和纵向相邻的元素相等,如果有,游戏没有结束,如果没有,游戏结束。小编推荐一条学习C语言/C++的学习裙【627,012,464】,无论你是大牛还是新手,无论是想转行还是想进入这个行业,都可以来学习进步一起学习!裙子里有开发工具,很多干货和技术资料分享!

算法代码描述如下(棋盘代表真实游戏源码中使用的二维数组):

3、生成随机数算法

核心思想:根据生成的随机数,对某个值取模,以一定的概率生成一个数。在这个游戏中,2的出现概率设置为4的2倍,所以可以使用系统提供的随机数函数生成一个数,然后取3的余数。如果得到的数小于大于 2 时,游戏面板的空白处会生成一个数字。 2,如果余数等于2,则生成4。在选择哪个空间生成数的时候,也是根据系统提供的随机函数生成一个数,然后取空格数的余数,然后在剩余空间中生成数字。

4、绘制界面的算法

核心思想:利用系统提供的控制台界面清空功能实现界面刷新的效果,利用控制tab位置实现绘制游戏数字面板的效果。

由于绘制界面不是这个游戏的精髓,而且代码段比较长,所以这里省略算法描述,读者可以参考完整的源码。

四、完整源码如下,动画太多无法展示代码,有兴趣可以在简陋屋里获取: