【超级干货】三消游戏的自动关卡测试机制

来自 游戏葡萄 2015-05-19
深度

[ 游戏葡萄原创专稿,未经允许请勿转载 ]

【超级干货】三消游戏的自动关卡测试机制

本文由偶尔喝咖啡投稿,授权游戏葡萄独家发布,即使我们允许了,也不能转载。

对于一款推图式的三消游戏而言,关卡设计是其游戏设计工作的重中之重。一款三消游戏动辄200~300关的设计量,对于任何团队都是其研发工作中的一个巨大的难点。大体来讲,三消游戏的关卡设计分为以下的四个步骤:

1.关卡的初始定位

使用哪些特殊元素(比如冰,炸弹,传送门等等)

这往往是由该关卡在整个游戏推图流程中的定位决定的,比如它所在的章节主打的特殊元素有哪些,在这个章节中缺少哪种类型的关卡,这个关卡在整个游戏中的难度定义,等等。

2.关卡的核心创意

策划通过脑洞大开的方式来对于一个关卡进行发散式的设定,比如A关卡需要在特定的时间内干掉10个炸弹,B关卡需要在XX东西消失前将其送到特定的位置,C关卡需要先解开N块冰然后收集冰块上面的几十个糖果,以上等等。

3.关卡的可行性验证与布局实现

基于上一步产出的核心创意,策划需要对该关卡进行详细的编制和设定。这里编制设定的要素包括:

(1) 设置核心创意所需的基本环境。

(2) 对于玩家游戏过程中可能出现的,不符合设计者设计意图的其他过关方式进行一定程度的防止。

(3) 配合核心创意,进行关卡目标的具体设定。在很多三消游戏的关卡中,过关目标往往是由核心目标和伴随目标共同构成的。

(4) 进行具体的地图编制,初始形态,下落概率等等具体设置。

由于本文的重心并不在于关卡设计,因此对以上部分就不过多展开探讨了,欢迎有兴趣的同学可以通过文末的作者联系方式和作者联系,私下探讨^_^

4.关卡的难度测试和调整

在大多数团队的三消关卡设计开发工作中,这一环节是最为枯燥,单调,但也却是最重要和最浪费人力时间成本的。笔者已知的大部分团队目前仍然采用的是纯手工测试的方式。而在这里笔者想要提出的,是一种在笔者之前的三消项目开发过程中成功运用的自动关卡测试机制。这一自动关卡测试机制的基本原理如下:

0 (3).png

下面我们分四个核心部分来讲解这一关卡测试系统的实现机制。

A.自动测试的输入与输出

一个基本的自动测试输入包括:

  • 所需测试的关卡ID

  • 所需测试的次数

  • 测试的输出精度

我们会需要两种测试输出精度:

a.用于大规模量级测试,只需输出每一次测试的通过回合数。

最基本的输出格式如下:

0 (2).png

其中随机参数的作用会在后文中详细阐述。

b.用于对于异常的数据进行详细跟进,需要输出每一步的详细步骤。

最基本的输出格式如下:

0 (1).png

B.核心AI算法

首先介绍一下,AI(人工智能)算法的基本模式:

建立评价函数体系,然后对于当前状态下的每一个可能的选择给出评分,然后基于评分选出最优解。

0.png

五子棋简单AI示例

这里我们以一个五子棋游戏来作为一个例子,当前轮到白棋走棋,我们要用AI简单的判断一下走哪里最好。我们简单的建立以下的评价函数:

1.距离棋盘中心更近的点比距离棋盘中心更远的点更好(积分=30-|x-8|-|y-8|)。

2.一步棋为己方创造的有效进攻手段越多越好(例如:活三=3分,冲四=3分,活二=2分,冲三=2分)

3.一步棋减少的敌方的有效的进攻手段越多越好(例如:减少敌方活二=2分,减少敌方冲散=2分)

4.此步棋走完后,若己方未存留冲四而对方存留活三,则积-10000分。

5.此步棋走完后,若对方存留冲四,则积-10000分。

