多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Basic Computer Games 之 Even Wins 全解析:确定性必胜算法与基于记忆表的自学习 AI

Basic Computer Games 之 Even Wins 全解析:确定性必胜算法与基于记忆表的自学习 AI 示例工程【免费下载链接】basic-computer-gamesAn updated version of the classic Basic Computer Games book, with well-written examples in a variety of common MEMORY SAFE, SCRIPTING programming languages. See https://coding-horror.github.io/basic-computer-games/项目地址https://gitcode.com/gh_mirrors/ba/basic-computer-games点击查看免费下载导读Even Wins 是 1978 年《Basic Computer Games》中的经典二人取物游戏玩家与电脑轮流从一堆弹珠或其他物件中取走 14 颗最终拥有偶数颗弹珠者获胜。本仓库basic-computer-games的 35_Even_Wins 目录同时收录了该游戏的两个同名变体——确定性的 EVEN WINS 与带简单人工智能的 GAME OF EVEN WINS并提供了 JavaScript、Python、Rust、Perl 等多语言移植。读完本文你将掌握游戏完整规则、确定性版本取模必胜策略的数学原理、学习版 AI 的记忆表机制以及各移植版本的运行方式。一、游戏规则与胜负判定Even Wins 是一款双人游戏规则非常简洁在桌上放置奇数个物体弹珠、筹码、火柴等玩家与电脑轮流行动每回合必须取走14 个物体不能跳过回合当桌上物体被取完时游戏结束最终累计取走偶数个物体的一方获胜。注意胜负判定不依赖谁取走最后一件而是看双方各自累计数量的奇偶性——这使游戏具备了远超表面规则的战略深度。规则说明原文记录于 README.md 与两个原始 BASIC 程序的起始打印部分evenwins.bas 中第 720 行、gameofevenwins.bas 中第 616 行。二、同名双版本固定策略 vs 自学习 AI该目录提供了两个外观相似、实现思路完全不同的版本这是本项目中最值得研究的设计对比之一维度EVEN WINSGAME OF EVEN WINS编程方式确定性deterministic电脑按固定、精良的规则出招控制论 / 简单 AI电脑初始只知道游戏规则初始物件数固定 27 颗弹珠可在源码中修改每局随机奇数个筹码约 921学习能力无纯策略计算从自己的失误中逐步学习约 20 局后难以击败作者原作者未知Eric PetersDEC正如 README 所述EVEN WINS 的电脑如果不懂玩法就几乎不可能被击败而 GAME OF EVEN WINS 更有趣——它从零开始、凭借简单的 AI 技术在失误中积累经验最终成长为强手。README 还特别指出人类玩家变换打法风格会让电脑学得更快若绘制该程序的学习曲线它与心理学实验中经典的人类学习曲线高度相似。三、EVEN WINS基于 T mod 6 的确定性必胜策略原始程序为 evenwins.bas1978 年 Creative Computing 版本电脑的每一步都依据两条状态量做决策。3.1 主流程与开局程序启动后先询问玩家是否先手输入1先手、0电脑先手。若电脑先手初始值设定为T27, M2——即电脑第一手固定取 2 颗evenwins.bas 第 250260 行。README 指出默认 27 颗弹珠是可修改的只需在 BASIC 源码中调整T27这一初始值即可改变游戏规模。3.2 策略核心R T mod 6电脑决策建立在两个核心量上T桌上剩余弹珠数R T - 6 * INT(T / 6)即T对 6 取模evenwins.bas 第 500 行Y1玩家累计已取弹珠数用INT(Y1/2)Y1/2判断其奇偶evenwins.bas 第 510 行。为什么是 6因为每回合双方合计最少取 2、最多取 8而保余数型策略通常以每轮最大可取数 1 5或相关模数为锚点。这里以 6 为模使电脑能够通过控制剩余量把局面引向自己可计算的安全余数。从代码结构看6 是这套策略的魔法数字所有分支阈值1.5、5.3、3.4、4.7、3.5都围绕R的整数取值 05 设计。3.3 决策分支按玩家总数奇偶性分叉策略核心代码位于 evenwins.bas 第 520540 行与第 700760 行逻辑如下分支 A玩家累计数为奇数时电脑希望维持己方偶数若T 4.2即 T ≤ 4电脑直接取光MT一局定胜负evenwins.bas 第 580 行否则若R 3.4R ∈ {4,5}进入第 620660 行分支实际恒取M4其余情况R ∈ {0,1,2,3}取M R 1。分支 B玩家累计数为偶数时若R 1.5R ∈ {0,1}或R 5.3取M1否则取M R - 1evenwins.bas 第 700760 行。需要说明的是由于R是 05 的整数R 5.3与第 620660 行中取 1的子分支需同时满足R4.7且R3.5在数学上实际不可达——这是从源码结构可以推断出的一个有趣的死代码现象各移植版本如 python/evenwins.py 的computer_turn也原样保留了这些阈值。Python 移植将这套策略重写得更加可读完整还原了决策树r marbles.middle - 6 * int(marbles.middle / 6) if int(marbles.human / 2) marbles.human / 2: marbles_to_take 1 if r 1.5 or r 5.3 else r - 1 elif marbles.middle 4.2: marbles_to_take marbles.middle elif r 3.4: marbles_to_take 4 else: marbles_to_take r 1代码出自 python/evenwins.py。你可以用初始状态验证策略闭环T27时R3玩家累计为 0偶数落入分支 B →M R - 1 2恰好与 BASIC 第 260 行电脑先手M2的设定一致——说明固定首手并非拍脑袋而是策略公式的自然输出。3.4 结束判定与对局收尾当T0时程序打印双方累计数并按电脑总数M1的奇偶判定胜负evenwins.bas 第 920950 行INT(M1/2)M1/2成立则电脑赢否则玩家赢随后询问是否再来一局输入1继续、0退出。四、GAME OF EVEN WINS只懂规则、从错误中学习的 AI第二个版本 gameofevenwins.bas 由 DEC 的 Eric Peters 编写其核心思想是不预置任何策略只给电脑一套规则和一张记忆表让它在对局中通过胜负反馈自我修正。4.1 随机奇数开局与状态编码每局开始程序随机生成一个奇数筹码数90 PINT((13*RND(1)9)/2)*21出自 gameofevenwins.bas 第 90 行先取13*RND9的整数部分向下取偶再加 1得到的P落在 921 的奇数区间P1时走独立分支见第 530 行。这正是 README 所述筹码数总是以奇数开始的随机化实现。电脑的每一步都基于两个状态量查表E (A/2 - INT(A/2)) * 2玩家累计取数的奇偶性0 或 1见 gameofevenwins.bas 第 140 行L INT((P/6 - INT(P/6)) * 6 0.5)当前剩余筹码数对 6 取模并四舍五入05第 150 行。4.2 记忆表 R(1,5)以胜负反馈调整策略程序声明了 2×6 的记忆数组20 DIM R(1,5) ... 30 FOR I0 TO 5 40 R(1,I)4 50 R(0,I)4 60 NEXT I见 gameofevenwins.bas 第 2060 行。R(E,L)表示玩家累计奇偶性为 E、剩余筹码对 6 取模为 L这一局面下电脑应当取走的筹码数初始全部置为 4最激进的试探值。游戏开始前电脑只知道规则所有局面经验都是一张白纸。4.3 决策与学习规则每回合的决策逻辑gameofevenwins.bas 第 160190 行若记忆值R(E,L) P电脑直接取光全部筹码并固化经验R(E,L)P第 320350 行——这一局面下清台被证明可行否则电脑取M R(E,L)颗若M 0电脑认输放弃此局面玩家随后输入取数0随时退出14且不得超过剩余数才合法见第 230290 行。胜负判定以电脑累计数B为准B/2 INT(B/2)成立则电脑赢否则玩家赢第 360420 行。学习发生在失败之后玩家赢时第 370400 行与第 480490 行390 IF R(E,L)1 THEN 480 400 R(E,L)R(E,L)-1 ... 480 IF R(E1,L1)1 THEN 70 490 R(E1,L1)R(E1,L1)-1规则可以概括为电脑在某一局面下输了就把该局面的记忆值减 1下次少拿一点、换一种走法试探若记忆值已经降到 1则再回溯一步把上一局面用E1,L1记录的上一个状态见第 120130 行的记忆也减 1。反之电脑赢下清台的局面则被锁定记忆值。随着对局增多失败过的状态逐步被修正电脑逐渐从盲目拿 4 颗进化到在每个局面下都做出正确选择。4.4 学习曲线与人类学习心理学类比README 给出了一个值得玩味的观察该程序的学习曲线与心理学实验中经典的人类学习曲线非常相似。从实现机制看这并不意外——记忆表本质上是一种简单的奖惩式增量学习只在犯错时修正、在成功时固化且修正幅度恒定每次 −1这与行为主义心理学中试错—反馈—调整的学习范式同构。README 同时提示人类玩家变换打法风格会让电脑学得更快因为多样化的对局能让记忆表的更多状态被触达和修正大约连续对战 20 局后电脑将成为一个难以战胜的对手。JavaScript 移植 gameofevenwins.js 完整保留了这套记忆表与回退逻辑可作为对照阅读。五、多语言移植与运行方式5.1 移植清单35_Even_Wins目录为两个版本提供了多语言移植其中已包含完整可运行实现的有语言文件对应版本JavaScriptevenwins.js、gameofevenwins.js两个版本均有Pythonpython/evenwins.pyEVEN WINS基于规则重写Rustrust/src/main.rsEVEN WINSPerlperl/evenwins.plEVEN WINS其余语言目录csharp、java、kotlin、lua、ruby、vbnet目前主要提供项目骨架与转换说明如 csharp/README.md、python/README.md 均注明原始源码下载自 Vintage BASIC转换到对应语言。Python 与 Rust 版本并未逐行照搬 BASIC而是基于规则描述重写Python 版文件头注释明确说明不遵循原始源码电脑策略在 Python 版中按随机/简化方式实现而 Rust 版则复刻了取模策略其注释表明阈值数字来自 Python 实现。5.2 运行方式JavaScript直接用浏览器打开 evenwins.html 或 gameofevenwins.html 即可在页面终端中游玩两页面分别加载对应 JS 与 00_Utilities/javascript/style_terminal.css 终端样式Pythonpython3 35_Even_Wins/python/evenwins.pyRust进入 rust 目录执行cargo run工程由 Cargo.toml 定义Perlperl 35_Even_Wins/perl/evenwins.pl原始 BASIC可使用 Vintage BASIC 兼容解释器加载 evenwins.bas 或 gameofevenwins.bas 直接运行。六、移植要点Porting Notes原 README 的 Porting Notes 一节目前为占位状态等待各语言移植者记录移植难点。结合现有实现可以归纳出三个移植时必然遇到的挑战作为后续补充注释的素材BASIC 行号与 GOTO 的扁平化两个原始程序大量使用GOTO跳转如 evenwins.bas 第 620660 行的多重分支现代语言需重构为 if/else 决策树——Python 版的computer_turn与 Rust 版的compute_playrust/src/main.rs就是两个成功的扁平化范例浮点与取整的边界语义原程序用T-6*INT(T/6)、INT((P/6-INT(P/6))*6.5)等混合表达式实现取模与四舍五入且阈值带小数如T4.2移植时需注意整数/浮点类型转换的细微差异Rust 版便使用f32复刻这些阈值交互式输入校验玩家输入需同时校验14 范围与不超过剩余数两条规则并处理非法输入重试与0退出各移植版本如 javascript/evenwins.js 的输入循环均需自行实现这一交互层。小结Even Wins 是《Basic Computer Games》中少见的一题双解范例EVEN WINS 用T mod 6的余数控制策略实现了几乎不可战胜的确定性 AI而 GAME OF EVEN WINS 则展示了如何用一张 2×6 的记忆表让程序从零开始、以失败减一、胜利固化的规则逼近人类学习曲线。对游戏 AI 初学者而言这两个版本并置阅读是理解规则编码型 AI与经验学习型 AI两种范式差异的绝佳教材对移植开发者而言evenwins.bas 与 gameofevenwins.bas 的源码结构也提供了丰富的重构练习场景。赞分享示例工程【免费下载链接】basic-computer-gamesAn updated version of the classic Basic Computer Games book, with well-written examples in a variety of common MEMORY SAFE, SCRIPTING programming languages. See https://coding-horror.github.io/basic-computer-games/项目地址https://gitcode.com/gh_mirrors/ba/basic-computer-games点击查看免费下载相关推荐Basic Computer Games 之 Even Wins 的 MiniScript 移植双版本玩法、确定性策略与自学习机制的完整运行指南Basic Computer Games 之 Even Wins 的 MiniScript 移植双版本玩法、确定性策略与自学习机制的完整运行指南 导读 本指南示例工程Basic Computer Games 之 BATNUM基于模运算的取物博弈游戏全解析Basic Computer Games 之 BATNUM基于模运算的取物博弈游戏全解析 导读 本文以经典游戏合集中 08_Batnum/README.md示例工程深入解析 Basic Computer Games 之 Chemist跨语言实现“氪氰酸稀释”数学博弈的算法与移植深入解析 Basic Computer Games 之 Chemist跨语言实现“氪氰酸稀释”数学博弈的算法与移植 导读 本文围绕经典游戏集 Basic Co示例工程上一篇揭秘whoBIRD背后的技术基于BirdNET框架的Android声音识别原理下一篇老款Mac如何免费升级最新macOSOpenCore Legacy Patcher完整上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表