中EN
概念页

模拟试玩与人工玩家

Simulated Playtests & Artificial Players

简单的赌博游戏(21 点、轮盘)可以直接算胜率;复杂而带随机的游戏必须玩很多次才知道是否平衡。Machinations 工具提供人工玩家 (Artificial Player, AP):用简单脚本代替人点击节点,配合快速运行与批量运行收集上千局统计。Adams & Dormans 用它做了两个完整案例:给两人版《大富翁》加入房屋与房产税(动态摩擦)来遏制动态引擎;给 Will Wright 的假想 RTS SimWar 调参,使"乌龟流"与"速攻流"从 929:68 调到 500:500。核心纪律:人工玩家要做成始终坚持一种策略的漫画式角色;调机制,不调人工玩家;一次只改一处并先大幅改动。

人工玩家与脚本(第 8 章 Simulated Play Tests,印刷页约 p.171–174)

人工玩家在图中是一个写着 AP 的小方块,不与任何节点相连;有颜色、线宽、标签和激活模式(同其他节点,见 Machinations 图示语言),可以激活任何有名字的节点(不限于交互节点)。作者注明脚本远不如关卡编辑器的脚本语言强大,不需要会编程。

执行语义:AP 触发时从上到下逐行求值;直接命令立即执行;if(条件) 命令 在条件为真时执行;任何命令一旦执行,本次脚本即停止。因此两条直接命令连写时第二条永远不会执行,也不需要 else——一串 if 就是"第一个为真的分支"。下次触发再从头求值。对程序员来说,它相当于一个每次触发都从头扫描的优先级规则表 (Priority Rule List),类似行为树中无记忆的 Selector(见 状态模式与有限状态机)。

命令语义
fire(node)触发标签匹配的节点(大小写敏感);无参数或无匹配时脚本终止、不触发
fireAll(n1,n2,…)同时触发全部列出节点
fireSequence(n1,n2,…)每次执行轮到下一个,循环;如 fireSequence(Produce, Produce, Upgrade, Produce, Consume)
fireRandom(n1,n2,…)随机选一个;重复写名字提高权重,fireRandom(Produce, Produce, Consume, Upgrade) 为 50%/25%/25%
stopDiagram(message)立即停止图(类似终止条件);批量运行时统计每条消息出现次数
endTurn()结束回合制图的当前回合
activate(ap) / deactivate()停用自己并激活另一个 AP / 停用自己
  • 颜色编码的图中,AP 只能触发与自己同色的节点。回合制图中,AP 每回合有若干"行动数",多个行动按一秒间隔执行。

表 8.1 脚本条件中的运算符(转写自原书图片表)

运算符含义示例
==相等if(Resources == 1) fire(Consume)
!=不等if(Upgrades != 0) fire(Upgrade)
<= < >= >关系if(Resources <= 3) fire(Produce)
+ -加减if(Upgrades + 2 < Resources - 1) fire(Produce)
* / %乘除取模if(Upgrades * 2 > Resources / 3) fire(Upgrade);if(Resources % 4 == 2) fire(Upgrade) 在资源为 2、6、10… 时触发
&&逻辑与if(Resources > 4 && Upgrades < 2) fire(Upgrade)
||逻辑或if(Resources > 6 || Upgrades > 2) fire(Consume)

特殊值

值含义
random每次求值生成 [0,1) 随机实数;if(random < 0.25) fire(A) 即 25% 概率;if(random * 100 > Resources) fire(Produce) 使触发概率随资源增多线性下降,资源到 100 时永不触发
pregen0…pregen910 个 [0,1) 随机值,只在图启动时生成一次,整局不变——用来让同一脚本每局略有不同的"性格"
actionsAP 已触发的次数
steps图已执行的时间步数
actionsOfCommand该 if 后命令已执行的次数
actionsPerStep本时间步内 AP 已触发的次数

例:if(Resources>4) fireRandom(Consume, Upgrade) 后接 fire(Produce)——先攒到 5 个资源,再随机消费或升级。