6.此步棋走完后,若己方已完成五连,则积+1000000分。

使用以上的评价函数,我们就可以很容易的在A,B,C三个选点中,选择C作为我们的下一步。

当然,在更高精尖的技术领域一定会用到比上述复杂一万倍的AI算法,但对于当前我们所面对的三消测试问题,上述的AI算法已经足够了。因为我们的目的是横向判断关卡的通关难度是否合理,而不是以最极限的方式去计算关卡的极限步数。

接下来,我们所需要做的核心事情就是定义在一个常规的三消游戏中的评价函数,也就是用于评价各个可能行为好坏的评分标准。这里,笔者给出的是同类三消游戏比较通用的几个指标(实际使用时每个项目会根据自己项目的特点增补新的指标或筛减掉某些指标):

a.移动位置的Y坐标(ScoreY)

大体来讲,当其他条件相当时,我们会优先选择Y坐标更大(即处于屏幕更下方)的点,因为这样会引发更多的消除元素的移动,制造出更多的不可预期的偶发因素。当然,对于类似《Candy Crush Saga Soda》或者《Juice Jam》这样有消除元素反向移动设定的关卡,我们可以将这一评价函数修改为:预期内移动后发生位置移动的元素个数。

b.关卡目标积分(ScoreScore)

比如某个关卡的目标为:收集50个红色元素和50个绿色元素,那么,我们就会去评价在单一步骤内消除掉的红色元素和绿色元素数量。这一数量越多,则意味着我们距离关卡目标越近。当然,如果在第七步的时候,红色元素的完成度达到了50/50,那么从第八步开始,我们就只会去计算绿色元素的效果了。

c.关卡目标元素积分(ScoreTarget)

与上一项不同的,这一项评价函数评估的是关卡内剩余的目标相关元素数量。在类似《FarmHeroes Saga》的三消游戏中,玩家可以通过给各种水果元素增加星级来大大加快关卡目标收集的效率,在这种游戏中,玩家收集10点红色进度,可能消耗掉了三个红色水果也可能消耗掉了七个红色水果,很明显的,前者更有利于后续的目标积累。

d.场景内存留的元素(及状态)积分(ScoreElement)

在类似《糖果粉碎传奇》的三消游戏中,场景内的元素有正面元素(产生正面效果)和负面元素(产生负面效果)两种。在场景内,存留更多的正面元素,最大限度的减少负面元素或者让其转化为负面效果较弱的状态,就成为了我们评价一步移动是否得当的重要标准。

这里我们以Best Fiends里的炮台元素为例。

0 (4).png

《Best Fiends》第119关

炮台元素效果:每回合末,若其周围8个格子中有至少一个为普通元素,则随机将一个普通元素变为淤泥。当炮台上下左右有任何元素消除时,炮台眩晕一回合。

淤泥效果:每回合末,若本回合没有淤泥被消灭,则在全场与淤泥上下左右相邻的普通元素中随机选择一个,将其变成淤泥。当淤泥上下左右有任何元素消除时,消灭这块淤泥。

我们可以很明显的看出,炮台和淤泥属于负面元素,而被打晕的炮台则属于无害元素(或者将其视作危害小于未晕炮台的有害元素也可)。因此,我们的评分标准就是,未晕的炮台和淤泥越少,评分越高。

e. 未知元素积分(ScoreUnknown)

当我们进行一次操作时,会导致场景内一定数量的元素被消除,当被消除的元素越多时,就会入场越多的未知元素。这些未知元素越多,就可能为我们带来更多的combo连锁,更多的目标水果,乃至其他的未知收益事件。因此的,一次消除带来的未知元素越多,其评价积分也对应的越高。

除了以上一些基本元素以外,我们会基于每个三消游戏独特的特殊元素规则给予不同的评分标准。这里我们仅举出一个例子:《糖果粉碎传奇》中的坚果和樱桃。

0 (5).png

《糖果粉碎传奇》中的坚果关卡

