ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Flip Flop 经典益智游戏备选语言移植解析:从 BASIC 原版到多语言实现

Flip Flop 经典益智游戏备选语言移植解析:从 BASIC 原版到多语言实现 示例工程【免费下载链接】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》1978中的经典益智游戏 Flip Flop 为核心围绕其在 00_Alternate_Languages/36_Flip_Flop 目录中的备选语言移植展开。你将了解该游戏的完整规则与操作指令、BASIC 原版的伪随机翻转算法以及 Python、Rust、MiniScript 等移植实现如何忠实还原同一局内固定随机序列这一关键机制并掌握各实现的运行方式与移植要点。游戏概述把十个 X 翻成十个 OFlip Flop 是一个单人益智游戏目标非常直观把一行十个XX X X X X X X X X X变成一行十个OO O O O O O O O O O操作方式是输入一个数字对应这行中某个位置的下标。每次输入后该位置的符号会发生翻转X变O或O变X。游戏的关键设定在于某些数字输入后只有 1 个位置改变而另一些数字会连锁改变第 2 个位置——例如输入 3 可能只翻转位置 3但也可能顺带翻转其他某个位置。官方提示玩家应能在12 步或更少步数内解决鼓励玩家摸索取胜策略。游戏还内置了两个特殊指令输入0将整行重置回全部X用于重新尝试同一局输入11在游戏任意时刻开始一局全新的游戏。该游戏最初由纽约新海德公园New Hyde Park, New York的 Michael Kass 编写收录于 1978 年出版的《Basic Computer Games》一书后经 Vintage BASIC 站点以flipflop.bas形式存档成为本仓库移植工作的原始依据。完整的游戏说明见 36_Flip_Flop/README.md。备选语言目录的定位三条标准的例外集合00_Alternate_Languages/36_Flip_Flop/README.md 这份关联文档本身即是对整个00_Alternate_Languages组织方式的说明该目录下每个子文件夹代表一个程序向非约定 10 种语言之一的移植版本而这些约定语言需要同时满足三个条件流行度按 TIOBE 指数衡量足够流行内存安全Memory safe通常被视为脚本语言Scripting language。而备选语言移植不受这三条标准约束——这正是 00_Alternate_Languages/README.md 中明确的定位例如在这里仅限本目录C 或 PASCAL 也是允许的但仍需保持原始程序的观感与交互风格控制台应用并尽量保持代码可移植性若无法移植则必须在 README 与目录命名中明确说明限制。也就是说主目录 36_Flip_Flop 下收录的是 C#、Java、JavaScript、Python、Ruby、Rust、VB.NET 等约定语言移植而00_Alternate_Languages/36_Flip_Flop专门存放不属于约定 10 种语言的移植——例如当前仓库中该目录仅收录了MiniScript一个移植00_Alternate_Languages/36_Flip_Flop/MiniScript/flipflop.ms。仓库欢迎任何语言的额外移植但这些移植仅作教育用途不计入项目最终的移植数量统计。BASIC 原版源码解析伪随机翻转的核心机制原版逻辑集中在 36_Flip_Flop/flipflop.bas 中整个程序只有约 80 行却包含了两个值得注意的算法点。状态表与输入校验游戏用A$字符串数组保存 10 个位置的当前符号第 27-31 行初始化全部为X并维护两个关键变量M上一次的输入值N本次输入值C累计猜测次数第 220 行置 0第 630 行每次翻转后CC1。输入校验第 340-370 行保证了N必须为整数否则跳到第 310 行输出ILLEGAL ENTRY--TRY AGAIN.N11表示重新开始跳回第 180 行重新初始化随机种子与版面N11视为非法输入N0表示只重置版面为全X跳回第 230 行保留计数器与随机数。两条不同的伪随机公式游戏的核心趣味来自第二次翻转位置的不可预测性。BASIC 原版根据本次输入是否与上一次相同选择两条公式当N与M不同第 420 行R TAN(QN/Q-N) - SIN(Q/N) 336*SIN(8*N) N INT(10 * (R - INT(R)))当N与M相同第 530 行连续输入同一个数字R .592*(1/TAN(Q/NQ))/SIN(N*2Q) - COS(N) N INT(10 * (R - INT(R)))其中Q是开局时QRND(1)生成的随机种子第 190 行。两条公式都用三角函数把输入位置N映射到[0, 10)区间的小数再取整数部分作为附带翻转的第二位置。由于Q在一局内固定同一局中相同输入会得到相同的附带位置——这是保证谜题可复现、可推敲的关键设计而每开一局Q重新生成谜面就完全不同。附带翻转还有一个细节若计算出的第二位置N恰好也是O已翻转则逻辑上会回落到把N位置设回X第 480、590 行形成一种连锁但收敛的行为。胜负判定每步翻转后重新打印整行第 610-640 行随后检查 10 个位置是否全部为O第 650-670 行。全部为O时根据步数输出两种结语第 680-710 行步数C12VERY GOOD. YOU GUESSED IT IN ONLY C GUESSES.步数C12TRY HARDER NEXT TIME. IT TOOK YOU C GUESSES.最后询问是否再来一局第 720-770 行回答N开头则结束程序。多语言移植实践对比备选语言移植的价值在于用不同语言的语法忠实还原同一套规则。以仓库中的三个实现为例可以看到同样的算法不同的落地方式。Python显式封装翻转逻辑36_Flip_Flop/python/flipflop.py 用flip_dict {X: O, O: X}表达翻转第 28 行并把附带位置计算 翻转抽成独立的flip_bits函数第 31-46 行接收一个r_function: Callable[[int], float]回调来注入两条不同的公式——当m n连续输入同一数字时使用第二条公式否则使用第一条第 97-111 行。同时它明确注释了第 0 个元素的存在理由We add an extra 0-th item because this sometimes is set to something but we never check what it is for completion of the puzzle第 68-70 行——即保留 1-based 索引以对齐 BASIC 的A$(N)语义而最终胜负判定只检查row[1:]。Rust结构体封装游戏状态36_Flip_Flop/rust/src/game.rs 把游戏建模为Game结构体字段包括board: [char; 10]、last_move、entropy即 BASIC 中的随机种子Q与tries。两条公式被合并进get_other方法第 83-94 行通过equals_last_move布尔参数选择分支flip方法第 70-81 行处理X/0互转reset_board与reset_game第 115-124 行分别对应 BASIC 中输入 0 重置版面与输入 11 开新局两种语义——后者还会重新生成entropy rand::random()。入口 36_Flip_Flop/rust/src/main.rs 通过morristown公共工具库打印标题与交互提示主循环反复调用game.play()直至玩家不再继续。MiniScript备选语言的代表实现作为00_Alternate_Languages/36_Flip_Flop目录下唯一的备选语言移植00_Alternate_Languages/36_Flip_Flop/MiniScript/flipflop.ms 由 Joe Strout 于 2023 年移植并保留了原始创作署名。它同样采用[] [X] * 10的技巧维持 1-based 索引第 43 行getInput函数循环校验输入必须为整数且落在0..11第 32-39 行并且把两条公式完整保留tan(q n/q - n) - sin(q/n) 336*sin(8*n)第 60 行与0.592 * (1 / tan(q/n q)) / sin(n*2 q) - cos(n)第 72 行与 BASIC 原版逐项对应。移植要点与注意事项综合上述实现可以把 Flip Flop 移植中容易踩坑的点归纳如下要点BASIC 原版行为移植建议索引体系A$数组 1-based 访问A$(N)Python/MiniScript 用占位第 0 元素保持 1-basedRust 用(i - 1) as usize转 0-based随机种子QRND(1)一局内固定每局重新随机同局内复用输入 0 重置版面不重置种子两条公式按NM与否切换将上一步输入作为状态显式保存供分支判断输入校验非整数、11判非法循环读取直到合法非法时输出ILLEGAL ENTRY--TRY AGAIN.特殊输入0重置版面11开新局在分支前先处理注意11会重置计数器与种子胜负判定全部为O且步数12输出VERY GOOD与TRY HARDER NEXT TIME两种结语注意区分如何运行这些实现仓库是只读的你可以通过查看与本地运行来验证上述行为BASIC 原版使用兼容 Vintage BASIC 的解释器运行 36_Flip_Flop/flipflop.basPythonpython flipflop.py位于 36_Flip_Flop/python/flipflop.pyRust进入 36_Flip_Flop/rust 后cargo run依赖见Cargo.tomlMiniScript在 MiniScript 环境如 Mini Micro中加载 00_Alternate_Languages/36_Flip_Flop/MiniScript/flipflop.ms 执行。如果你想为 Flip Flop 贡献一个新的备选语言移植请参照00_Alternate_Languages的目录约定将代码放入对应子目录并附上 README保持控制台应用的原始观感同时像上述实现一样在注释中说明任何与原版行为不一致的地方——这类移植仅作教育用途但这恰恰是理解同一算法在不同语言中的表达差异的最佳练习。赞分享示例工程【免费下载链接】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点击查看免费下载相关推荐Archon Monorepo 上下文预热指南用 Prime 命令为 AI Agent 建立完整的代码库认知Archon Monorepo 上下文预热指南用 Prime 命令为 AI Agent 建立完整的代码库认知 本文围绕 Archon 仓库中面向编码 Agen示例工程Bagels 游戏的多语言移植实践从 BASIC 到 Go、Nim 与 MiniScript 的替代语言实现解析Bagels 游戏的多语言移植实践从 BASIC 到 Go、Nim 与 MiniScript 的替代语言实现解析 导读 本文以仓库 00_Alternate示例工程Chemist 游戏的附加语言移植指南从 BASIC 到 Python、Rust 与 Perl 的多语言实现解析Chemist 游戏的附加语言移植指南从 BASIC 到 Python、Rust 与 Perl 的多语言实现解析 导读 本文以开源仓库 basic compu示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表