如何在Excel中创建可靠的游戏机制。 第二部分


在这一部分中,我们将解决坦克上武器的最佳放置,MMORPG中传送器的空间布置以及平衡四类RPG角色的战斗的问题。

对象放置任务


该部分的电子表格可在此处下载:( SuperTank )( 传送器,第1部分 )( 传送器,第2部分

SuperTank:问题解决了!


在该系列的第一篇文章中 ,我们讨论了一个名为SuperTank的游戏的任务示例。 在第二部分中,我们熟悉了决策建模的基本概念,我谈到了使用Excel中的“搜索解决方案”工具来解决一个简单的示例。

现在,我们可以将第二部分中获得的知识应用于SuperTank问题,并证明在他们的帮助下可以轻松,快速地解决该问题。 刷新您的记忆:SuperTank是一款您可以在自定义坦克上战斗的游戏。 超级坦克看起来像这样:


每个超级坦克可以拥有五种不同类型的任意数量的火炮:


超级坦克可以容纳50吨武器,玩家可以花费100个积分。 此外,超级坦克还有3个“关键插槽”,其中放置了诸如MegaRocket和UltraLaser之类的特殊枪支。

此示例的电子表格可在此处下载。

目标是拾起能够最大化超级坦克造成的伤害的武器,而不会超出50吨,100个积分和3个关键插槽的限制。 我们还假定该表包含所有必要的信息,并且诸如范围,频率和准确性之类的因素不相关,或者在相应武器的“损伤”参数中已经考虑在内。

为了优化此方案,我们首先将这些数据输入电子表格。 在它的正下方,我们将添加另一个表,该表中将有5个“定量”单元格集合,以指示5种武器中的每一种的数量。

在我们为这些单元格输入1之前,只是为了测试它们的工作,但这将是我们的决策单元格-我们将要求Solver工具为这些单元格找到正确的值。 可以理解,这些是黄色的决策单元,因为我们继续遵循第二部分中概述的格式设置规则。 在“定量”单元格的右侧,我们将添加计算单元格,这些单元格将使决策单元格中的数量值乘以上表中的“损坏”,“重量”,“成本”和“关键位置”值。 因此,该表的每一行将正确显示所有类别的武器中所有用过的枪支的损坏,重量,价格和关键插槽。


我们还将在下面创建一个部分,该部分将汇总上表中的数量,重量,成本和关键插槽的所有值,并与任务条件中指定的重量,成本和关键插槽的最大值进行比较(分别为50、100和3)。


根据文章第二部分中的格式设置规则,顶部的蓝色单元格是问题情况的标准。 灰色单元格是计算单元格,它们基于数量表的总和来表示总重量,成本和关键位置(即列的总重x数量,成本x数量和关键插槽x数量)。 最后,橙色单元格表示根据上表中“损坏x数量”列的总损坏,我们收到的超级战车的总损坏。

在开始之前,让我们使电子表格更加用户友好。 我们将利用Excel的机会为每个单元格分配一个名称,并为最后一个计算表中的七个单元格提供明确的名称。 这是可选的,但从长远来看,它将使电子表格看起来更加清晰(例如,如果不是$ F $ 21,则该单元格将称为MaxCriticalSlots)。 为此,我们只需选择一个单元格,然后转到公式字段左侧的名称输入字段,然后输入新名称即可。


现在,最后,我们转到Excel规划求解,找到一个解决方案(转到“数据”选项卡的右侧,然后选择规划求解。如果看不到,请转到Excel选项,选择“加载项”类别(“加载项”),确保在“管理”下拉列表中选择了Excel加载项,然后单击“执行”(“执行...”),并确保求解器加载项复选框处于选中状态。

在设置目标字段(“优化目标功能”)中,我们将选择目标的橙色单元格,然后单击“最大”单选按钮(“最大”)。 在“通过更改变量单元格”字段中,选择决策单元格(第二个表的“数量”列中的黄色单元格)。 在下面,单击添加按钮以添加以下限制:

  • 决策单元的值应在0到某个合理的最大值之间(我们选择了50,即使这可能比所需的极限值大得多)。 除非另有说明,否则还必须将每个解决方案单元格设置为“ =整数”限制,因为我们不能拥有军备的小数部分,并且默认情况下,Excel Solver会将每个变量视为实数。

  • 我们还需要将总成本,总重量和关键插槽总数的值限制为问题条件下的值。 对话框的图像显示,它们现在具有方便的名称,我们已经将它们添加到底部表格中,这使对话框更易于阅读。


现在,我们单击“求解”按钮(“查找解决方案”),短暂等待后,求解器将填写“数量”值,这将为我们提供以下信息:

  • 1挺机枪
  • 3枚火箭
  • 2枚超级火箭
  • 1激光
  • 1个UltraLaser

所有这些给我们带来了83单位的总伤害,正好消耗了50吨,100积分和3个关键插槽。 您会看到最佳解决方案不会随着Solver运行时而改变。 如果您重置这些值并执行第二次优化,或者转到“选项”并更改种子,那么我们仍将获得相同的值。 我们不能100%地确定此解决方案是最优的,但是考虑到Solver在多次优化之后都没有设法对其进行改进,因此很有可能是真正的最优,而不仅仅是局部最大值。

问题解决了!

其他用途


很棒的事情是,我们不仅解决问题的速度超过了手动解决问题的速度,而且还以一种允许我们测试SuperTank游戏中哪些武器在不同参数(重量,成本,关键插槽)下最有用的方式进行设置。 这意味着我们可以在SuperTank游戏中相对轻松地更改这些参数的各种变化的影响,并且如果我们想添加一个新的替代超级坦克模型,该模型将更轻,更重或具有不同数量的关键插槽,则可以非常简单地完成。

通过更改所有这些参数,我们还可以了解每种武器的相对有用性,并迅速确定哪种武器太有用,不够有用,价格不适合其重量和损害,等等。

再有一点是,这种工具使我们能够比手动搜索更快地搜索设计空间。 它为我们提供了一个方便的机会,可以评估我们可以提出的任何增量设计解决方案的此类更改的效果,例如更改武器或超级坦克本身的参数,添加新武器或超级坦克模型以及添加新参数(假设尺寸限制为立方米)。

要理解我的意思,请转到蓝色的“最大成本”单元,并将其值从100更改为99。现在再次运行规划求解,您将获得完全不同的武器布局:

  • 0机枪
  • 2枚火箭
  • 3枚超级火箭
  • 3激光
  • 0超激光

这种方案的损坏指数略低(从82而不是83),但是与以前的方案根本不同。

如果将“最大成本”值设置为101或102,然后再次执行计算,则可能会得到与第一个相似的配置或与之吻合的配置。 尽管如此,损害将保持等于83(方案可能会更改,因为在这种情况下,有几种最佳方案)。 但是,如果将“最大成本”设置为103,则应获得以下信息:

  • 1挺机枪
  • 4枚火箭
  • 2枚超级火箭
  • 0激光
  • 1个UltraLaser

总伤害增加到84

有趣的是:这种武器安排与前两种武器有很大不同。


如您所见,我们得到了意想不到的结果:我们方案中武器的最佳选择在很大程度上取决于超级战车的参数,即使这些参数有很小的变化也可能有很大差异。 此外,它还为我们提供了各种有用的信息:这五种武器在三种超级战车中至少有两种是有用的,而火箭和超级火箭显然在这三类中都有用。 似乎这告诉我们,所有五种武器都具有很好的平衡性,即彼此相对有用,同时又保持独特。

您还可以注意到,此类解决方案的建模和优化为我们提供了绝佳的机会,可以在本地附近快速执行搜索并进行重新优化。 对于某些类型的任务,这将使我们能够发现难以或不可能以任何其他方式找到的玩家的主导策略和利用。

传送-虫洞


查看最后两个示例(战略游戏中的税率示例和SuperTank),您可能会认为此类技术仅适用于用户处理数字的情况。 但是你绝对是错的! 正如我们将看到的,有许多示例说明了如何获得优化设计元素的好处,这些元素不仅对用户看起来像数字,而且根本看起来像数字!

您可能还认为决策模型仅适用于玩家可以在游戏中做出的决策。 这也不是正确的:在某些情况下,它们可以用于建模,以便以设计师的身份优化您自己的解决方案。

假设您正在使用空间MMORPG。 有一天,您的首席设计师在您的脸上露出明显的焦虑。 他说:“我们正在完成Omega领域的重新设计。” “而且我们遇到了问题。 我们计划在“世界的这一部分中添加一些虫洞传送器,但我们无法就将它们放置在何处达成共识”。

“有几个传送器?”你问。

“我们还不知道。 可能是三个,但可以是两个到四个。 我们还不确定。” 然后他为您显示了一张看起来像这样的地图:


“这是什么?”你问。

“这是欧米茄行业的地图。 或者至少是玩家可以在此象限中访问的星级系统。 我们需要确定虫洞应该位于哪个细胞中。”

“那么,他们遵循什么规则? 有可能将虫洞与恒星系统放在一个象限中吗?”

“我们希望您以尽可能减少从任何恒星系统到最近的虫洞的距离的方式放置虫洞。 是的,您可以将它们放置在与恒星系统相同的象限中。 它们只是悬挂在太空中的小型传送器,因此可以放置在任何地方。 并记住,我们尚未决定应该有多少个虫洞,所以请给我解决2、3和4个虫洞的解决方案。”

如何表述这个问题,以及如何解决呢?

优化传送器!


让我们从准备溶液池开始。 我们将四个隐形眼镜分别表示为A,B,C和D。我们知道每个隐形眼镜本质上不过是Omega扇形星图上的坐标(x,y)。 我们还知道,我们将需要某种指示活动传送端口数量的方法,因此我们将添加一个单元格,该单元格可让您设置传送端口数量。 仅在使用4个虫孔时才使用传送D,而在我们使用3个或更多时才使用C。


下面我们将准备一张表格,用于计算每个星系到最近的传送带的距离。 该表如下所示:


左蓝色显示地图上每个恒星系统的坐标。 每行是一个星系统。 我们只是将它们从Omega领域的地图上转移过来,而这是由领先设计师提供给我们的。

在右侧,我们计算到四个传送器中每个传送器的距离。 这只是毕达哥拉斯定理。 距离的计算方法是星系与传送之间的水平和垂直距离的平方根:

= SQRT(($ B14-Ax)^ 2 +($ C14-Ay)^ 2)

(不用担心-我保证这是我们将在系列中遇到的最困难的数学!)

我们从上方表格的蓝色单元格中获取每个恒星系统的X和Y坐标,并从顶部的黄色解决方案单元格获取每个传送的X和Y坐标(上面显示的SQRT()函数中的传送A的名称分别为Ax和Ay的单元)。

最后,我们在距离最接近的列中采用这四个值中的最小值,即,我们仅使用MIN()函数来确定左侧的四个值中的最小值。 然后,我们总结下面的整列; 总和是目标单元格。

您可能已经注意到,在上面的屏幕截图中,所有单元格都设置为Dist toD。原因是我们使用的是“传送器数量”? 在解决方案模型的上部,它允许您配置所考虑的传送数量。 如果传送器的数量是2,则在Dist to C和Dist to D中都使用值99,如果它是3,则仅在Dist to D.列中使用值99,因此,每个恒星系统将忽略所有不必要的传送器在计算2或3传送的情况下到最近传送的距离时。

现在,我们将启动求解器:


目标单元格是“距离最近”列底部的总和。 请注意,与其他示例不同,这里我们要使用“ To:Min”单选按钮,因为我们需要所有星型系统和传送器之间的最小距离,而不是最大距离。

下面,我们将指示八个黄色的单元格作为解的单元格(通过更改变量单元格)来求解虫洞A,B,C和D的X和Y坐标(在“限制变量”部分中),我们将每个坐标范围限制为一个整数值,范围从0到12.请注意,我们对这些解决方案单元格使用整数约束,因为我们的意思是首席设计人员只想知道每个传送将位于哪个单元格中,但是如果设计人员需要物料坐标,我们可以轻松跳过此限制。

如果我们要输入“传送者数量”? 值2、3和4,然后依次在每个值处启动Solver,我们将获得以下配置:


掌握了这些信息后,我们可以联系首席设计师,向他展示2至4范围内任意数量的传送器的最佳位置。这就是2、3和4传送器的“虫洞”的最佳位置在地图上的样子(绿色显示)。


可以从此处下载该示例的电子表格。

我说过忍者吗?


首席设计师说:“很棒。”但是你看到他的脸上受了苦。 “嗯,但是我忘了告诉你,其中一些系统是太空忍者居住的。 我们希望带有忍者的系统远离“虫洞”,以使玩家不会感到过度的威胁。”

“哇。 这完全改变了情况。”

“对。 另外,在某些恒星系统中,没有一个而是两个菌落,也就是说,它们的重要性是接近传送者的两倍。 或者,如果它是一个由两个殖民地空间的忍者组成的系统,那么走远一点是重要的两倍。 这是现在的地图:


他继续说:“每个负数都是太空忍者的殖民地。 数字2的系统包含两个人类殖民地,数字-2的系统包含忍者的两个殖民地。 您能告诉我在这种情况下将传送器放在哪里吗?”

“告诉我,至少您已经决定要进行2、3或4个传送。”,您讽刺地问。

“恐怕还没有。”

我们解决了忍者问题


要解决此问题,我们需要在表中添加一个新列,以指示表的权重。 我们将其称为“乘数”。 我们将简单地将此值乘以“最接近距离”列中的值。

当我们这样做时,“距离最近”会稍微改变其含义。 现在,这不是到最近的恒星系统的距离,因为对于忍者恒星系统,该值变化-1倍。 它类似于更通用的“点”(分数),因此我们称其为“点”。


因此,点现在指示累计值。 通过将其最小化,我们使Solver努力尽可能接近具有人类殖民地的系统,同时又尽可能远离人口稠密的忍者系统。

现在我们得到以下结果:


如您所见,这为我们提供了传送器的配置,在每种情况下都与没有忍者的简单版本有很大不同。


可以从这里下载该扩展版本的电子表格示例的电子表格。

如您所见,我们的解决方案模型能够非常快速地解决这一艰巨的任务,并且我们可以使其适应不断变化的需求。

该任务属于称为“对象分配任务”的任务类别,在操作管理领域中对此进行了很好的研究。 但是正如您所看到的,它们有可能在游戏设计以及关卡设计中使用,并且该解决方案在Excel中非常简单(如果不是很简单的话)。

Player-vs-Player


:


在本系列文章的前三部分中,我们向我们介绍了建模和解决方案优化的概念,以及Excel软件包的“ Solver”工具。我们展示了如何在4X策略中将它们用于计算城市的最佳税率,确定太空游戏中传送器的最佳位置以及为第一部分中描述的超级坦克任务选择武器的最佳布置。

一个自然的问题出现了:如何平衡游戏?是否可以将类似的技术应用于在许多不同类型的游戏中,尤其是在策略,RPG和MMORPG中发现的各种复杂的平衡任务?

当然,这个问题的答案是肯定的,但有很多保留。电子表格尤其有很多限制,因为在大多数非平凡的情况下,电子表格无法准确描述游戏。因此,使用优化技术来执行可靠的平衡将是困难的。绝大多数游戏的真正平衡任务将远远超出我们在电子表格中可以建模的范围。游戏本身的模拟通常太复杂,有很多“活动部件”,并且通常是实时执行的,当尝试离散模拟时,我们会遇到各种各样的问题。

因此,如果我们想使用类似的技术来平衡MMORPG(例如WildStar)或战略游戏(例如湮灭行星,至少是提供某种形式的准确性和实用性,我们必须将它们集成到非常模拟游戏。

另外,事实是,平衡的某些方面无法自动化。正如我们在文章第一部分中所解释的那样,无法自动调整游戏体验。

因此,我们所希望的最好是一个简单示例的演示,该示例说明了此类任务的一般方法:通过Excel中的一个简单示例,我们将学习如何处理这种类型的平衡问题并对其进行优化。我们将证明,至少对于一个简单的战斗示例而言,Solver可以很好地平衡多个RPG类之间的相对关系。然后,您可以使用此基本结构作为解决此类优化问题的基础,该方案具有更复杂的方案,并且可以更深入地集成到游戏模拟中。

我们希望与您一起学习所有技巧,看看这个简单的例子可以给我们带来什么。

不平衡


“平衡”一词没有统一的公认的定义。它具有多种含义,而正确通常取决于相关游戏的上下文。在不同条件下,平衡可能与设置几类角色以使其在角色扮演游戏中的能力相等,在战略游戏中对手相互对抗的部队数量或根据其用途调整各种单位或资源的成本有关。

最佳的“平衡”定义通常取决于相关游戏的设计目标,但是由于这些目标可以是任意的,因此无法先验确定平衡对整体游戏的真正意义。

一些玩家倾向于认为战斗中的平衡意味着同等的伤害。对于MMORPG来说尤其如此,其中玩家经常抱怨一类的每秒伤害(DPS)相对于另一类太小或太大。

当然,不能仅通过DPS来平衡类。可以接受的是,一个班级的DPS比另一个班级更大,但是这应由限制该班级整体实用性的其他因素来抵消,例如,与短期DPS相比,存活率降低或长期DPS降低。

微小的MMO


想象一下,我们正在创建一个新项目,一个非常简化的大型多人在线角色扮演游戏,名为“ Tiny MMO”。作为设计开发的一部分,我们努力平衡玩家对玩家(PVP)战斗的四个等级,以使所有四个等级在彼此之间的战斗中相对相等,并且没有明显的“更好”或“更差”等级您可以与其他班级作斗争。

尽管Tiny MMO是一款实时游戏,但每个玩家的动作仅持续3秒,因此我们可以将其呈现为基于回合的游戏,使它离散化,其中每回合占游戏时间的三分之二。

该游戏的玩家可以选择以下四个角色类别之一:

  • 战士造成的伤害最大。
  • 法师从远处施放法术,所有四个职业的攻击距离最长
  • 治愈者(Healer)被自动治疗,每回合都会恢复其部分健康
  • 野蛮人(Barbarian)最健康

这就是我们对这四个类别的全部了解,我们需要为所有四个类别设置初始状态(HP),伤害,恢复和攻击范围。我们需要以一种这样的方式来平衡它们:每个类别都是唯一的,并且其特征与所有其他类别都显着不同,但是结果是,每个类别相对于其他三个类别而言,尽可能地“平衡”。

换句话说,我们努力优化下表:


虽然我们使用临时值,并假设每个类别的生命值从50点开始,每回合造成10点伤害,每回合可以回复0点生命,攻击距离为40米。每个角色每回合以10米的速度移动。由于设计表明所有四个类别的字符都可以相同的速度移动,因此我们将将此值视为常数,并且不会将移动速度输入到决策变量表中。

显然,这是一个具有非常简化的损坏模型的案例研究。这是每秒伤害的连续平均值,它忽略了脉冲伤害和长期伤害之间的差异,以及忽略了法术力和其他改变类攻击能力的机制。我们将只有一种类型的伤害,这是非常不现实的,因为大多数类都有数十种类型的伤害,并且我们将需要实现一个AI系统,该AI系统在每个回合中选择攻击。另外,在大多数游戏中,伤害具有随机性,但是现在我们将其忽略,并假设伤害的可变性不会太大而不会显着影响两类之间的战斗结果。

当然,在Excel中执行的任何平衡都不太可能是理想的,也不可能与游戏的最终平衡相一致。她将不得不经历多次游戏测试。但是,如果我们花一两个小时才能在Excel中获得良好的游戏首选选项,那么至少我们更有可能接近初始余额的定性参数,这将使我们更接近我们想要获得的最终余额。

胜利表


在一对一的战斗中,我们需要平衡四个班级。由于我们只有4个职业(战士,法师,治疗者和野蛮人),因此有6种可能的不同职业组合:

  • 战士-法师
  • 战士-治疗者
  • 战士-蛮族
  • 法师-治疗者
  • 法师-野蛮人
  • 治疗者-野蛮人

这种平衡可能非常复杂。即使在一个简单的案例中,只有四个类别,我们也得到了六个类别间关系,就像我们可以在一个正方形的四个点之间绘制六条线一样。


每当我们想对任何一个类的参数进行很小的更改时,此更改都会影响这对类与其他两个类之间的PvP平衡这种幂律的相互联系只会随着类别数量的增加而增长,并且“平衡”做出的关于在任何一对类别之间平衡PvP的决定,如果不考虑所有其他相互作用,可能会变得非常危险。

理想情况下,我们想创建某种胜利表如下图所示。如果我们可以在电子表格中模拟这6对中的每对之间的战斗,那么我们将能够为6对中的每对生成特定的“点”变量。点数越多越好,因此我们可以将所有这六个点结合起来以生成目标函数。


请注意,在上表中,沿对角线的单元为零,因为它们表示将通过定义进行平衡的同一类对。此外,右上角的单元格也为零,因为它们表示与左下角的单元格完全相同的对。

现在,让我们为两个不同的类之间的战斗准备模型。

“战斗模拟器”


我们将每对课程安排在相距100米的位置。每个角色有3秒的攻击时间,因此我们可以将其想象为基于回合的模拟,其中每个“移动”意味着3秒。在每个“移动”上,如果每个角色都在攻击范围内,则它们要么互相攻击,要么继续移动以减小距离。

模拟如下所示:


上面是一对参加战斗的角色:在这种情况下,是法师(1级)和治疗者(2级)。左列显示了两个模拟字符之间的当前距离。

对于每个字符,列将为:

  • Max Range : , . .
  • Healing : , .
  • HP : . HP , . , .
  • Damage : , , . , 0.
  • 进攻?:此列检查角色是否在攻击范围内。如果是这样,则意味着该角色正在当前回合中进攻。如果不是,则该角色移近以到达另一个角色。

因此,两个角色开始相互靠近,然后进攻直到他们中的一个或两个都死了。 每个角色每3秒移动5米(每“转”为5米)。 当两个角色朝彼此移动时,范围将每转10个单位,如果其中一个移动一个,则更改5个单位。 游戏本身的结构设计使得两个角色可以同时开始移动,然后允许同时移动,因此两个角色可能同时死亡。

接下来,我们需要为该表设置得分并生成一个数值,表明战斗的“良好”程度。 换句话说,我们离实现设计目标有多近。

显然,我们希望两个角色都在战斗结束时死亡,或者至少尽可能接近死亡。 如果战斗是平衡的,那么在战斗结束时,两个战斗类别都应使敌人的健康状况降至最低。

但是,仅此还不够。 如果我们以这种方式组织计分,那么优化器将简单地最大化伤害值,以便两个角色立即相互残杀! (如果您好奇,请尝试更改文章所附的电子表格,以供自己查看。) 显然,我们的目标不是即时死亡:我们需要两个角色在战斗结束时已经死亡或几乎死亡,但同时我们希望战斗能够持续一段合理的时间。

换句话说,我们不仅要努力确保所有阶级之间的相对平等的平衡,而且还要努力使之成为现实。 我们还希望使平衡变得有趣 ,包括持续适当时间的战斗。

要生成这样的余额估算,我们需要在每个表的右侧创建几个单元格。 持续时间表示战斗的持续时间; 她计算了两个字符都还活着的表中的行数。 总HP计算两个幸存角色的总生命值。 理想情况下,它应该为0,也就是说,在战斗结束时,两个角色都快死了。


最后,Score以(Duration /(1 + Total HP))的形式组合持续时间和总生命值。 请注意,我们将除数加了1,因为Total HP可能为0,在这种情况下,我们将得到除以零的误差。 通过这种方式,我们可以保证我们奖励优化器以找到最大的战斗持续时间和命中值总和最小值。

(请注意,由于每个“类”到“类”战斗的“模拟”中都有17行。这意味着我们实质上是在设计上决定战斗应持续约17轮。如果我们想缩短战斗时间或缩短战斗时间,更长的时间,您可以更改行数,编辑用于计算得分的公式并相应地执行第二次优化。)

最后,我们采用这六个得分值(每个表一个),并在上面的胜利表中使用它们来显示每对类别之间的战斗结果。

您可以简单地汇总这六个得分值,然后将结果用作最终得分值。 但是,如果我们这样做,那么求解器很可能将无法在单个战斗的最高和最低评分之间找到良好的平衡,并且在某些类别的比赛中也会获得很高的评分,而在其他类别的比赛中则会获得较低的评分。 这不是我们想要的:我们需要所有分数都很高,并努力提高所有分数。 为了解决这个问题,我们将成绩的总和乘以组中最小的成绩(使用Excel MIN()函数),以使Solver专注于值最低的成绩。

添加限制


我们还没有完成。 如果使用当前参数优化解决方案模型,则很可能无法正确配置类-实际上,模型很有可能会将相同的HP,Damage,Healing和Range值写入决策变量表。

当然,我们希望每个班级都有自己的个性。 我们需要战士造成最多的伤害,法师的射程最大,治疗者的治疗值最高,野蛮人的生命值最高。 我们还希望这些差异不要太小-我们需要这些类彼此之间非常不同。

为此,我们将创建一个小的限制表。 该表确保四个类中的每一个都将具有对应的属性,然后根据是否满足约束条件给出0或1的分数。


右侧的表格Min Difference显示该类别的每个属性相对于所有其他类别的最小差异。 换句话说,战士必须比所有其他类别具有至少4 HP更多的伤害,法师必须具有至少10以上的攻击范围,依此类推。

现在我们已经添加了这些特殊限制,是时候进行优化了!

寻找解决方案


现在,我们可以运行Excel中内置的求解器工具(“查找解决方案”)来尝试优化初始参数。 作为目标单元格,我们将选择“得分”单元格,该单元格将所有六个锦标赛的结果结合在一起。 我们将决策变量设置为在开始时创建的黄色“决策变量”表中包括所有16个单元格。

我们还按如下所示设置约束(在“约束的主题”字段中):

  • 所有决策单元必须是整数,最小值为0。
  • HP列中的所有单元格的最大值必须为200,最小值为30。
  • 损坏列中的所有单元格的最大值为20。
  • “修复”列中的所有单元格的最大值均为15。
  • “范围”列中的所有单元格的最大值为100。
  • 此外,特殊约束部分中的所有四个单元都必须设置为1才能满足其特殊条件。


最后,将“求解方法”设置为“渐进式”并运行“求解器”。 请注意,由于这是一种进化算法,因此有可能改进在第二或第三次求解求解过程中或在设置参数(选项按钮)以进行进化优化后找到的解决方案。

结果,我们应该得到类似的东西:


...似乎是魔术师,求解器为我们提供了良好的初始平衡配置。

如您所见,战士现在受到的伤害最大,法师的射程最大,治疗者的治疗效果最佳,而野蛮人的生命值最高。 此外,您可以查看各个锦标赛“逐班”的结果,并查看各班在彼此之间的战斗中如何表现自己; 如您所见,他们中的大多数人都非常平衡-到战斗结束时,两个阶级都快要死了,或者其中一个阶级几乎无法生存。 此外,所有锦标赛的持续时间都足够长,没有一个可以“相互竞争”。

几个小时的工作还不错吧?

结论


在此示例中,我们创建了一个简单的平衡任务,并演示了实际上我们可以借助仿真和优化来解决它。 尽管很明显,这是一个简单的示例,但它向我们展示了建模技术和决策优化的力量。 此外,它可以成为灵感的来源,可用于更复杂的平衡工具中,并紧密集成到游戏模拟中。 我们希望您可以将此示例用作实践中制定此类任务的指南。

在本系列的下两个部分中,我们将深入研究分配任务领域,该任务与从两组或更多组实体中选择最佳分配有关。 我们将展示如何解决这些类型的问题,并演示如何在iOS / Android City Conquest的策略游戏中使用这种方法来设计塔楼设计。

Source: https://habr.com/ru/post/zh-CN430114/


All Articles