在这样的关卡中,游戏要求玩家将坚果(及樱桃)移动到屏幕最下方的特定的传送点,之后坚果(及樱桃)将自动被消除和收集。对于这种元素,我们就会将元素的Y坐标加入到我们的AI评价体系之中,作为一次移动的结果,元素越落到下方,该步移动得到的积分则越高。

基于以上的种种积分,我们再加入一套整体外层控制的权重系数(这一权重系数可能会由于不同种类关卡的侧重,特点不同而随时由操作者进行调节)。

ArgY:Y坐标权重

ArgScore:目标权重

ArgTarget:目标元素权重

ArgElement:存留元素权重

ArgUnknown:未知元素权重

一步移动的总评价得分= ScoreY * ArgY+ ScoreScore * ArgScore + ScoreTarget * ArgTarget + ScoreElement * ArgElement +ScoreUnknown * ArgUnknown

然后,我们就可以选出总评分最高的,也就是我们AI所定义的最优移动了。

C.AI测试的参数核准

当我们制定了一版我们自己的AI权重系数,也对各种元素赋予了我们的权重积分,这个时候一个问题自然而然的产生了:我们如何验证我们设定的这一版权重系数是恰当的?当我们AI跑出平均25步的成绩时,我们实际玩家的成绩分布会处在一种什么样的状态?

对于以上的问题,我们并没有一个100%绝对有效的解决方案,但在这里,笔者为大家提供一种略有取巧的验证方案:

我们在其他游戏中找到一个与我们元素种类比较类似,所处的难度档位与我们设定也比较相当的关卡,并将其配置到我们的测试环境中。然后,我们使用相同的AI框架去对其他游戏的关卡进行测试。如果测试结果如下:

参考关卡设定步数:25

参考关卡AI平均步数:16

己方关卡AI平均步数:20

那么这个时候,基于相同的比例放缩,我们可以大胆做出假定,将己方这一关卡的实际步数设定在30~32步上下是比较恰当的。

当然,自动关卡测试机制不是万能的。笔者建议,通过这里的自动关卡测试机制后,实际设定的游戏关卡在上线前,最好仍然进行一次相当于无自动测试机制10%~20%量级的手动测试,这样可以额外排除和解决一些未知的风险问题。

D.AI测试的情景复现处理

三消游戏的一个非常核心的特征就是非常高的随机性,每一步下落的元素的无限可能性决定了一个关卡无限的未知性。但是作为一个严谨的自动测试,我们需要能够定位到每一次超越我们预期的事件的发生,例如一个我们预设10步完成的关卡在某次AI测试中突然跑出了50多步的成绩。这可能意味着在我们的游戏算法或AI算法中存在着未被发掘的深层Bug。

这里,笔者给出一个技术上的解决方案,用于随时定位和复现异常情景,以便于策划和技术共同去发现和解决问题。

我们知道,计算机的随机数算法事实上是一种伪随机算法。基于很重要的叫做“种子”的元素,技术可以使得程序在不同的时间,使用相同的代码生成出两组完全相同的随机数。而这样的技术特征给了我们一个非常大的好处,就是只要我们在随机输出中记录好每一次随机输出时使用的随机种子,就可以在之后随时复现出上次异常的测试的执行流程。

0 (6).png

基于上面的输出表,我们可以随时用“509”这个随机种子去复现出为什么第三次测试的步数超过了10步

在实际的工作中,我们可以在此时使用509这个随机种子,输出出这一次测试的每一步的详细移动和实际局面。

在技术上,非常重要的一个关键点是,技术需要维护两个随机种子以及它们所对应的随机序列。序列1用于所有的基本的随机逻辑,序列2用于只包含于AI计算之内的随机逻辑。这样做的意义是,我们可以使用相同的序列1随机种子,在不使用AI而使用手动测试的模式下去复现这次AI模式中的所有随机生成,并基于此去校验每一步随机行为的合理性。

本文作者QQ:1963904 Email:ancientlight@sina.com 欢迎大家交流。

文章评论
游戏葡萄订阅号