批量运行与数据收集(第 8 章 Collecting Data from Multiple Runs,印刷页约 p.174)

  • 快速运行 (Quick Run):极快执行、不可交互;必须有能到达的终止条件,否则手动停止。
  • 批量运行 (Multiple Runs):默认 100 次可改;单次超过 10,000 时间步未到终止条件自动停止;统计各终止条件到达次数(两人各有胜利条件即可直接得胜率)与平均用时(比较哪个脚本最快把经济推到目标状态)。
  • 图表保存每次运行的数据,默认显示最近 25 次(当前运行高亮),可翻页、清除、导出 CSV 到表格或统计软件。
  • 本书前几章给出的胜率数字就是这样从上千次模拟中得来的。

这本质上是对游戏经济的蒙特卡洛模拟 (Monte Carlo Simulation):胜率估计的标准误约为 p(1−p)/N\sqrt{p(1-p)/N},N=1000N=1000、p=0.5p=0.5 时约 1.6 个百分点,所以下文表格中相差几十局的行之间才有意义(这是本 wiki 的补充,不是原书内容;随机源见 伪随机数生成)。

设计人工玩家策略(第 8 章 Designing Artificial Player Strategies,印刷页约 p.174–175)

  • AP 不能代替真人,也写不出聪明的 AI;目的是测试简单策略以观察机制如何运转。最好把 AP 设计成漫画式角色:无论后果如何都坚持一种策略。例如想知道 RTS 最佳兵种组合,就写几个分别造不同组合的 AP 互打。AP 也可设为被动/自动,运行中点击切换,方便快速切换对手。
  • 写对 AP 策略常要试好几次,这本身就是探索设计的好办法;理想情况是能找到很多有效策略。若能写出一个总是打败其他 AP(或你自己)的 AP,多半找到了优势策略,应修改机制降低其效果。
  • 去除所有随机以暴露优势策略(随机会掩盖产生优势策略的模式,见 概率与期望值):百分比随机用均值分数代替(20% 概率的源→固定产率 0.2,即每 10 步 2 个);多骰子分布不均匀,建议用均值

Xˉnds=(s+1) n2,3d6: (6+1)×32=10.5\bar{X}_{n\text{d}s}=\frac{(s+1)\,n}{2},\qquad 3\text{d}6:\ \frac{(6+1)\times 3}{2}=10.5

脚本中的 fireRandom() 换成顺序版本,random 条件换成基于 steps 的周期条件,如 if(random < 0.3) fireRandom(A, B, B, C) → if(steps % 10 < 3) fireSequential(A, B, B, C)。连接标签和脚本都去随机后,每次运行结果相同,适合判断一种策略是否真的优于另一种。

  • 链接人工玩家:长脚本可拆给多个 AP,一个 AP 触发另一个(被设为交互的)AP,如 builder、attacker,再用第三个 AP fireRandom(builder, attacker) 随机选择。
  • 警告:如果你得花大量时间才能写出能控制住经济的 AP,通常说明经济本身有问题。AP 不应聪明到能赢下一个对玩家不公平的游戏——它们是为了暴露问题而非掩盖问题。调你的机制,不要调你的人工玩家 (Tune your mechanics, not your artificial players)。

案例一:两人版《大富翁》(第 8 章 Playing with Monopoly,印刷页约 p.175–187)

模型与前几章不同:两人对战,收租/付租由两个在玩家间转移金钱的门实现——每块地产给对方每时间步 4% 概率付 1 单位钱;可用地产只有 20 块(Available 池),买完即止。两个 AP 的脚本都是:

if((random * 10 < 1) && (Money > 4 + steps * 0.04)) fire(Buy)

即每步 10% 机会买地,但要保留随时间增长的最低存款(初始 >4)——因为对方地产越多,连续付租的可能越大,储备要越来越多。

