套牌选择战自由形:蒙特卡洛模拟篇

以 2023 年 Pro Tour 菲瑞克西亚备战为例,说明如何用元游戏占有率、对局胜率与蒙特卡洛模拟辅助套牌选择。

套牌选择战自由形:蒙特卡洛模拟篇

作者:あまる
《万智牌》MTG 日本选手权 2021 SEASON3 Top 4
《七圣召唤》小王子杯太平洋赛区 Top 16
《Dragon Ball Fusion World》获得两张序列悟空
插图:ちゃば

在我经历过的许多卡牌游戏里,套牌选择往往比牌技更能左右结果。一次两次的胜负也许看不出来,但试行次数越多,这一点就会显得越发明显。本文想结合一个实际案例,介绍我过去在暂停实战、转而专门思考元游戏时,实际做过的一件事。

最终目标与条件设定

我已经确定要参加 2023 年 3 月的 MTG Pro Tour 菲瑞克西亚。这是一场在美国费城举行的大赛。

当时的构筑赛制是 Pioneer。环境里几乎什么套牌都可能出现,粗略估计,碰上二十种左右都不奇怪;再加上还有新牌加入,新套牌随时可能冒出来。由于比赛是从 Top 8 开始进入季后赛淘汰轮,我给自己设定的目标,就是找出最容易进入 Top 8 的套牌。换句话说,我想找的是:

在携带该套牌参赛的人数这个前提下,打进 Top 8 概率最高的那副牌。

前面也说了,环境里的套牌实在太多,靠个人把所有套牌都完整摸一遍并不现实。不论是团队分工,还是个人训练,都必须有所取舍,所以我需要一条逻辑性的辅助线来帮助判断。

先把问题改写成可以计算的形式

我真正想确认的,是“哪副牌在单位持有人数下最容易进入 Top 8”。可这个问题既没法直接看出来,也不现实。要把它算出来,至少需要准备下面两项数据,而且要对环境里的每一副候选套牌都准备一份:

  • 元游戏占有率
  • 各套牌之间的对局胜率(镜像对局一律视为 50%)

如果这些数据都能被精确预测,当然就可以直接算出来。但完美预测根本不可能。

再进一步说,哪怕只是在假设之上做计算,理论上也可以靠矩阵运算推导出任意轮数结束后各套牌的胜率。不过这一次,我最后采用的是蒙特卡洛法,原因后面会讲。

简单说说蒙特卡洛法

广义上,凡是利用随机数进行模拟的做法,都可以归到蒙特卡洛法。以前我在教育节目里看过有人不断掷飞镖来求圆周率,那也是蒙特卡洛法的一种应用。它的特点就是:通过增加试行次数,结果会逐渐逼近正确值。

另外,它还有一个特点,就是不像很多统计方法那样必须纠结显著性之类的问题。放到这次的例子里,就是我准备一个模拟器,然后反复去跑“假想中的大会”。

我为什么不用矩阵运算,而改用蒙特卡洛法

对我来说,矩阵运算最大的问题在于,它没法把 Opponents 的计算纳进来。这里说的 Opponents,指的是瑞士轮排名里会用到的对手战绩计算。

除此之外,我也担心另一件事:如果输入数据或者代码里出现了很明显的错误,矩阵运算照样会吐出一个“看起来很像回事”的结果,而我可能根本注意不到。再加上我希望团队成员能够理解我到底在做什么,也想借这个机会自己亲手把 Swiss 轮配对写进代码,更深入理解 Opponents 的计算,所以最后还是选了蒙特卡洛法。

这次模拟器的输入与使用方法

除了前面那两项数据之外,我还会额外输入:

  • 参赛人数
  • 轮数
  • 试行次数

一次完整的大会模拟流程大致如下:

模拟器的处理流程

我把一场 Swiss 赛和 Top 8 结算拆成固定流程,然后把这套流程重复足够多次,观察不同套牌在单位持有人数下的 Top 8 转化率。

1

根据参赛人数与占有率,决定每种套牌各有多少人携带参赛

先把整场比赛的参赛者池构造出来。

2

在每一轮决定配对

按 Swiss 轮逻辑生成当轮对阵。

3

根据预先设定的数值决定胜负

每一组对局都按双方的对局胜率结算结果。

4

重复进行,直到打完规定轮数

Swiss 轮全部跑完为止。

5

计算 Opponents,并选出 Top 8

把对手战绩等因素纳入,决定最终 Top 8 名单。

6

保存每种套牌相对于持有人数的 Top 8 入围率

把这次模拟的结果记下来,供后续汇总比较。

整套流程会按设定的试行次数反复执行。

基于 Nuxt Content

面向长文阅读与 LLM 抓取

《一般 TCG 理论》中文文档站

静态部署版