2026-11-09 17:37:28
最近有网友用 AI 逆向了智能 ABC ,把里面的笔划码表导了出来,用 RIME 复刻了一版。
众所周知,我是 ABC 的忠实用户。从 DOS 版天汇 ABC 用到 Windows 上智能 ABC 彻底退役,一直念念不忘。在 10 年前我曾经动过念头自己写一个,后来被 IME 开发的繁杂劝退了。当时用 C 从头写了一个简单的 IME 框架,又给网上不少开源的 IME 框架提过 PR ,最终没坚持下来。有朋友提醒我说 RIME 经过过年的发展已经可以高度定制了,我一直没在意,直到这次、我才正正经经的研究了它。
试用了上面那个智能 ABC 复刻版,和我记忆中的手感还是有不少差距。原本我想先在这个基础上改改的,随之发现改不太动 AI 生成的代码。细想了一下,在 RIME 基础上做开发工作量并不大。而关键的码表已经是现成的了,就自己动手玩了一下,果真一天时间就搭了个雏形。最花时间的倒不是实现,而是搞明白 RIME 的逻辑。这部分值得记录下来。
RIME 把输入法流程分为四个阶段:processor 、segmentor、translator、filter 。
processor 用来处理按键。用户按键的原始消息在这里变成输入的字符串、或是在这里处理按键对应的交互操作。通常在这个阶段,会生成最初的输入串供后续处理。但这个输入状态并不是传递给后续阶段,而是放在全局 context 中。我理解为,不同的输入方案,需要传递的状态简繁不一,很难用一个输入流抽象。除了输入流,还有其它状态:例如当前是中文还是西文、全角还是半角,这些都会影响按键的输入如何转换为最终的数据。processor 更多的任务不在规整数据流,更在于输入法和用户的交互行为:选择备选单、如何上屏、如何管理数据流的编辑状态等等。
segmentor 则负责把当下的输入信息转换为一组组类型化的数据块。这些数据块是对整个输入串的局部快照,打上了不同的 tag 。类型信息有助于在后续阶段交给不同的子模块处理。这样、就可以把标点、文字、表情符号、专有名词分到不同的 translator 。
前两个阶段都是流式工作的,在 processor 中流转的是按键、前一个 processor 不想处理的按键就轮到下一个处理。segmentor 阶段流转的是 segment 分段集,不同的 segmentor 通常用来处理不同的数据状态。例如,输入法一般会管理英文输入和中文数据两个状态(很早以前 windows 是由系统管理的,现在则流行由输入法自行管理)。RIME 就实现了一个默认的英文输入器,基本上就是把按键直接保持不变输出(这就需要 tag 了)。如果不在英文状态,这个 segmentor 就略过,交给下个 segmentor 处理输入;否则,它会熔断 segmentor 的流程,直接去到下一步 translator 。
和前两个阶段不同,translator 是按 tag 分发的。大致上可以理解为谁订阅了特定类型 tag 谁会被调用处理。这里不可以依赖配置文件里定义的 translator 的先后次序,不可以认为写在后面的 translator 可以利用写在前面的 translator 处理的结果。我这样理解这个设计:每个输入对象(片段)都可以对应多个结果,也就是输入法里的备选单。如果有多个 translator ,它们都可以提供这些选项。而 UI 上可以呈现的选项数量却是有限的,没必要收集所有的选项。所以,单个 translator 每次只需要返回一个选项,让框架按需整合即可。在 lua 封装中,提供的正是协程风格 API 。
最后一个阶段 filter 则是过滤 translator 按需生成的结果。这个阶段的过滤器又是流式处理的了。略有不同的是,这个阶段没有熔断机制,定义的过滤器都会被执行。官方提供的 filter 是把繁体字转换为简体字,以及结果去重。因为从语义上来说,简体字是繁体字的子集,一个简体字可以对应多个繁体字、反之不然。我后来发现 filter 对我这次想实现的音形结合码非常有用。
大部分的 RIME 方案并不需要额外开发脚本,用已有的模块搭配不同的配置项都可以完成。但 ABC 方案有些不同的地方,不能完全用配置解决。下面是我认为存在的问题:
RIME 提供了两种风格的交互:以词为单位输入的 express_editor 和整句为单位的 fluid_editor 。它们都是 processor ,用来处理按键交互。express 模式下,用户确定了一组短语后就会立刻上屏,输入法自身会复位等待下一组输入;fluid 模式则在用户确定后,只是放在输入缓冲区中,用户接着独立编辑下一段输入,但输入法可以根据上下文调整之前的输入。
express 通常提供更少的交互能力,比如没有对输入片段复杂的编辑能力,但获得的好处是有更多的输入法编辑框之外的操作可以穿透输入法立刻生效;fluid 模式更像是输入法内置的编辑环境,运行输入法针对更大的上下文处理输入。一般来说,定制输入法方案应该在这两者间选一个更接近的去改动细节:通常用前置一些 processor 拦截按键消息实现。但智能 ABC 略有特殊,光靠配置项搞不定。目前我实现的版本最大的缺失也是这块,还需要慢慢打磨,最终很可能需要自己实现一套交互用的 processor 模块。
智能 ABC 从功能上说,更接近 express 模式。它主张以短语为单位输入而不是长句。原版中也没有太多预测句子中同音字的特性。但有少量单字会根据出现在词的前面还是后面改变权重。比方说,“的”不太可能出现在句首。它的词库比较小,又非常依赖用户造词,所以还需要一定的以单字构新词的编辑功能,这方面的交互又更接近 fluid 模式。这也是为何 ABC 老被人诟病需要按更多的空格键的源头。
智能 ABC 交互上的另一个问题是它依赖数字编码,这和一般输入法采用数字键选字有所冲突。原版中是把输入状态和编辑状态分开来解决这个问题的。在按空格前,属于输入状态,这个时候可以输入数字,不可以选词;在空格后,处于编辑状态,不可以修改已经输入的串,同时允许数字键选词。至于原版中,在按空格前不显示备选单,我认为只是交互上的决策或是实现上的偷懒。这次用 RIME 实现,倒不必完全退回到原来的设计。只是这个输入状态和编辑状态的切换交互设计值得重新理一下。
btw. 有人觉得 ABC 总是需要按两次空格才能把输入上屏,其实并非这样。第一次空格是确认短语的输入,进入编辑选择态。这时在按一次空格可以退出选择态把默认选择上屏,也就是两次空格上屏。但其实退格键、ESC 之外的任何按键都可以达到这个效果,而且字母按键除了让其上屏外,还保留到下一组输入的第一个按键。所以输入长句时,每个短语间并不需要两次空格,一次就够了。
ABC 输入法把 u v i 这三个不可能出现在拼音开头的字母都定义了特别的前缀语义。尤其是用 i 做前缀来输入数字非常方便。比如 i2026n 可以直接输出二〇二六年 ,i4s2cm 则对应四十二厘米,I123 可以输出大写的壹贰叁…… 这个功能在 RIME 里可以直接用模式匹配实现。ps. 前面提到的 remi-znabc 项目,把这些特性一股脑塞进了自定义 processor 模块中,是我不太满意的地方。
中括号选词是 ABC 的特色。在打单字时,往往需要组个词去掉同音字。很多人喜欢把词先打出来再用退格键删去一个字,但 ABC 直接提供了加上 [] 后缀保证只输出首字或末字。我觉得在 RIME 中实现它比较贴切的方法是定义一个 segmentor 给这种以词去字的输出片段贴上正确的 tag ,而不是生硬的将中括号编码在输入串中。这样就可以方便在后续的 translator 中处理。本来这个特性就不限于特定的输入法编码,任何输入法都可以加入这个功能。
音形码混合怎么做?
一开始我在翻阅 RIME 文档时,找到了 SpellingAlgebra 。官方用这个方法解决拼音用声母组词造句的问题。也就是用空间换时间以及算法复杂度的方法,把每种输入组合都加到字典中。比如,“我们”这个词,原始词典中只提供 wo men 一种拼写,但通过模板的预处理,将 wm wmen wom 这些组合都加到词典里去。(另外,RIME 还提供一种自动生成五笔里造词编码的方式叫做 encoder ,不适用这里的情况)ABC 这种音形码只是组合更多一点罢了:如果我们把单个字的编码分为三个部分:声母、韵母、形码;声母是必须的,而韵母和形码可以自由组合,其中形码长为 1-6 位。组合倒是够多,好在现在内存硬盘都够大,应该无所谓。
但在实现的时候我发现另一个问题。如果我把智能 ABC 原本的词典转换一下,就可以通过模板规则把它配置好。但 RIME 已经拥有了更大的现代词库,为何不用呢?但我没有找到内置的配置方法可以帮助我把已经整理好的单字形码附加到已有的词库上。首先,RIME 默认并不是以单字和单词分开保存词库的。虽然提供了字词分离的方案,但还有多音字问题:即每个单字本质上是一字多码(多音)的,而对于词,却是一词一码。其次,RIME 并没有提供一种合并两个编码库的手段,即把原有的拼音编码每个字都加上额外的形码。这就需要另外提供一个外部脚本来处理。我不喜欢这种引入外部脚本的方案。
最后我采用的解决方案是这样的:自定义一个 translator ,它的核心还是调用官方拼音 translator 去解析用户输入。但在输入前把所有的数字形码都去掉,变成纯音码;拿到输出后,再把数据源改回来。这样,我们就会得到一些冗余的选项(不符合用户输入的形码)。但是,我再自定义一个 filter ,去检查这些选项中的形码,去掉那些不匹配的,就得到了正确的选项集。
btw, 在实现过程中我想到了一个有趣点。ABC 的形码编码只用了 1-8 。既然把 8 定义为口字型,为什么不给 0 和 9 也做上定义?或许设计者其它设计上的考量,但只有 1-8 对于判定用户输入是否匹配编码多了一种有趣的方法:
传统的方法是匹配字符串前缀,比如“的”字的完整编码是 38135 ,但实际上我从来没有敲过全码,因为 38 这个前缀就完全去重了,也很好记忆:3 是撇,8 是口。在比较 38 是否是 38135 的前缀时,我们其实可以直接用数字比较(而不是字符串)。只需要把 38 扩到 6 位数 380000(ABC 的最长编码),38135 也扩展到 6 位 381350 。因为 381350 在 380000 和 389999 之间,所以 38 匹配上了这个编码。
2026-10-20 15:20:14
在我最初学习键盘打字时,曾今为看似随机的键盘字母排列困惑不已。当时为找到一个字母就需要看半天键盘,我觉得键盘按字母表次序排列不好吗?当时流行的解释是:机械键盘在输入时,一些常用的字母组合的连杆,在快速连续击打时容易卡在一起。所以,现在的 QWERTY 排列“旨在降低打字速度”。这个说法至今广为流传,而我最近读了一篇 Koichi Yasuoka 和 Motoko Yasuoka 写的论文《 On the Prehistory of QWERTY 》,更清晰的描述了 QWERTY 键盘的发展脉络,我觉得可信度更高。
论文分两个部分,第一部分阐述了先进流行的 QWERTY 键盘是怎样演变到今天的布局的,第二部分驳斥了“旨在降低打字速度”的说法。后者源于 1980 年东京大学 Hisao Yamada 教授发表的论文《 A Historical Study of Typewriters and Typing Methods 》。论文中有这么一段话: :
Hence the original keyboard arrangement of 1873 was experimentally arrived at by Sholes in part by arranging the typebars for some frequent digrams in the English language at opposite locations across the round basket. At the same time, in the empirical process, the keyboard arrangement was unintentionally made more difficult to type fast on.
这段话被一些书和论文(例如 Keyboard Entry—Can It Be Simplified? )转述时被错误理解为:
Historians of typewriter design agree, the current QWERTY arrangement was arrived at by Sholes and his associates to satisfy mechanical restraints, and was intended to slow down the operator so that type bars would not jam.
我更感兴趣的是 On the Prehistory of QWERTY 中详细记录的 QWERTY 键盘演变史,每次变化都有详实的佐证。
最初的打字机是由 Sholes 和他的同事于 1868 年 11 月在芝加哥发明的。它的第一个客户是芝加哥电报学院的院长,所以打字机很可能是围绕电报码转译为文字的需求展开的。一开始,打字机的确是按字母表排列,长得比较像钢琴键盘:即下面一排白键,上面穿插着一排黑键。上牌凸起的键从左至右为 A 到 N 14 个键,下排从右至左为 O 到 Z 12 个键,双排一共 26 键。这个最初的排列到今天还留有一些历史痕迹:现在的键盘中, Z 在左下角最后一个位置,中间的 FGH JKL 从左至右按字母表次序排列,下排 MN 则是从右至左。
不久以后,键盘被扩展为 38 键:加入了数字键 2-9 ,连接符、逗号、句号、问号。为什么不需要数字 1 和 0 ?因为可以用 I 和 O 代替:这两个字母和数字看起来差不多,放在句子里也不会被误解。因为键位实在太多了,数字键加上连字符(今天,这个键依然在顶行的数字键右边)就被单独安排一行,这样新布局被设计为 4 排, 上两行 9 键,下两行 10 键。
怎样用三排按键排列 26 个字母就是一个新问题。1870 的早期版本中,他们选择把 AEIUO 五个元音字母加上 Y 这个半元音(6 个字母可以对称一侧三个?)以及三个标点一共 9 个键放在第二行,在数字键的下方。句号和问号放在中间,排列为 AEI.?YUO, 一共 9 个键位 。对照今天的布局看,EIOUY 还是在上排,而中间一排的 DFGHJKL 几乎被保留。当时的中排为 B 到 M 10 个按键,下排则是 ZXWVTSRQPN ,为字母表的逆序。
接下来的调整是这样的:T 这个常用字母和 ? 交换,移到了最方便按到的上行中间,W 和 Y 一样是个半元音,也被移到上第一行元音行。Q 由于很不常用,被移到了最不方便按到的左上角,A 则向下移了一行。由于在 1870 年,经常需要输入 1870 或 1871 组合,而 I 又被当作 1 用,所以就安排在了 8 的下方,和 O (当 0 使用)排在一起。
当时的美国采用的是 American Morse Code ,和今天通行的摩尔斯电报码不太相同。American Morse Code 不仅用长短音滴答编码,还需要区分声音之间的间隙长短。在字母之间有一个短间隙、单词之间的间隙长一些,句子之间停顿时间更长。而字母编码中,除了长短音,还有一个略短于字母间隙的快速停顿。我觉得可以近乎理解为一种三进制编码(加入停顿),而不是滴答这种二进制。
Z 的编码为 "... ." ,也就是滴滴滴停滴;E 的编码为 . 即一声滴;S 的编码为 ... ,即三连滴。当单词中有 SE 连续组合时,需要三连滴顿一点加一个滴;而 Z 则是三连滴停顿短促一些加一个滴。两者非常相近,区别只在于停顿时间的细微不同。所以,在记录电报时往往辨别不清需要等后续的信号来判断到底是 SE 组合还是 Z 单字母。这个时候,就不可以轻易按下键盘。S 键换到 C 的位置和上方的 E 以及下方的 Z 之间就很顺手。收到 ... . 时,手指先放在 S 键上但不按下,后续判断清楚,手指连续按下 SE ,或是下移按 Z 都很方便。另外,C 是 ".. ." ,而 I 是 ".." ,C 很容易和 IE 混淆。基于这样的理由,S 取代了 C 的位置,C 则放在了 E 的下方, 而 C 移到了下方。
到了 1872 年,键盘扩展为 42 键位。在当年 8 月的 Scientific American 杂志封面刊登了打字机的图片,可以一窥当时的键位排列。和今天的键盘区别在于:第一行没有数字 1 和 0 。数字键右侧的连字符右边是逗号和单引号。字母第一行为 QWE.TYIUO_ ,和今天已经非常相似,区别在于 R 的位置是 . P 的位置是下划线。标点符号都排列在第一行,第一行太长了,就把下划线下移到 O 的右侧。C 和 S 的位置都按电报习惯调整到了左侧 E 的附近。注意,在这个版本中,左下的三个键位是 ZCX 而不是今天的 ZXC 。左下角放的是 & 符号,这样排列可以让 C 离 S 更近一些。不知为何,R 和 P 被安排在右下角。
但在后续 1873 年的改进版本中,变成了 43 键。随着键位变多,每行的键也随之增加到 11 键。可能是 Sholes 对这种符号和字母混杂在一起的排列不满意,他把原来的 . 和右下的 R 键位做了交换,O 的右侧换成了 P(和字母表的次序相同)。第一排的字母排列为 QWERTUIOPY: 。不久(1873 年),Y 又被调回原来中间的位置,第一行字母键次序和今天完全相同。
打字机的发明人 Christopher Sholes 把专利权卖给了一个枪械制造商 E. Remington & Sons ,在 1874 年 4 月,打字机的商业版本 Serial No. 1 由 Remington 公司发售。使用的就是这种布局,和今天的字母键排列不同点之处有两个:第二排字母键比今天多一个 M ,排在 L 的右侧。第三排左起为 ZCX 而不是今天的 ZXC 。到了 1875 年,有人想出了一个新的机械结构,通过按下一个键,可以让同一个字母键即可以打出大写又可以输出小写。由于一个按键可以输出两种符号,标点符号的数量得以大大增加,同时,原来用于标点的按键数量又可以略微减少。这就导致了标点键的重新排列。1878 年 12 月,更新了新的商业版本 Remington Type-Writer No. 2 ,缩减到了 40 键(因为同一个键可以输出两种符号了)。其中两个按键用于切换状态:右上角的 lower case 按下,按键为小写字母;左下角的 upper case 按下则输出大写字母。字母键的排列则保留为 1874 年 Serial No. 1 的方案。
从 Remington Type-Writer No. 2 开始,打字机的用户群体从电报员逐步转移到速记员,开始有了专门的打字课程。最早教授的是六指输入法,不用小指。btw,我小时候学校教过打字课,使用的机械打字机。按键盘需要很大力气,小指去按非常不舒服。
到了 1882 年,Remington 公司因为美国内战后的军工订单锐减以及多元化投资失败,陷入了严重的财务危机。他们没有精力去经营打字机这个副业。原来做打字机业务的销售和高管就跑出来成立了一家新的商业体叫 Wyckoff, Seamans & Benedict ,想专门卖打字机。但是,打字机的专利还在 Remington 公司手里。新公司只得到了改良专利优先使用权和独家经销权。为此,新公司对老型号做了微调(改良专利)以回避原始专利。新版的 Remington Standard Type-Writer No. 2 把 M 向下移了一行放到 N 的右侧,冒号和分号合并后移到了 L 的右侧。C 和 X 做了交换,变成了现在的 ZXC 排列版本。
当时市场上已经开始出现(侵权)竞品,所以新版本特意标注了 Standard ,而其它竞品不得使用 type-writer 避免被起诉商标侵权。待到 1886 年老 Remington 公司破产,枪械业务则被其他财团收购演变为今天的 Remington Arms 。而在 1892 年,WS&B 正式注资成立了 Remington Standard Typewriter Company 收购了打字机的主要专利。但市场上还有几家生产打字机的公司分别持有部分微创新专利。到了 1893 年,以 Remington 主导联合了四家核心竞争对手,共同出资成立了一家母公司 Union Typewriter Company ,彻底合并共享了各自手中的打字机专利。到了 1898 年,QWERTY 称为了行业标准。
在 1910s 年代,QWERTY 被用于 Teletype (电传打字机) ,到了 1940s ~ 1970s 被广泛用于计算机终端,QWERTY 成为了现代计算机键盘的标准布局方案。早期的 Teletype 按键为 27(26 字母和句号)+ 4 控制键。数字和其它符号则被安排在这些键位上(1 到 0 的数字键放在第一排字母键上)
2026-10-11 19:30:36
我最近重新玩了两百小时的《Dotage 点老救世记》,对这个游戏有了很多新的认识。之前是在今年初玩了一百多小时,对这款一个人花了十年以上时间做的游戏相当佩服。经过近 400 小时的游戏时间,我对这个游戏的理解慢慢发生了变化。有不少游戏设计方面的东西值得研究,但却很难说清楚,需要用文字整理一下。
这是一款关于规划和选择的游戏。它固定了回合数(标准模式下,共 310 回合),所以玩家实际上需要规划整个游戏过程,无法通过控制游戏发展节奏来决定是速通(注:实际上有手段更快结束并赢得游戏)还是慢慢发展。但玩家可以选择怎样规划这个游戏过程:是把发展节奏拉长,平缓延续到游戏结束;还是快速发展到一定阶段,停留在某个规模对抗系统直到终末。这会导致非常不一样的游戏体验,并没有最优通解。
本质上,玩家需要积累健康、希望、温度、自然四个维度的点数,对抗终局的天灾点数:即玩家在终局点积累的对应点数需要和系统设定的点数相当。在整个游戏过程中,还会动态设定若干检查点(事件),在检查点处,玩家积累的点数会重置,根据检查点处点数和系统设定的点数比较,来决定获得增益还是惩罚。
如果从整局游戏的结果来看,四个维度点数的需求总量是确定的,可以从两个方面来估算对抗它们所需的产能。其一、一共需要多少原料,这些原料包括了建筑的一次性成本、科技研究需要的点数对应的研究成本、维持工人的食物以及药物的总成本、产生点数需要的原料生产总成本。其二、生产这些原料需要多少人力。因为玩家是逐步发展的,所以单个工人的单回合产能是逐步上升的。如果玩家希望更快的提升人口的产能,就需要在前期把更多的产能放在科研或者增加人口或者基础建设上。在大部分情况下,增加人口都是更优的方案,因为只是增加了少量无效投资。因为后期并不需要那么多建筑,关键的高科技建筑几栋就能满足需求。为了避免出现明显更有优势的玩法,且操作过多工人会大量增加操作强度,让游戏并不好玩,所以游戏在这两年的迭代中明显增加了对过多人口的惩罚。除了最明显的直接根据人口数量增加所需的点数外,还有诸如传染病这种负面事件强化对过大规模人口的惩罚。对更少人口规模也有很多额外的事件奖励。总的来说,这块的平衡调整得不错。到底是选择更大的人口规模还是精简的村庄,慢慢倾向于游戏过程中的随机事件的影响,尤其在最高难度模式下尤其如此。人口规模变成了根据具体情况决定的应对策略选择。
科技水平也是如此。玩家可以选择低科技水平通关,也可以选择全科技研究,用最高科技抵抗天灾。这两种选择之所以成立,也在于固定回合数下,发展科技所占成本在完成整局游戏所需中的占比需要为玩家考虑。它不像可以无限玩下去的生存游戏,无论如何最终玩家都会研发完绝大部分科技。说到底就是一次性成本支出在较短的整局游戏回合数中的占比不能忽视。
玩家的水平高低不在于发展得多快,靠快速滚雪球去抵抗更强大的系统,而在于玩家是不是可以用合理的规划,有计划的应对。游戏的随机性决定了:游戏终局时对四个维度总点数的需求不一样,游戏过程中每个阶段点的需求也不相同,到底应该重点发展哪个方面是在游戏过程中慢慢展示的。游戏难度越高,就越不可能用同一个套路全面发展来保证处理所有问题。不光是游戏过程中遇到的挑战的随机性,系统给的随机奖励也会改变不同科技、建筑的效力。
在游戏中,玩家需要不断调整四个维度点数的生产力,同时选择把一部分生产力分配在发展生产力上:研究新科技和为下一个挑战提前准备。游戏的阶段挑战都是刚够最好,超出浪费,能把最多的资源放在发展上固然最好。这就需要仔细规划:怎样才能刚刚够用。简单的衡量标准就是,看看每个回合的每个工人是不是在符合游戏回合数的生产力最高的最佳岗位工作;以及在每个阶段事件结算时,对应的点数刚好不超出。
在早期的游戏攻略中大多强调快速发展人口的重要性,甚至推荐把村庄人口快速推到 50 以上,并用 100 多人口完成游戏。这是玩大多数同类游戏的通用方法,用滚雪球的效应做到指数发展打破系统的设计。村庄实力在于产生四个维度点数的能力,它就是工人数量乘以建筑的效率(单人生产力)。提高工人数量是最简单的:新增住房的成本并不高,单个工人的生产成本在游戏至始至终都是固定的:消耗两个工人一个回合的产能和四个回合的食物。而维持工人只需要每回合一个食物,这小于单个工人的最小产能。简直是有益无害。但现在的版本已经极大的提高了高人口下的维持成本:从 30 人口(标准模式下)开始就增加了所需的系统点数,并随着人口规模上升逐步上升。这意味着新增每个人口不仅要负担一个食物,还需要确保这个额外人口能生产对应的系统点数才有正收益。
即使如此,除非为了体验低人口规模的游戏体验(游戏还设有特别的挑战:马图斯长老的不超过 10 人迷你村庄通关游戏),发展人口依旧是最优策略,但玩家的选择变成了在何时发展到什么规模,而不是一味的开局快速加人。同时,超过 100 人口这种巨型村庄也绝非最优解。这让游戏的大多数时间里,工人数量都不够充分,玩家必须选择在什么时间点加一个工人,还是轮换工人的职业(需要支出额外的时间和工具成本)。即使有了高生产力建筑,低等级建筑也不是一无是处,因为它不需要特定职业,工人的轮换成本更低。
玩的好坏也就在做选择和提前计划中体现出来。因为在每个时间点(事件结算日)对生产累积点数有要求。提前规划可以在扣除成本后,让每个工人最终在最高生产力下工作,总产值更高。这也意味着分出了更多生产力在发展自身上。由于工人切换往往需要三个回合(训练职业),还需要准备工具和训练场地;产生新工人则更长,需要五个回合的繁殖生长期,这都需要多个回合的计划。在新的 DLC 里,加入了把工人派出去甚至放逐的设定,动态调整工人总数也变成了选择。
在高难度挑战中,几乎每个事件结算完就需要规划应对下个事件的回合次序了,而不是慢悠悠的按规定套路发展。查看预言页可以看到回合数,而不能等到预言发生后主界面上显著体验的 5-10 回合倒数计时。这时候就能算出需要的那一方面的点数需要生产出多少。因为计划时间比较长,所以最优计划中需要的科技还没有研究出来。玩家就需要计算点出科技需要的回合数、建造对应建筑需要的回合数以及建设成本、需要的人力成本,把计划回合数做到最长去契合事件发生的时间。通常周期拉的越长,综合成本越低,多出来的产能就可以用来发展。
在最早的 100 多小时游戏体验中,我不太喜欢游戏奖励玩的好产生正面事件形成正反馈,失误产生负面事件用负反馈惩罚。因为在高难度下,游戏本身容错性就很低,负面事件的负反馈更加雪上加霜,给我的感觉是,在最高难度下,哪怕一次不受控的负面事件(原本可以正确处理获得正面事件的正收益)给的负面惩罚,这局一定会崩盘。而这个游戏每一盘都需要玩一整天,挫折感实在太强。玩着玩着,我发现承受一些负面事件也可以是理性的选择。关键还是在于你需要提前规划:如果阻止不了,那么就尽早放弃,把产量早点投入到抵御其后果,并加强其它方面的发展。更有趣的是,有时残酷的负面事件结算并不一定全是坏事,甚至有可能利用它。我有一局的小天灾是整个村子燃烧起来。就是这次,我学会了不是所有的燃烧都必须用水去扑救。主动拆建筑隔离燃烧带也很有用。我只保了 1/3 的建筑区域,用火势隔离的方法故意不去救火;结果最终天灾是寒冬,正好用大半个村子的熊熊烈火(产生的热量)抵抗住了。完成后,特别有史诗感。
处理这类问题的关键点在于,不能既要又要。提前计划 plan B 就有希望。新计划要提前计算并贯彻下去,不能在旧规划方向上浪费。正因为游戏提供了各种玩法细节上的选择,行动组合错误才致命的。
如果想挑战最高难度,我认为高难度是游戏的精髓,熟悉科技树和对应的组合真的只是开始。网上很多攻略会介绍一些最优组合,一开始学习没问题,但不要永远千篇一律的用同一个套路玩。 尤其在高难度下,根据游戏的推进(遇到不同的事件)必须灵活调整,越熟悉游戏,就有越多的选择。在完全熟悉游戏的过程中,玩家会学习到很多固定的科技建筑组合应该如何摆放建筑,如何指派工人的职业,每个职业需要几个人手,这几乎有最优解。但是、这是一个有限回合数的游戏,几乎不可能让你达到最优状态。更别说中途随机事件的影响。玩得足够多后,你就能根据每局游戏的半随机科技树做计划了。我现在每次开局,第一件事就是仔细查看科技树,科研的次序也不再根据发展的需求来,而是尽快点开几个初级科技,尽快的查看下层科技方便计划。玩到这个程度,自然也可以理解,为什么“回溯”(用于修改当局游戏的一个科技)是一种超强的能力。
另外值得一提的是:每个长老的玩法都很特别。虽然只是改变了一点点规则,但每个都需要大量的学习。我目前只玩了一半的长老,但每次玩新长老都能给我“原来还可以这样玩”的感触。如果你只玩第一个长老,会逐渐感觉到游戏中某些套路明显强于另一些(尤其是不加 DLC 时),有些科技简直是鸡肋。但是在玩其它长老时,就会发现,这个东西原来还可以这样用。
2026-09-18 15:28:47
关注 Caves of Qud(卡德洞窟)很久了,之前一直没下决心玩。最近发现它更新了多语言支持分支,在 steam 创意工坊里有了一个初步的中文 mod ,便试了试,果真很有趣。
我玩传统 Roguelike 很久了。最早是在 GBA 上用干电池玩特鲁尼克大冒险(以及后来风来的西林系列)。在 2008 年的时候就试过 NetHack 还尝试过做汉化 。ps. 现在已经有针对最新 5.0 版 NetHack 的中文版本了,在 AI 翻译的加持下,体验很不错。后来沉迷过很长时间(600+ 小时)的 Rogue's Tale,甚至它的官方中文一开始就是我翻译的。还玩过一点 CDDA , Cogmind ,以及关注过 RogueBasin 上很多很多的 Roguelike 。
除了在游戏机上被彻底改造过的不可思议迷宫系列,很少见针对手柄交互改造的特别好的 Roguelike 。这或许是 Roguelike 天然的系统复杂性吧,毕竟不可思议迷宫也大刀阔斧了砍掉了不少东西。但 Qud 让我改变了这个看法,它用手柄玩太舒适了,看来还是得有人好好设计。交互做得好加上适当的本地化,就可以极大降低体验 Roguelike 的门槛,只是这类游戏最大的门槛还在于玩家不知道该在游戏世界里做什么,现代游戏把饭都端起来直接往玩家嘴里送的做法已经大大削弱了玩家自己探索游戏的能力。
传统 Roguelike 有两大方向:
一是地牢远征。让玩家一直琢磨怎么战斗,挑战更难的地牢。但是它又不像传统的战斗 RPG ,让玩家去想什么 Build 最强,而是偏重于让玩家探索游戏世界的规则:找到大量系统间的交互。物品可以有隐藏属性、药水不只一种用途、怪物和环境会互动、宠物能影响游戏、物品存在意想不到的用途来解决完全不同的问题、永久死亡在带来挫折感的同时也在教会玩家:原来还有这样的系统存在。玩这种游戏,玩家的乐趣往往不在于“我的角色”又变强了,而是玩家本身发现了新的游戏规则:“我”变强了。
二是世界沙盒模拟。它更接近现代游戏中的开放世界:作者设定好世界、城镇、NPC 阵营、主线任务、加上一些随机生成的迷宫和支线,把玩家扔在里面体验这个世界。追求战力更强往往不是唯一重要的,处理好玩家角色和世界的关系往往也同样有意义。玩游戏不是一个个地牢打到底,而且揭开作者设定好的迷雾,体验人为设计的剧情。特别是永久死亡的经典设定,可以让玩家更为投入去体验角色和世界的互动。
每个 Roguelike 在创作时,并非固执上述单一方向,可以把它们融合起来,也可以往其中一个方向专精。这篇 Blog 不是一篇针对 Roguelike 谱系的范范而谈,我就不逐一列举游戏了。但有一点:几乎所有 Roguelike 的创作都不是商业驱动的,每个长期维护的 Roguelike 都有它独特的魅力和不一样的游戏体验,玩过一个就去类别另一个的好坏很容易带来偏见。由于 Roguelike 大多基于复古的画面,极低成本的美术,全靠玩家脑补。作者就可以把更多的精力拿出来创作奇特的游戏机制,这是商业游戏做不到的:如果设计一个独特的玩法就需要连带制作大量的动画以及交互,不仅制作工期无法保障,尚且不能保证玩法真的好玩;保守的做法就只能是在已普遍被大多数玩家认可的玩家上雕花。
我这两天大约玩了 20 个小时 Qud ,体验很好,但只能算是刚刚迈出新手区。在玩的过程中,记录了一些自己的体验,感觉对以后设计游戏有帮助,写这篇 Blog 也是做个汇总小结。
玩家玩游戏,游戏一定要有一些东西符合玩家在游戏之外的体验,两者共鸣方才投入到游戏中去。
游戏是不是一定要有叙事?当然不是。但“叙事”是一个很好的共鸣点,它可以将玩家在游戏之外文艺作品(历史、小说、电影等等)中获得的体验转化为游戏体验。一旦激发了玩家大脑中的想象力,视觉冲击或是操作反馈都比不上“脑补”的威力。Qud 是一个强叙事的游戏,游戏世界和主线情节都是人为设计的。如果玩家喜欢那种未来复古主义风格,就能很好的融进游戏:它不是 fallout 那种末日废土,玩家不必去关注当初世界如何毁灭,更多的是体验那种科技发展为魔法一般无法解释的东西后,文明在如何运作。那些旧世界的遗物变成了一种古怪的东西:一部机器可以同时存在技术意义、历史意义以及宗教背景,当然还有游戏机制供玩家学习。
玩家能感受到 Dune 对 Qud 世界无处不在的影响:所有对话都以 Live and Drink (长生共饮)结束。淡水变成了游戏世界中的通用货币,这不仅仅是一个文字上的设定,还深刻的塑造了游戏中独特的经济系统。游戏里没有钱,只有淡水。和 NPC 交易时,如果价值不对等,差的部分需要从玩家背包里取出淡水补上,多的部分 NPC 总能从异空间变成等值的淡水补上,但玩家的负重要能承担。
玩家没有仓库和银行(至少我还没有接触到),只能增加自己的负重能力,才能带更多的“钱”。所以游戏可以不限制玩家去 Grinding (刷),因为你刷了也带不走,没地方积累。高价值东西还是无法从 NPC 那里交易到。淡水这个通用货币还设计成相对不轻,不可找零。基本弹药、食材的交易价只有百分数,为了平衡交易(不亏钱)最后都是用这些消耗品补上。这让我联想到,(据说)津巴布韦当年经济崩溃后人们普遍使用美元,但美分却不接受,最小面额就是一美元。在商场买东西尽量凑整,不足的部分用糖果找零。
和大多数 Roguelike 不同,玩家不用刻意在身上保存淡水解决口渴状态。游戏定期从背包里扣除淡水,扣完就死。但只要找到任意 NPC 都可以交易到淡水,游戏世界中并不缺水,不需要专门去找水。经济和生存结合在一起是个很有趣的设定。
那么,如何交易高价值物品?游戏中设定的贸易品很特殊,通常是贵金属,它在交易中价值是恒定的,买卖同价,而单位重量很小。玩家可以尽可能把有价值的东西都折算成贵金属携带在身上,这样才能在需要时交易到单位价值很高的物品。但贵金属在世界中却很稀少,所以我在玩的时候,往往还需要再交易回来。和贸易品不同的是普通商品,往往有很高的买卖折损,也就是卖价很低,买入很贵(同时受玩家属性技能影响)。很多商品本身却很轻,方便携带,只是你只能做一次性交易。典型的商品就是书,有价值的书读过就把里面的信息提取出来了,书本身可以用很高的价格卖掉。但书很轻,比起直接带淡水,携带量可以大很多。
Qud 的经典模式是永久死亡的。即角色死了就必须重零开始,没有存档可供重来,没有遗产可以继承到下一局(没有 meta 成长),成长的只有玩家对游戏世界的认识。这种设计带来的游戏体验和传统 RPG 相比是截然不同的:玩家需要小心翼翼,做高难度任务被迫做充分的准备,尽可能的收集游戏世界中的信息。这所营造出的那种在末世挣扎求生的体验无可取代。
但角色终有一死,永久死亡带给玩家带来的挫折感该如何缓解?Qud 的答案是:打败敌人或许很难,但逃跑总是相对容易的。无论你选什么初始 build 开局,总是默认给你一个“疾驰”的技能,新手区几乎没有可以跑得过你的敌人。再强的怪也很难秒杀你,留给玩家打不过就跑的机会。加上是回合制,玩家可以从容的想办法,只要不故意作死,还是有反悔的机会。游戏经验带来的区别是:是否过量的使用消耗品,开局送的那些药剂撑过新手村肯定是够用了。懂得正确的衡量局势,你可以用的更节省一点。慢慢的学会利用环境高效战斗,乐趣也能不断涌现。
这种不给反悔机会的机制,让我在玩 Bey Lah 的 Kith and Kin 任务时,体验到了和玩一般推理游戏的差异。因为知道选错了就不能反悔,所以我非常仔细的调查了所有的线索、推敲每个村名的对话、观察每个鹿人的外观。甚至,我在玩游戏时用了一大张草稿纸,画出人物关系图,把获得线索一一标注在 NPC 上。最后一次性做出正确的推理结论时,成就感慢慢。时候我查了攻略才知道,这个任务是专门设计的,作者编排了所有人犯罪的可能性,枚举了每种情况的线索和证据,然后打乱随机出现在游戏里。可能是设计成本太高,整个游戏里似乎没有设计其它类似的任务;亦或是这种游戏体验有一次就够玩家回味了,不适合把它(本格推理)做成游戏的核心玩法。
btw,我在玩的时候想到一个点子:构架一个虚拟世界,比如围绕武侠世界的世界观设定各方势力,但把终局阴谋利用随机性隐藏起来。比如,每次创建世界,武当或少林的掌门都可能是阴谋家也可能代表正义,或者两者皆是。玩家在游戏世界里会永久死亡,但玩家可以在同一个世界里重新再玩,玩家本身可以知道这个世界里的阴谋的一部分:武穆遗书藏在西湖水底,武当掌门是带头大哥…… 玩家可以利用这些知识在新的 run 中更高效的玩游戏。但重新构筑一个世界这些则会重新被打乱。采用怎样的随机算法、程序化构建可以做到什么程度、人工的设计量到底有多大,这些还没有细想。
Qud 的地图采用的双层结构:大地图加每一格的展开(小图),看起来是半随机的。地图西边永远是盐滩,中央是峡谷,东边是丛林,怪物分布从西至东逐步危险。新手村 Joppa 永远在地图西边盐滩周围,第一个城镇六水镇一定在西北方的盐滩中间。但随机的遗迹和小地图布局则是随机程序化生成的。Qud 极大的弱化了食物和饮水方面的生存压力,这可以让玩家摆脱很多 Roguelike 中的食物焦虑。一直不进食也不会饿死,最多只会顶着一个速度下降的 buf (增加恶战中逃脱的难度)。而只要在安全地带扎营煮饭,就可以无消耗回复饱腹状态,烹饪技能和食材消耗属于锦上添花:给第二天提供一个正面 buf 。饮水前面也提到了:水的消耗变成了经济系统的一部分,理论上玩家很难陷入脱水而亡的境地。更多的是减少玩家远征的经济收益。
两级地图设计的很恰当:玩家在大地图上可以非常高效的移动,很快(相当于压缩了游戏时间)就能完成长途旅行(得益于弱化食物饮水的设计),也可以主动进入小地图探索。在大地图上移动有一定几率触发迷路,在迷路时,玩家强制进入小地图行动,但玩家地表很少有迷宫,玩家朝着大体的方向走就不会走冤枉路,只不过要应付路途上的怪物。如果碰到 NPC ,交谈就能解除迷路状态,在周遭无敌人时就可回到大地图。如果在无人区,走足够多的路(一般不超过大体图上的两格)也能摆脱迷路状态,这种大小地图的无缝衔接对开放世界的体验很好。小地图及地牢的程序化生成向玩家提供了每个 run 的新鲜感。配合地形及怪物搭配,有足够多的战斗内容供玩家学习。
很多游戏在地图设计时设计一些软屏障,典型如魔兽世界,在地图间放一些高等级的怪阻止不够等级的玩家探索高等级区域。Qud 不是这样做的,它不阻止玩家在大地图上高效旅行。因为故事主线放在地牢中,地图旅行不为难玩家。它需要让玩家更容易脱离高风险环境,避免永久死亡带来的挫折感。有技巧的逃离死亡威胁也可以和战斗一样带来优秀的游戏体验。在故事主线中,新手阶段的 Grit Gate 那里接到的任务,就是去一个充满地下管道的地城取回报废的机器人。游戏鼓励玩家在 12 级以下完成这个任务(获得更高报酬),我是在 10 级去做的,也没有事先查攻略,攻略整个地牢的过程惊心动魄。这里首次面对单向通道(只能从通气口往下跳,无法原路返回),所有的怪都打不过,只能一路狂奔,猛打治疗针,身上有什么药就吃什么,哪怕顶着各种负面 buf 。永久死亡带来的恐惧在整个过程中挥之不去,最后一层中,哪怕眼前不远处就能看见及其吸引人的物品也不敢去捡。
我在玩 Qud 时,能确切的感受到,硬刷等级的收益不大。除了开局在新手村附近稍微刷刷等级可以提升初期的存活率外,出了新手村就不用刻意升级了。反正后面靠打怪升级需要的经验值会指数级上升,而提升的角色能力却非常有限。最主要也就是血条长一点,更不容易死掉,打败怪物的能力却没有对应成长。升级送的 SP 倒是可以直接购买任意技能,只不过靠这个一定是不够用的,就好比学了烹饪,战斗技能就没 SP 可用了。最有效的方法还是四处游历和各地 NPC 阵营结下水盟(只需要消耗一单位的淡水),用阵营好感度去换技能。这里游戏留给玩家的选择就是:阵营好感度是此消彼长的,见人就拉上喝水大体没错,只是不小心得罪了远方的怪物就得留到以后去解决了。很多游戏中的装备和物品也并不增加战斗数值,但装备上就能拉高或降低对某个阵营的评价,占着负重让收集癖左右为难。提升对特定怪的好感度可以极大的改善在游戏中生存率。最安全的活法自然就是让怪物不攻击你。
对大部分 Roguelike 来说,在游戏中变强并不是堆砌数值,寻找更强的 Build ;而是发现了游戏中的新机制。在 Qud 中,学会了如何破墙等于在嵌入绝境时多一条路逃跑;学会了飞行,前面那个单向通道就能变成可以回撤的双向通道;学会用爱情针魅惑敌人,不仅可以避免和 boss 交战,还能一起喝水换得世界的秘密(通向极品装备的捷径)…… 所以没有遗产继承的永久死亡固然可怕,但角色死了,玩家真的可以感受到“我”(通过了解世界的机制)变强了。
最后是吐槽 AI/LLM 时间。
目前我最长的一个 run (十个小时以上)终结在主线任务去 Bethesda Susa 。在这个节点上玩的有点飘,觉得游戏给的容错性足够,已经不太会死了。但在下这个主线地牢前,我特地和 Gemini 讨论了许久:我问现在 12 级去是否安全,LLM 说把冰抗加到 40 以上肯定没问题。我凑了一身防寒装就去了,但没等冻死就先死在了中间的巨人三巨头处。事后我仔细读了好几篇 Reddit 上的帖子,老玩家总结说,做这个任务最低 20 级就相当极限了(HP 长度不会被秒杀),至少推荐 28 级以后去。虽然有不少邪典玩法避免战斗,但那些需要的筹备工作,不看攻略的我肯定无法制备周全。
想想也是:AI/LLM 一定不会亲自玩游戏,只能道听途说。试想一个没玩过游戏的人教你玩这样风险极大的游戏,你肯定不会信任他;那又怎么能轻信 AI 呢?多半还是因为 LLM 把语言组织的太动听。
2026-09-09 14:53:21
对云豆来说,这个暑假特别长。
他小学毕业了,6 月中就已放暑假,9 月 1 日方开学进入初中。自然没有学校布置的暑假作业。我不想他整个假期都沉迷在短视频和蛋仔派对中,所以每天给他安排了英语学习。
7 月初,我记录过对孩子之前的英文辅导。先前,我用的《英语在用:剑桥初级英语语法》给他补习基础语法。学习的效果还可以,原本以为可以在暑假过渡到中级本。但读了两天后就发现完全进行不下去。倒不是中级语法难度大了很多,而是他本身的阅读能力跟不上。
阅读不仅仅是 “英文” 语言的问题,换成中文也一样。所以,我换了一套书:《Basic Reading 1200 Key Words》
我的想法是这样的:首先应该通过阅读扩大他的单词量;其次他真的需要增加“阅读”了。他的中文阅读太少,无法静心读书。看起来,这套书的内容如果对应成中文读物,似乎更低年龄一些(感觉是 7-8 岁左右)。但对云豆来说正合适。从单词量来说,也比较契合他现在的英语水平。他虽然已经小学毕业,但难以静心读下长篇章节书,阅读这件事还是得循序渐进。
这个假期,雷打不动的每天坚持读一篇,差不多刚好在假期读完了全部三本。每篇文章只有十几句话,我原本以为可以半个小时读完。但实际上,一句句陪着精读,做完后面的练习,每天都要花掉整个上午的时间。早上九点左右早餐后倒中午十二点午餐结束。
我感觉通过这个暑假,他在英文上的阅读量已经超过了过去两年中文阅读量。阅读能力至少可以独立读完一小篇文章,真的理解文字传达的意思了。
这个暑假我还发现,其实云豆的英文单词量非常匮乏。只要是偏抽象的词就几乎不认识。比如, move / most / even / include / each / expect / only / just 等等这些我以为他早就应该认识的单词尽然完全不懂。即使在暑假中每日阅读见到,也要经过几周,反复见过 5,6 次以后才记得。
他理解英文的方式一直是将一个句子中认识的单词在脑中不断排列组合,拼凑出大致合理的句子。从英文的短句变成长句后,这个方法就完全失效。而阅读能力的缺失导致差不多摸到意思了也表达不出来。这个暑假,我教给他最重要的一课是:英文单词和中文绝不是一一对应的映射关系,要理解单词的含义,不可以“背”中文译词。
可可是另一种情况。
她暑假过后上四年级,学校的英语学习会从纯口语过渡到书面语。我之前关注她的英语学习情况较少,她在学校里英语成绩还凑合(考试成绩一般在 95 左右)。
但这个暑假一开始,我就发现了问题:她只能勉强背诵英语课本,实际上看到陌生的英语句子就完全读不下来,更比说运用英文了。甚至,26 个字母打乱了后识别都有困难。在这个水平,只能从头开始教。
上次 blog 下,网友推荐了《典范英语》Good English ,我查了一下,其实对应的《牛津阅读树》(Oxford Reading Tree)。我就选了这个从头带着可可学习。这个暑假读完了《典范英语》的 1 和 2 。每天在午休过后读一个小时,然后在晚上睡前复习一个小时。
从零开始学习的效果还是比较明显的。一个暑假之后,可可大致可以看到单词猜到读音了。(我刻意教了一些自然拼读的法则)我完全把她当成零英文基础来教,她在读《典范英语》第一册刚开始时非常吃力,虽然只有几个简单句子,但读完就忘。需要不断的回滚跟读练习。大约一个月后情况才好转。因为第一本每篇故事内容比较短,比较低幼,所以一天能读 3-4 篇,主要还是练习口语发音为主。
第二册开始句子要复杂一些,一天就只读 1-2 篇了。感觉按这个进度,今年是可以读完第 4 册的。
总得来说,学习贵在坚持。我感觉用什么方式什么教材去学也没那么重要,重要的是保证每天一个小时以上的投入时间。其实也挺考验我自己。陪着阅读学习也是很花时间挺累的。驱动我一直做这个事情的就是把它变成每日日常,用惯性来推动。
2026-08-20 20:01:10
银河竞逐是我最喜欢的桌游之一。我曾经为它写过两篇 blog :银河竞逐的设计 及 如何教人玩银河竞逐 。
最近我教会了小孩玩这个游戏,我自己也在电脑上玩了 200 多盘。主要是在 BGA 上和人对战,以及在官方授权的电子版 中挑战最高难度的 AI 。和过去喜欢多人混战不同,这段时间我主要玩双人规则。虽然在线下,我玩这个游戏的水平超过一般桌游玩家,但在线上,我只有略高于 40% 的胜率。说明这个游戏的策略还有很高的天花板我没能摸到。和最高难度的 AI 相比,我的胜率超过了 50% 。
这是为数不多有着极深的策略,却又超快节奏的桌游。在 BGA 上默认只给两个选手各 3 分钟的总时间,通常在 5~6 分钟就可以完成一局游戏。应了它名字里的 Race ,玩起来颇有竞速的感觉。我在游戏过程中总是觉得思考时间不够,如果纯凭借经验(感觉)打牌,很容易输掉。特别在最后两个回合,往往需要精算自己和对手的各种可能性,找到取胜的可能。胜负比分通常差距非常小,运气成分虽然存在,但总有希望通过计算挽回。而判断上的一个小的失误却会迅速落下对手一大截。
这个游戏核心目标就是:在触碰结束条件的那一刻,比对手拿到更多的 VP 。新手则往往理解成单一的如何更高效的获取 VP 。这两者是有区别的。因为比拼获取 VP 的效率往往会减少 PvP 游戏的对抗性,变成埋头干自己的事情。初玩 RFTG 的时候,我也一度觉得这是个对抗性不强的游戏。但在实战中却发现,必须时刻关注对手在做什么。首先是通过判断对手的行动,帮助自己更高效的获取 VP ,其次是根据对手的节奏,扭转游戏结束的时间,做到在结束那一刻超过对手的 VP (而不是追求获得更多 VP)。
所以在高手对决时,尤其是最后,需要仔细计算游戏会在几轮结束,以及对手希望在什么时候结束。自己有什么方法维持几轮,是需要拖延多一轮、还是抢先减少一轮。而轮次最终又是双方一同决定的,这就存在很多博弈空间。需要提前估算每种情况的胜率和最佳对策。游戏规则给玩家提供了大量的选择。VP 可以通过铺在桌面的卡牌积累,也可以用场上的牌组持续生产。游戏终止条件依此分成了两个:任意玩家在桌面铺了 12 张卡牌,或耗尽 12 倍玩家数量的 VP token 。
在引擎构建方面,主流又能分为主导开发设施、军事占领、生产消费流派。细分还可以更多。这让玩家无论抽到什么手牌,总有办法构筑出有效的组合。而不同的流派决定了玩家每轮的行动倾向性,影响游戏的节奏。对手的流派影响着自己的流派的推进节奏。这种影响,可以让人可以预测对手的行动。正确预测对手的行动可以让自己获利,而这个游戏的胜利的本质是找到比对手快一点的路线。这就提供了博弈空间。这就有点像打(德州?)扑克,玩家的思考会有多个层次:第一层是计算如何行动构筑一个最强大的引擎,让自己的利益最大化;第二层则是猜测对手想做什么,怎么利用对手的行动产生优势(对自己构筑引擎,未必是最优的,但只需要比对手好);第三层是,去思考对手在第二层上猜测自己,从而避免让对手取得优势;第四层是,分析对手在前三个层面做决策,制定对自己的最优策略。
游戏(尤其是双人模式)节奏非常快,以我的经验,通常在 6-8 轮就会结束。而牌库空间相比较而言非常大,抽到什么卡几乎无法预测。假设所有人都对牌库及其熟悉,那么在前期就必须做好多手准备,中期随时转型。而游戏规则也提供了大量中途转型的可能,玩家几乎不会一门心思的贯彻刚开始的计划,都是随机应变。除了根据自己抽的新卡做调整,更会根据对手的情况而变化。毕竟,要想胜利,不在于你是否完美的执行了计划,取得了高分,而是在最后一轮超过了对手(提前冲线)。在这种思路下,最后一轮的行动选择往往是决胜一手。怎样让自己的利益和对手潜在的利益差最大。因为随机性的存在,这反映为估算哪个选择让自己击败对手的概率更大。在胜券在握时,减少黑天鹅事件事件(对手低概率摸到扭转胜负的牌并有机会打出来);在形势不利时,去博一个翻盘的可能性;在机会对等时,精算哪怕是一张手牌数量的差异……
银河竞逐很早就有人为它制作 AI 。这是个开源项目,以人工智能网络驱动的 AI 。代码其实挺好读的,因为它几乎不包含任何人为输入的策略,就存粹是以训练出来的网络指导 AI 做决策。所有 AI 的策略都是涌现出来的。但在我随意的浏览代码后,我感觉其实它还有许多的改进空间。比如,这段开源代码看起来只考虑了当前盘面的自己和对手的桌面,自己的手牌,以此来训练和推理做为行动判断。但以我的游戏经验来看,其实是不够的。因为我在玩游戏时,还要根据过往局面,推算抽牌堆可能有哪些牌,不可能有哪些牌,来做决策参考。我相信有丰富经验的玩家都会考虑这些。不过,这个 AI 的原作者 Keldon Jones 后来参加了官方授权的电子版制作。我相信他其后做了进一步的改进(包括我提到的这一点)。这里有一篇文章 介绍了后面这个版本的 AI 的思路。其中在神经网络的 input 里,专门列出了 Cards in deck, hand, discard 。
但另一方面,我感觉即使是新的版本也没有做到的,就是根据对手调整策略。因为这和围棋不一样,是一个有大量不公开信息的游戏。猜测对手的行动非常重要。如果非常了解对手,更容易找到对手的模式,猜中对手的行动更准确。而正确的预测在实战中的确可以大大提高胜率。对手会做什么,并不总能从历史中学习。如果要以此为网络的输入,我认为需要一定程度的加入当前局的历史,而不只有当前的局面。在文章中也提到,他们分叉了许多个模型,分别针对双人、多人、不同的扩展包规则。因为这样比把规则集作为参数输入同一个模型效率更高。在决策时,也不完全是一股脑把游戏的状态输入,而是把判断局面和猜测对手行动分为了两个独立部分,再用传统的搜索法整合起来:根据对手行动的不同预测结果和概率,参考局面胜率的判定,搜索最优策略。
我感觉还能细化更多:根据初始星球分开不同的开局策略、中盘和终局也可以分成不同的决策网络、甚至给对手的模式进行分类(保守还是激进)。尤其是对终局的处理,以我有限的游戏经验判断,最后是需要精算的,这有点类似围棋的收官,但又不完全相同。固然一个超大的统一模型或许可以涌现出人类需要在不同阶段分而治之的策略模式。但这同时也是个成本问题。从开源代码看,它也对最后一轮前的桌面状态做了一点区别对待(比如不再关心手牌保留了什么)。
无论如何,这是个高质量 AI 。我和 AI 对战也能获得不少乐趣。无法碾压 AI ,当然 AI 更无法碾压我。它能极大的帮助新手学习游戏,充当一个优秀的陪练。
不过,我感觉和人玩(哪怕是和线上完全不认识的人玩)还是更有趣一些。