实验设置观察
基线(图 8.5/8.6)两个相同 AP、带随机前约 90 步双方金钱大致平稳,之后逐渐上升——典型的动态引擎正反馈(见 机制设计模式);趋势线为作者手绘示意
去随机(图 8.7/8.8)steps % 10 < 1 代替 random * 10 < 1趋势非常清晰;两条曲线完全重合
运气差(图 8.9)红方 steps % 20 < 1、0.02红方买地机会减半;金钱曲线起初差别不大,但地产数才是真正的实力指标
随机化经过起点(图 8.10)产率恢复为 2/(3+D5)2/(3+\text{D5}),即每 4–8 回合得 2影响不大,不改变主趋势——经过起点对游戏影响不显著
随机化收租(图 8.11)—影响更大,但不破坏总趋势(有时红方钱少而买地更少)
随机化买地机会(图 8.12)蓝 random * 10 < 1、红 random * 20 < 1影响最大:改变地产分布,进而改变金钱分布
全部随机(图 8.13)红方仍只有一半买地机会双方命运更多变,但红方很少赢

租金与收入的平衡:多数运行没有胜者——只要经过起点的收入能弥补房租,游戏就无限进行,因为模型缺少真实游戏中的租金通胀:房屋与旅馆。加入"投资房屋"机制(图 8.14),房屋提高收到大额租金的机会;AP 脚本第二行:

if((random * 10 < 1) && (Money > 4 + steps * 0.04)) fire(Buy)
if((Property > Houses / 5) && Money > 6 + steps * 0.04)) fire(Invest)

去随机、提高起点收入、一方投资房屋一方不投资:不投资时双方一样稳定增长(图 8.15 紫线),投资方(蓝)获胜。经过起点再也无法抵消上涨的租金:双方都投资、起点收入 5/(3+D5)5/(3+\text{D5}) 时 1,000 次非确定运行约 75% 有胜者(双方机会均等),25% 拖到工具强行停止;起点收入 2/(3+D5)2/(3+\text{D5}) 时拖延概率降到 0;高收入并把租金通胀效果加倍时,进入均衡的概率降到 2%。

加入动态摩擦(房产税):现在地产的力量又太强——地产多于对手就是最强的胜负指标,动态引擎过于主导。附录 B 给出解法:用动态摩擦遏制正反馈。加一个每 6 时间步从玩家 Money 池抽钱的泄,抽取量由 Houses 与 Property 池通过状态连接调节(图中税率为每栋房 6%、每块地 30%;真实桌游里也有不同形式的房产税)。

flowchart LR
  Go[/"经过起点 2/(3+D5) 自动"/] --> M((Money))
  M -->|3| Buy>"[AP] 买地"]
  Avail((Available 20)) --> Buy
  Buy --> P((Property))
  M --> Inv>"[AP] 投资"]
  Inv --> H((Houses))
  P -.->|"+ 对方付租概率"| Rent{"收租门"}
  H -.->|"+ 租金"| Rent
  Rent --> M
  M -->|"每 6 步"| Tax[\"房产税 泄"/]
  P -.->|"+0.3"| Tax
  H -.->|"+0.06"| Tax

表 8.2 不同房产税率的效果(1,000 次模拟;蓝方买 14 块、红方买 6 块;双方都在最早机会买地和房)

税率 地产/房屋蓝胜红胜无胜者
无税632152216
0.1 / 0.02557314129
0.2 / 0.0447250325
0.3 / 0.064565422

税率上升时蓝方的优势下降,超过某点后地产反而成了负担。设置得当的税确实起到动态摩擦的作用。作者指出 AP 都在最早机会买地买房,有税时这未必是最佳策略,保守一些可能更好;税也减少了"无胜者"结局——摩擦有助于防止僵局,这也是理想的特性。

案例二:平衡 SimWar(第 8 章 Balancing SimWar,印刷页约 p.187–194)

SimWar 是 Will Wright 在 GDC 2003 上提出的假想极简战争游戏(据作者所知从未被实际制作),只有三种单位,都用工厂产出的资源建造:

单位成本规则
工厂5产出资源;工厂越多资源越多
防御单位1不能移动
进攻单位2唯一可移动单位;与敌方防御单位相遇时各有 50% 概率消灭对方

