电子表格平衡技法
Spreadsheet Techniques for Game Balance
Schreiber 与 Romero《Game Balance》第三部分(第 26–37 章,p.639–738)是一套面向数值策划的电子表格教程,示例以 Google Sheets 为主,目标是从"从没听说过"到"熟练自如"。本页整理其中与表格本身的搭建和组织有关的部分(第 26–30、33、34、36 章):基本操作、公式填充与趋势线、相对/绝对引用、成本曲线表的布局与条件格式、单元格类型的配色约定、日期函数和图表,最后列出已经过时或说法有误的地方。随机与统计函数、穷举与蒙特卡洛、洗牌与掉落表、逐回合模拟和矩阵运算(第 31、32、35、37 章)内容较多,单独整理在 电子表格中的随机模拟与矩阵求解。
定位(p.639)
多数设计师爱用电子表格,不爱用的也离不开;即使是老手,也可能从这部分找到没听过的冷门功能。原书推荐 Excel、Numbers、OpenOffice Calc 或 Google 表格;截图多来自 Google 表格,因为它便于分布式团队共享,在业界很流行。第三部分没有讨论题,各章都以"支线"练习收尾。
基本操作中值得记住的几点(第 26–28 章,p.641–657)
- 界面:单元格由列字母和行号定位,当前单元格所在行列的表头会高亮;内容同时显示在单元格和编辑栏中。Excel 与 Numbers 的编辑栏有取消(X)和确认(√)按钮,误点其他单元格把它写进公式时可以用 X 撤回;Google 表格没有这两个按钮。
- 选择:Shift+方向键或拖动选矩形,点行/列表头选整行/列,左上角或 Ctrl+A 全选;选中多行后右键可以一次插入同样多的行。只想让部分列下移时,不能插入整行,要选中后剪切粘贴。
- 插入/删除与清除:清除只清空内容,删除会让下方或右侧的单元格移位;插入、删除行列和剪切粘贴时,引用它们的公式会自动更新。
- 公式与填充:以
=开头,可引用其他单元格;用向下填充 (Ctrl+D)、向右填充 (Ctrl+R) 或拖动填充柄复制公式,引用会随位置相对变化(向上、向左填充只有菜单项没有快捷键)。复制一个单元格再粘贴到选中的多个单元格,也会逐个更新引用,可用于形状不规则的区域。只输入 1、2 两格再拖填充柄,软件会尝试延续简单的数列,复杂规律就会猜错。原书的贸易游戏例子:回报率每行 +50%,利润 = 买价 × 回报,卖价 = 买价 + 利润——线性的回报乘以三角形的买价,增长比两者都快(曲线类型见 数值关系与游戏曲线)。 - 图表与趋势线:线性、多项式、指数、对数、幂、移动平均;可以显示公式(之后可用来外推)和 (0 最差、1 精确通过每个点,没有统一的好坏线,0.988 算强拟合,0.42 应换一种形式)。
- 支线 28.1:A 列 1–100,B 列三角数,再加 10 倍的线性列和每项 ×1.1 的指数列,把恒等、三角、线性、指数四条曲线画在一张图上比较长期形状。
- 支线 29.1 用《EVE Online》中 Megacyte 的需求 与供给 练习画供需曲线(两线交于价格约 5263,本 wiki 计算;经济学背景见 游戏经济系统)。
绝对引用与可调参数(第 29 章,p.659–664)
经验曲线"升到 N 级需要 经验"中, 放在单独的单元格里方便调。公式 =B5*(B5-1)*$C$2 中的 $ 让 C2 在填充时不变(绝对引用),B5 照常相对变化。原则:重复的工作交给电脑,手敲同一公式多次迟早会敲错一次。另外:
- 用背景色区分可调参数和计算结果(没有行业标准,关键是一致);用单元格文字或批注说明复杂公式。Google 表格里"插入备注 (Note)"相当于其他软件的批注,单元格角上显示黑色三角;"评论 (Comment)"则带作者名和"解决"按钮、可多人串楼讨论,用于团队协作提问。
- Ctrl+方向键跳到数据块边缘,Shift+Ctrl+方向键选中整块——所以相关数据应连续存放,不要为了留白插空行空列。
成本曲线表的布局(第 30 章,p.665–680)
- 一行一个游戏对象、一列一个属性,列按类别分组(合并单元格做分组标题、边框分隔);最右边一列用公式把收益加权求和、减去成本和限制。若都换算到恒等曲线,0 表示平衡,正数在曲线之上(太强),负数在曲线之下(太弱),离 0 越远越失衡(方法见 成本曲线与支撑数学)。
- 把复杂公式拆成多个简单列(至少分开成本小计和收益小计),便于理解和查错;计算列用不同底色,表示不应手填。
- 冻结首行首列;条件格式把"收益减成本"列负数标红、正数标绿,或用以 0 为中点的三色色阶显示偏离程度;按该列排序(可加第二排序键),让过强和过弱的对象聚到两端。Google 表格中条件格式规则一旦命中就不再执行后面的规则,顺序很重要。
- 合并单元格的值存放在左上角那一格,引用时只能引用它(例如合并 E2:H5 后引用 E2)。
- 显示格式只改变外观:格式化为整数后输入 1.4 显示为 1,但参与计算仍是 1.4(乘 10 得 14),真实值在编辑栏可见。工具栏还有水平/垂直对齐、自动换行和文字旋转,表头列多时旋转文字能让表更紧凑。
- Google 表格的条件格式不能叠加:原书脚注举例,若要"大于 10 斜体、5–15 加粗",能叠加的软件两条规则即可,Google 表格要拆成三条互不重叠的规则。
- 网格还能当方格纸:支线 30.1 把列宽调成与行高相同,在 20×20 格里画填字游戏、迷宫或地牢;30.2 以每格 32×32 像素在 40×30 格里模拟 1280×960 的 UI 布局(背包界面、FPS 主界面 HUD、主菜单,或按现有游戏截图复刻)。支线 30.3 把第 8 章的成本曲线练习表按本章方法整理:合并单元格分组、冻结首列和前两行、设置数字格式、对"收益减成本"列做三档或渐变条件格式,再排序(别把表头排进去)。
组织与配色规范(第 33 章,p.701–711)
电子表格既是代码也是用户界面——不编译,直接给别人看,所以一致的格式相当于程序员的代码风格。
- 多工作表:每个用途一张表(比把角色、武器、经验曲线散落在一张表的不同区域好找,也比拆成多个文件方便互相引用),引用写作
=Weapons!B5,名字含空格时加单引号='Leveling Curve'!A3;跨表引用同样有相对与绝对之分(=Weapons!$B$5填充时不变)。Google 表格用 Ctrl+Shift+PgUp/PgDn 切换工作表。 - 按单元格类型配色,并在所有表格中保持一致:
| 类型 | 含义 | 原书建议的样式 |
|---|---|---|
| 数据 (data) | 写死的名称、敌人数值 | — |
| 输入 (inputs) | 供设计师调整的成本、属性 | 亮黄色或粗边框,表示"可以改" |
| 计算 (calculations) | 中间公式,拆成小步便于查错 | 浅灰底深灰字,表示"别动、可忽略" |
| 控制 (controls) | 决定走哪套公式的输入(如卡牌类型配合 IF) | — |
| 输出 (outputs) | 最终关心的结果 | 加粗、专用颜色,或用条件格式按数值变色 |
- 成本列和收益列用不同底色,同类收益用同一色系的不同深浅。
- 数据验证:限制输入范围或做下拉列表;也可以给计算列加验证来排错(如概率必须在 0–1 之间)。
- 长文本:自动换行、Alt+Enter 换行;命名区域让公式可读(
=BaseDamage*Multiplier-TargetArmor),命名引用是绝对引用。 - 支线 33.2"词云":用合并单元格、自动换行、逐字换行的竖排文字和各种字体练习文本格式。
- 支线 33.1"人还是机器":穷举 10 次抛硬币的 1024 种结果并计算最长连串,再让朋友凭空写 10 次"随机"结果,与随机抽取的一行比较——最长连串更长的那行多半是真随机(人类的偏差见 概率直觉与认知偏差)。本 wiki 穷举:最长连串为 1–10 的序列数依次为 2、176、370、254、126、56、24、10、4、2,最长连串 ≥ 4 的概率约 46%。
日期与时间(第 34 章,p.713–716)
- 日期可以加减:
=IF(G7<TODAY(),"OVERDUE","")标出逾期任务;另有WEEKNUM、MONTH、YEAR、NOW、HOUR/MINUTE/SECOND,以及COUNTBLANK、COUNTA、ISBLANK统计完成情况。支线 34.2 用NOW()在表格里做一个每秒 +1 经验、三角升级曲线的放置游戏。 TIMEVALUE返回一天中已过去的比例,乘 86400 得秒数;日期时间直接加小数也行(=NOW()+0.25是 6 小时后)。TODAY()/NOW()和RAND()一样只在重算时更新,Google 表格可在设置里改为每分钟或每小时重算。- 支线 34.1 做任务清单:完成的留空、过期显示 OVERDUE、否则显示剩余天数,顶部统计未完成与逾期数。支线 34.2 的进阶挑战用 Google 表格的"插入 > 绘图"做按钮并配脚本,每点一下 +1 经验;终极挑战加入可购买的加速道具。
- 逐回合模拟(迭代计算、逐行展开)见 电子表格中的随机模拟与矩阵求解。
粘贴与图表(第 36 章,p.723–730)
- 选择性粘贴—仅粘贴值:把
RAND()的某次结果"冻结"下来(如给跑团角色掷一次属性就固定);转置粘贴:行列互换,3×4 变 4×3,公式一并保留;也可以只粘贴格式;格式刷:选一个无格式的空单元格、点格式刷、点左上角全选,三下就能清空整张表的格式。 - 图表一定要有标题和坐标轴标签(图表脱离表格时也能看懂);坐标轴范围要手动检查(数据在 0–1 时默认可能画到 1.2);可以在图表编辑器里修改或新增数据系列。
- 散点图画无序的 点;折线图按顺序连点,看随 x 变化的趋势(如 DAU 随时间、平均时长随等级);要用一行/列当 x 轴标签,数据未排序时会连成一团乱线,先排序或勾选"聚合";柱形图(Google 表格称 column chart)便于逐点比较多组数据。
- 可以加误差线(如标准误差):两点的误差线重叠通常说明差异不显著,误差线长说明数据不可靠。
SPARKLINE(数据, {"charttype","line"})在单元格内画迷你图,选项写在花括号里、多个选项用分号分隔,适合每行一张小图(如 MMO 几十个区域的人数随时间变化,或成本曲线上各对象的强度)。支线 36.1 用十行数据,把 5 的倍数、前十个三角数(1 到 55)、– 和RANDBETWEEN(1,50)四列画在同一张图并各配一个迷你图,再把随机列"仅粘贴值"固定下来。
原书已过时或需注意的地方
与随机函数、模拟和矩阵运算相关的更正见 电子表格中的随机模拟与矩阵求解。
| 原书说法 | 现状 / 更正 |
|---|---|
| Google 表格中用 Ctrl+R 强制重算(第 31、32、34 章),而第 28 章又说 Ctrl+R 是"向右填充",第 37 章还称两者是"同一个快捷键" | Google 表格的 Ctrl+R 是向右填充,没有强制重算的快捷键;可以编辑任意单元格触发重算,或在"文件 > 设置 > 计算"里设置按分钟/小时重算。Excel 是 F9 |
| Google 表格不能(直接)在单元格里放复选框 | 现在可以通过"插入 > 复选框"添加(Google 文档编辑器帮助"使用复选框") |
CONCAT 可接任意多个参数,示例 =CONCAT(J1," of ",K1) | Google 表格的 CONCAT 只接受两个参数,三个以上要用 CONCATENATE 或 &;Excel 2019 起的 CONCAT 可接多个参数 |
| 第 28 章用 生成"前一百个三角数" | 该式得到 0、1、3、6……,即第 个三角数;从 1 开始的三角数是 (第 36 章支线写的 1 到 55 就是这一种) |
| 按住 Shift 点击可以选中不相邻的多个单元格,再次 Shift+点击取消(第 27 章) | Shift+点击是把选区扩展成矩形;选不相邻的单元格要按住 Ctrl(Mac 为 Cmd)点击(Microsoft 支持文档"在工作表上选择单元格内容";Google 表格同理) |
| 指数趋势线拟合 形式的曲线(第 28 章) | 表格软件的指数趋势线是 ,有两个参数(Microsoft 支持文档"趋势线选项"中 Exponential 的公式为 ) |
| Google 表格没有缩放命令,只能用浏览器缩放(第 33 章脚注) | 现在工具栏有"100%"缩放下拉框,也可在"查看 > 缩放"中设置 50%–200%(Google 文档编辑器帮助"缩放或更改文档视图") |
TIMEVALUE() 以日期时间为参数,0 是午夜、1 是晚上 11:59(第 34 章) | Google 表格与 Excel 的 TIMEVALUE 参数都是时间字符串(如 "14:15"),返回值在 ,23:59:59 约为 0.99999(Google 文档编辑器帮助 TIMEVALUE);要取 NOW() 当天已过的比例可用 =MOD(NOW(),1) |
WEEKNUM() 返回 1–53(第 34 章) | 默认的"含 1 月 1 日的那周为第 1 周、周日起算"规则下,从周六开始的闰年最后一天会落到第 54 周,如 2000-12-31、2028-12-31(本 wiki 按该定义计算) |
支线 33.1 脚注的连串公式 IF(B1=A1,K+1,1) | 应为 IF(B1=A1,K1+1,1),少了行号 |
(菜单路径以 2026 年的 Google 表格与 Microsoft 365 为准,界面可能继续变化。)
出处
- Game_Balance_-_Ian_Schreiber_Brenda_Romero.pdf
- Ian Schreiber & Brenda Romero《Game Balance》第 1 版(CRC Press, 2022, ISBN 978-1-4987-9957-7)第三部分 Spreadsheets,第 26–37 章(印刷页 p.639–738)