Wright 认为这个极简 RTS 仍有有趣的选择和同类游戏的动态行为:三者构成石头剪刀布——造工厂胜过造防御、造防御胜过造进攻、造进攻胜过造工厂;还有短期与长期的取舍,以及让人联想到"乌龟流 (Turtling)"与"速攻流 (Rushing)"的高风险高回报策略。乌龟流先建防御与产能、挡住进攻,再用产能优势组织大波进攻压倒对方;速攻流趁对手还没站稳就早早进攻,一般被视为高风险高回报,更考验技术(需要很高的 APM)。

建模(结构同 常见类型的经济机制 中的 RTS 示例):

flowchart LR
  U(("未采资源 自动池")) -->|"0.25 × 工厂数"| R((Resources))
  R -->|5| BF>"[点击] BuildF ≥5 才拉取"]
  BF --> F((Factories))
  F -.->|"+0.25 产率"| U
  R -->|1| BD>"[点击] BuildD 蓝"]
  R -->|2| BO>"[点击] BuildO 绿"]
  BD --> Def(("Defense 蓝+绿"))
  BO --> Def
  Def -->|"只拉绿色"| Atk(("[点击] Attack"))
  Atk --> X1[\"概率消灭敌方防御"/]
  Atk --> X2[\"敌方无防御时 概率摧毁工厂"/]
  • 生产部分是典型的动态引擎:工厂越多产出越快、又能造更多工厂;但资源总量有限,只造工厂未必最好。注意结构要求开局至少有 5 资源或 1 座工厂,否则永远无法开始生产。
  • 颜色编码:防御单位(蓝)与进攻单位(绿)都进入 Defense 池,点击 Attack 池只拉走绿色资源,所以只有进攻单位能发起攻击。
  • 战斗:每时间步,一方每个进攻单位有机会消灭对方一个防御单位,防御单位同样有机会消灭进攻单位;进攻单位摧毁工厂的泄只在对方没有防御单位时生效。两人版完全对称(左蓝绿、右红橙)。
  • 实力的任意定义:每座工厂 5 分、防御单位 1 分、后备进攻单位 1 分、正在进攻的单位 2 分。两个相同策略的 AP 打出看似势均力敌的曲线,但策略相同时不能据此断定平衡。

策略脚本:

// random turtle(配套网站版本,用 pregen 让每局略有不同)
if(Defense <= 3 + pregen0 * 3) do(BuyD)
if(Factories <= 2 + pregen1 * 3) do(BuyF)
if(Defense > 6 + pregen2 * 3 && random < 0.2) do(Attack)
if(Resources > pregen3 * 4) do(BuyO)

// turtle:先 4 防御 4 工厂,共 10 个以上单位才进攻
if(Defense < 4) fire(BuyD)
if(Factories < 4) fire(BuyF)
if(Defense > 9 && random < 0.2) fire(Attack)
if(Resources > 3) fire(BuyO)

// rush:2 防御 1 工厂即开始造进攻单位,起初快速出波,随时间攒更大的波
if(Defense < 3) fire(BuyD)
if(Factories < 2) fire(BuyF)
if(Defense > 5 + steps * 0.05 && random<0.2) fire(Attack)
if(Resources > 1) fire(BuyO)

除了进攻时机的随机,这两个脚本策略非常一致,最适合判断哪种更有效。1,000 次模拟显示乌龟流远远占优,约 92% 获胜;速攻方的胜利很大一部分来自乌龟方耗尽资源(这不常发生)。配套网站上的黑色 AP 不是对手,只在僵局时停止游戏。

表 8.3 调整生产成本的效果(每行 1,000 次自动运行,每行之间手动改图)

调整乌龟胜速攻胜平局/超时平均用时
无调整92968370.97
防御成本 1.5890105574.27
防御成本 2.0660337377.88
防御成本 2.5515480574.04
工厂成本 6844154278.81
工厂成本 7792204488.07
工厂成本 87102781298.53
工厂成本 956840131107.87
工厂成本 1045550936107.61
进攻成本 1.891483367.77
进攻成本 1.6888112063.86
进攻成本 1.4802198058.31
进攻成本 1.2653347052.33
进攻成本 1.0506494048.33

作者结论:提高防御成本对乌龟/速攻平衡影响不大,只有防御单位贵过进攻单位、成为很差的选择时乌龟才开始更常输——平衡主要取决于生产与进攻单位之间的成本关系,与进攻/防御之间关系不大。提高工厂成本起初延长平均时长(建产能更慢),但很高的工厂成本偏向赢得更快的速攻流,到高成本时后一效应压过前者,时长趋于稳定。

表 8.4 其他调整的效果

调整乌龟胜速攻胜平局/超时平均用时
无调整92968370.97
产率 0.20847152188.99
产率 0.157502482124.34
产率 0.1039656539208.56
进攻火力 30%91981065.22
进攻火力 35%863137059.43
进攻火力 40%811189056.55
进攻火力 45%755245056.07
进攻火力 50%627373051.95
初始资源 4883114376.43
初始资源 3885114179.26
初始资源 2877122184.95
初始资源 1855144189.51
初始资源 0797200398.73
可用资源 11093763069.85
可用资源 12094951069.43
可用资源 13094555071.11
可用资源 20097030071.18
可用资源 9091184573.12
可用资源 808601251580.82
可用资源 708391342785.96

(转写自原书图片表;所有行三项之和均为 1,000。可用资源越多越偏向乌龟,越少越偏向速攻且僵局增多。)

最佳平衡大概要组合多种调整:作者兼顾平均时长,选择产率 0.20、工厂成本 7、进攻火力 35%,两种策略恰好各胜 500 次,平均 83.02 时间步。

"一次只改一处,并夸大改动":同时改两处就分不清各自的效果;先做很大的改动,确认它确实有效且方向正确,之后总可以退回到原值与新值的中间。这与 Schell 引用 Sid Meier 的"加倍与减半"同出一辙(见 游戏平衡)。

从模型到游戏(第 8 章 From Model to Game,印刷页约 p.194)

平衡好 Machinations 图并不保证游戏自动平衡:图是抽象视角、缺乏细节,真实游戏的表现会略有不同;设计越接近图,图上的平衡越能直接迁移。Machinations 无法考虑人类玩家的特殊行为(如虚张声势)或战争游戏中的战略机动。但只要图的结构与机制结构一致,某些效应会相似——例如"工厂与进攻单位的相对成本对乌龟/速攻平衡影响很大"这一发现能指导完整实现的平衡;在图上试玩,也能预先认出完整游戏试玩时会涌现的玩法模式。

程序员视角:把它搬进自己的引擎

  • Machinations 工具基于 Flash 已停用(见 Machinations 图示语言),但方法可直接移植:把经济写成无渲染、可固定时间步推进的纯逻辑(见 游戏循环与更新方法),用可设种子的 PRNG,以命令行批量跑上千局并输出 CSV。
  • "AP 脚本=优先级规则表"可直接用作单元测试中的机器人策略;"去随机"对应固定种子或用期望值替换随机分布,使回归测试可复现。
  • 作者的警告同样适用于自动化测试:机器人策略越来越复杂才能"通关"时,问题在设计而非机器人。

原书问题

  • 表 8.1 乘除行的说明有误:示例 if(Upgrades * 2 > Resources / 3) 的说明写成"升级数乘 2 大于升级数除以 3",按表达式应为"大于资源数除以 3"。
  • 房屋投资脚本括号不配对,且与说明不符:if((Property > Houses / 5) && Money > 6 + steps * 0.04)) 多一个右括号(左 3 右 4);说明称"地产数超过房屋数的五倍时投资",但条件 Property > Houses / 5 等价于"房屋数少于地产数的五倍",即每块地最多约 5 栋房(与《大富翁》每地 4 栋房后升旅馆的规则相近)。按说明应写作 Property > Houses * 5。
  • 命令名不一致:命令表介绍的是 fireSequence(),去随机一节却写 fireSequential();random turtle 脚本用 do(BuyD),而命令表只有 fire() 系列,节点名在建模部分又叫 BuildF/BuildD/BuildO,脚本中为 BuyF/BuyD/BuyO。以 Machinations 工具实际命令为准时应使用 fire...(本页按原文照录)。
  • 与表 8.3 不符的结论:"只有防御单位贵过进攻单位时乌龟才开始更常输"——表中防御成本 2.5(已高于进攻单位成本 2)时仍是乌龟 515 胜、速攻 480 胜,乌龟并未更常输,只是接近持平。另"工厂成本到 8 及以上时平均用时稳定",表中 8→9 仍从 98.53 增至 107.87,稳定发生在 9 以后。
  • "乌龟流约 92% 获胜"与表 8.3 的 929/1000(约 93%)略有出入,属取整问题。
  • random turtle 脚本"先建 4–6 个防御单位":条件 Defense <= 3 + pregen0*3 在 Defense 达到 ⌊3+3 pregen0⌋+1\lfloor 3+3\,\text{pregen0}\rfloor+1 前持续建造,即 4–6 个(pregen0 接近 1 时可到 6),与原文一致;工厂"3–5 座"同理。

与 Schell 的对照

问题Schell(游戏测试、游戏平衡)Adams & Dormans(本章)
平衡靠什么真人试玩+数学模型+直觉,"记录模型,边调游戏边调模型"先在可执行的抽象模型上用人工玩家跑上千局,再用真人验证
调参步长加倍与减半(Sid Meier)一次只改一处,先大幅改动,再取中间值
局限强调真人才能告诉你体验承认 AP 不能代替真人,模型无法表现虚张声势与战略机动

两者并不冲突:A&D 的模拟只回答"经济结构是否偏向某策略",Schell 的试玩回答"玩家感觉如何"。

  1. Game_Mechanics_Advanced_Game_Design_-_Ernest_Adams.pdf
  2. Ernest Adams & Joris Dormans《Game Mechanics: Advanced Game Design》第 1 版(New Riders, 2012, ISBN 978-0-321-82027-3)第 8 章 Simulating and Balancing Games(PDF p.246–278,印刷页约 p.171–195)

相关页面

游戏策划游戏平衡Game Balance平衡就是调整游戏元素直到它们传达你想要的体验;它用到简单数学,却被认为是游戏设计中最艺术的部分,像调配食谱的用量。Schell 列出十二种最常见的平衡类型(公平、挑战与成功、有意义的选择、技能与运气、头与手、竞争与合作、短与长、奖励、惩罚、自由与受控体验、简单与复杂、细节与想象),再给出通用平衡方法、游戏经济的平衡和对动态难度的提醒(第 3 版第 13 章 Game Mechanics Must Be in Balance;第 1 版为第 11 章)。游戏策划游戏测试Playtesting游戏测试是把幻想中的玩家体验拉回现实的"闹钟"。Schell 区分四种测试——焦点小组、QA、可用性测试、游戏测试——本章只谈设计师最关心的游戏测试:请人来玩,看游戏是否产生了它被设计要产生的体验。Schell 坦白自己讨厌测试(怕别人不喜欢自己的游戏),但这正是测试的意义。每次测试由六个问题定义:为什么、谁、何时、在哪、看什么、怎么做(第 3 版新增"何时"),并补充 WUBALEW、FFWWDD 等 Schell Games 的实用做法(第 3 版第 28 章 Good Games Are Created through Playtesting)。游戏策划Machinations 图示语言Machinations DiagramsMachinations 是 Joris Dormans 设计的可视化语言与在线模拟工具,用于创建、记录、模拟和测试游戏的内部经济。其理论前提是:玩法最终由有形、无形与抽象资源在游戏系统中的流动决定。图由存放资源的节点 (Nodes)、搬运资源的实线资源连接 (Resource Connections)、以及用当前状态去修改别处的虚线状态连接 (State Connections) 组成;语法足够严格,可被计算机按时间步执行,接近一种专门表示游戏机制的可视化编程语言。本页按第 5 章整理全部基本元素与《吃豆人》建模示例,并给出本 wiki 用 Mermaid 改画 Machinations 图游戏策划机制设计模式Mechanics Design PatternsAdams & Dormans 把游戏机制结构中反复出现的模式称为设计模式,用 Machinations 图描述,组成一套以"内部经济结构→涌现玩法"为质量观的模式语言 (Pattern Language)。第 7 章介绍历史与用法,附录 B 按 GoF 格式详述 16 个模式:引擎 (Engines) 4 个、摩擦 (Friction) 4 个、升级 (Escalation) 3 个、杂项 5 个。模式之间存在细化 (Elaboration) 关系:所有引擎都是源的细化、所有摩擦都是泄的细化,可借细化/简化调整设计的复杂度与焦点。游戏策划常见类型的经济机制Common Genre MechanismsAdams & Dormans 第 6 章 "Example Mechanics" 用 Machinations 图逐一拆解各类型游戏的典型经济机制:动作游戏的道具与收集品、竞速游戏的橡皮筋、RPG 的经验与等级、FPS 的弹药与生命、RTS 的采集/建造/战斗与科技树。作者刻意把机制单独隔离建模——完整游戏的图很快变得复杂,而透彻理解每个组件是理解整体动态的第一步(尽管涌现型游戏的整体总是大于部分之和)。游戏策划概率与期望值Chance & Expected Value机会 (chance) 是 Schell 七类机制的最后一类(第 3 版第 12 章 Mechanic 7: Chance;第 1 版为第 10 章、六类中的第六类),涉及其他五类之间的交互:机会意味着不确定,不确定意味着惊喜,而惊喜是乐趣的秘密成分。设计师要掌握十条概率规则、会算期望值 (expected value),并同时考虑实际概率与玩家的感知概率,以及技能与运气的五种纠缠(第 10 章)。游戏策划反馈回路Feedback Loops反馈回路 (Feedback Loop):系统某部分变化的效果在稍后回过头来影响同一部分。负反馈 (Negative Feedback) 抑制变化、产生均衡;正反馈 (Positive Feedback) 放大变化、制造军备竞赛或下行螺旋。Adams & Dormans 把反馈回路视为涌现的三大结构特征之一(第 3 章)、经济形状的主要成因(第 4 章),并在第 6 章给出反馈的七种属性与篮球、《大富翁》等案例分析。游戏数学伪随机数生成Pseudorandom Number Generation游戏引擎到处要用随机数,但随机数生成器 (RNG) 并不真正随机:它只是给出一个复杂但完全确定、预先定义的序列,因此严格说应叫伪随机数生成器 (PRNG)。好坏取决于周期(多久重复)和能否通过各种公认的随机性测试。GEA 介绍了线性同余、梅森旋转、Marsaglia 的 Mother-of-All / Xorshift / KISS99,以及 PCG。游戏开发游戏循环与更新方法Game Loop & Update Method游戏循环 (Game Loop) 让游戏时间的推进与玩家输入和处理器速度脱钩:每一轮非阻塞地处理输入、更新状态、渲染,并跟踪真实时间来控制节奏;最常推荐的做法是“固定更新步长、可变渲染”。更新方法 (Update Method) 是它的搭档:世界维护一组对象,每个对象实现一个模拟“一帧”行为的 update(),每帧依次调用。两者和组件模式一起常被视为游戏引擎的核心。游戏开发状态模式与有限状态机State Pattern & Finite State Machines状态模式 (State Pattern) 把对象“依赖状态的行为”分散到各个状态类中,对象只持有指向当前状态的指针并把调用委托给它,状态切换就是换指针。它是实现有限状态机 (Finite State Machine, FSM) 的一种方式。FSM 能用很强的结构约束理清一团乱麻的标志位代码;状态组合爆炸、需要复用和需要“回到之前状态”时,分别用并发状态机、分层状态机和下推自动机来扩展。游戏策划经济建造游戏设计Designing Economy-Building Games大多数游戏的内部经济结构固定不变(如《大富翁》),而经济建造游戏 (Economy-Building Games) 让玩家亲手添加源、泄与连接,自己搭出经济结构——典型的是建造与管理模拟及策略游戏(《文明》《模拟城市》、程度较轻的《星际争霸》)。因为每局玩家接线不同,不可能画出"一张大图",Adams & Dormans 改为两个层次建模:主导经济结构 (Dominant Economic Structure)(抽象层,玩家的经济会趋向的模板)与构建块 (Building Blocks)(具体建筑的机制,带可多方式连接的输入输出)。第 9 章用《凯撒大帝 III》做分析,再从零设计桌面原型 L游戏策划进程机制Progression Mechanisms第 11 章研究驱动进程的机制,目标是找到比商业游戏常用的更具涌现性的进程机制。前半章讨论锁钥机制 (Lock-and-Key Mechanisms):先锁后钥的理由、如何把线性任务映射到非线性空间、能力即钥匙、用 Machinations 编目各种锁钥,以及加入动态引擎和动态摩擦的动态锁钥。后半章放弃"角色穿越空间走向目标"的观点,把进程定义为游戏状态向目标状态的变化:把进度当作资源,进一步让进度经多种资源间接产生(《Elite》《卡坦岛》《模拟人生》),并用玩法阶段 (Gameplay Phases) 及引起相变的设计模式组织节奏。作者认为这可能弥合 Juul 所说的进程型与涌现型游戏之间游戏策划有意义的机制Meaningful Mechanics第 12 章(全书最后一章)讨论怎样用机制而不是表现层传达信息。游戏是唯一一种由机制生成信号的媒介:设计师造的是一台产生信号的机器,玩家通过与它互动、观察输出,自己推断出信息。章节内容依次是:严肃游戏与游戏化;传播模型与 Jakobson 的诗性功能;机制如何发送信息(《模拟城市》、PeaceMaker)以及伦理灰区(《GTA III》);符号学的三类符号(图像、指示、象征),以及科学模拟与游戏模拟的区别;抽象(消除与简化)与"模拟会说谎"(《美国陆军》);类比模拟(《暗黑破坏神》的格子背包、生命值)与象征模拟(骰子、踩敌人);"少即是多"与 Chomsky 的离散无限;Eco 的多层意义(《游戏策划游戏经济系统Game Economic Systems经济系统 (Economic System) 处理资源如何产生、玩家如何通过生产/获取/交易控制资源、以及资源如何被消耗。Schreiber 与 Romero 区分固定、玩家动态、F2P、声望、真实货币五种经济,用供给与需求、边际、替代品与互补品、市场价格解释玩家行为,并系统讨论通货膨胀(供给侧、需求侧)的成因与对策、开放与封闭经济的平衡方法(第 6 章,p.101–132)。游戏策划成本曲线与支撑数学Cost Curves & Supporting Math成本曲线 (Cost Curve,亦称 Cost/Power Curve、Power Curve) 描述一个对象"花了什么"(资源成本、缺点、限制、稀有度)与"得到什么"(收益)之间的数学关系;支撑数学 (Supporting Math) 则把每一项属性、能力、限制都换算成锚点单位。两者就位后,新对象可以直接算价、旧对象可以直接判定在曲线之上 (above the curve) 还是之下。Schreiber 与 Romero 给出 PvP 与 PvE 的建曲线方法、新游戏的起步做法、从已发售游戏(以《万智牌》为例)反推成本曲线的步骤,以及六条通用准则(第 8 章,p.157–191)。游戏策划复杂系统与涌现Complex Systems & EmergenceAdams & Dormans 第 3 章把玩法看作游戏这一复杂系统 (Complex System) 的涌现属性:涌现处于有序与混沌之间,只有系统运转起来才会出现,所以只能靠原型与测试。借助复杂性科学,作者提炼出促成涌现的三个结构特征——活跃且相互连接的部件、反馈回路、不同尺度上的行为——并引入 Fromm 的涌现分类,作为 Machinations 框架的出发点。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原