
示例工程【免费下载链接】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点击查看免费下载本文围绕 72_Queen/README.md 展开系统讲解经典文字游戏 Queen皇后的完整规则、8×8 棋盘的数字编号体系、合法移动校验逻辑、电脑 AI 的制胜策略并结合本仓库中 queen.bas 原始 BASIC 程序以及 C#、Java、Python、JavaScript、Rust 等多语言移植实现如 csharp/Game.cs、python/queen.py、rust/src/ai.rs进行源码级佐证。读者阅读本文后将能完全理解该游戏的规则建模方式、掌握把经典棋盘游戏移植到现代语言的通用思路并能直接运行本仓库中任意语言的 Queen 实现。一、游戏概述与历史出处Queen 是一款基于国际象棋皇后走法的双人博弈游戏最早收录于 David Ahl 编著的经典游戏合集Basic Computer Games1978 年Creative Computing 出版社。本仓库 README.md 明确了其核心设定This game is based on the permissible moves of the chess queen — i.e., along any vertical, horizontal, or diagonal. In this game, the queen can only move to the left, down, and diagonally down to the left.也就是说皇后只能沿三个方向移动向左水平、向下垂直、向左下对角。游戏目标是把唯一的皇后棋子放到棋盘左下角格子编号 158玩家与电脑交替移动率先将皇后置于该格者获胜。原 README 还特别说明玩家先手第一步必须把皇后放在顶行或最右列的任意格子上电脑是可以被击败的但需要玩家动脑找出必胜策略The computer is beatable, but it takes some figuring. See if you can devise a winning strategy.。本仓库中的 queen.bas 即源自 Vintage Basic 下载的原始 BASIC 程序随后被社区以多种语言移植详见 00_Alternate_Languages/72_Queen 目录。二、棋盘编号体系理解全部代码的前提Queen 的 8×8 棋盘上共有 64 个格子原始 BASIC 程序用DIM S(64)与DATA语句queen.bas记录了全部格号。完整棋盘布局如下顶行为第 8 行底行为第 1 行81 71 61 51 41 31 21 11 92 82 72 62 52 42 32 22 103 93 83 73 63 53 43 33 114 104 94 84 74 64 54 44 125 115 105 95 85 75 65 55 136 126 116 106 96 86 76 66 147 137 127 117 107 97 87 77 158 148 138 128 118 108 98 88这一布局与 C# 移植版独立维护的资源文件 csharp/Resources/Board.txt 以及 Java 版Queen.java中的S[]数组java/Queen.java、JavaScript 版 javascript/queen.js 中的sa[]数组完全一致。这个编号并非随意设计而是蕴含着巧妙的编码规则。以 C# 移植版 csharp/Position.cs 的定义为线索public Position(int number) : this(Diagonal: number / 10, Row: number % 10) { }每个格号是一个两位数如 81、158其中个位 行号Row1 表示顶行8 表示底行即自顶向下递增十位 对角序号Diagonal其取值 815同时隐含列信息。Python 移植版 python/queen.py 给出了精确的坐标换算公式可直接验证def num_to_loc(num: int) - Tuple[int, int]: Convert a space number into a position given by row, column. row: int num % 10 - 1 col: int row 8 - (num - row - 1) // 10 return row, col代入几个关键格子验证81→ 行 0、列 0左上角88→ 行 7、列 7右下角158→ 行 7、列 0即WIN_LOC左下角获胜格对应 Python 中WIN_LOC (7, 0)python/queen.py与 C# 中IsEnd Row 8 Diagonal 15csharp/Position.cs。该编号体系的最大价值在于合法的皇后移动在数值上呈现严格的算术规律详见下一节这使得 1978 年的 BASIC 程序无需坐标数组即可完成全部校验与 AI 计算——这是理解后续所有代码的核心钥匙。三、合法移动的校验逻辑从 BASIC 到现代语言3.1 起始位置规则游戏要求玩家第一步必须把皇后放在顶行或最右列。顶行所有格子的个位都是 1最右列11、22、33、44、55、66、77、88的格子满足个位等于十位。因此 queen.bas 中通过两条判断实现140 IF U11 THEN 200 150 IF U1T1 THEN 200 160 PRINT PLEASE READ THE DIRECTIONS AGAIN. 170 PRINT YOU HAVE BEGUN ILLEGALLY.C# 移植版把这一规则抽象为Position.IsStart属性csharp/Position.cspublic bool IsStart Row 1 || Row Diagonal;Java 版则命名为isTopmostRowOrRightmostColumnjava/Queen.java逻辑完全等价。3.2 单步移动校验每次轮到玩家时需要校验其目标格是否位于当前格电脑上一手的合法方向上。BASIC 原始程序用U1新个位、T1新十位、U旧个位、T旧十位四个变量完成判断queen.bas239 IF M1M THEN 3200 260 PU1-U 270 IF P0 THEN 300 280 LT1-T 290 IF L0 THEN 3200 300 IF T1-T P THEN 320 310 GOTO 200 320 IF T1-T 2*P THEN 3200翻译成现代逻辑就是结合坐标系的算术规律所有合法移动都会使格号增大故先要求新格号 旧格号否则直接判非法P 0个位不变行号不变且十位增大 →向左移动合法十位增量 P行号与对角序号同步递增→向左下对角移动合法十位增量 2*P行号增 P、对角序号增 2P对应列号减 P→向下移动合法其余情况均非法。同样地Python 移植版 python/queen.py 用坐标形式表述了完全相同的三条规则elif ( (new_row row and new_col col) # move left or (new_col col and new_row row) # move down or (new_row - row col - new_col) # move diag left and down ) ...Java 版 java/Queen.java 的validateUserMove则把格号必须增大作为前置条件再分别判断同列p 0时十位必须增大、对角tensUser - tensComputer p与左移 2 * p三种情况与 BASIC 逐行对应。3.3 非法输入的容错处理三处关键容错逻辑在所有移植中均被保留指令询问只接受 YES/NO否则提示 PLEASE ANSWER YES OR NO. 并重新询问queen.bas非数字输入Python 版通过try/except ValueError捕获并提示 !NUMBER EXPECTED - RETRY INPUT LINEpython/queen.py非法移动输出 Y O U C H E A T . . . TRY AGAIN 并重新要输入queen.bas。3.4 认输Forfeit规则玩家随时可以输入0认输电脑直接获胜输出 IT LOOKS LIKE I HAVE WON BY FORFEIT.queen.bas。这一点在 C# 中由humanPosition.IsZero判定csharp/Game.csPython 中则通过返回哨兵坐标(8, 8)实现python/queen.py。四、电脑 AI 策略可击败但需要动脑原 README 明确提示电脑是可击败的这暗示电脑并非全知。从源码看其 AI 是一套贪婪式启发策略 随机兜底的组合并不做完整博弈树搜索。4.1 有利位置Desirable Squares电脑总是倾向于把皇后移动到以下 5 个格号之一BASIC 的 queen.bas 逐个测试158 / 127 / 126 / 75 / 73格号坐标行, 列含义158(7, 0)获胜格127(6, 2)有利位置126(5, 1)有利位置75(4, 5)有利位置73(2, 3)有利位置C# 移植版将这一集合明确命名为_desirablecsharp/Computer.csJava 版evaluateComputerMove中也有完全相同的硬编码列表java/Queen.java。4.2 主策略从 K7 递减寻找一步可达的有利位置BASIC 核心循环queen.bas从K7递减到K1依次检查三种方向能否恰好 K 步到达有利位置2070 FOR K7 TO 1 STEP -1 2080 UU1 2090 TT1K 同列向上? 向左 K 步 2100 GOSUB 3500 2110 UUK 向下 K 步 2120 GOSUB 3500 2130 TTK 向左下对角 K 步 2140 GOSUB 3500从大到小搜索的原因在于移动距离越大越能快速逼近左下角的胜利区同时避免在获胜路径上绕远。C# 版 csharp/Computer.cs 的FindMove与此一一对应private Move FindMove(Position from) { for (int i 7; i 0; i--) { if (IsOptimal(Move.Left, out var move)) { return move; } if (IsOptimal(Move.Down, out move)) { return move; } if (IsOptimal(Move.DownLeft, out move)) { return move; } bool IsOptimal(Move direction, out Move move) { move direction * i; return _desirable.Contains(from move); } } return _random.NextMove(); }4.3 安全点与随机兜底BASIC 程序在 6 个特定格号41、44、73、75、126、127上会直接放弃计算、随机移动queen.bas。Python 移植版给出了这些格号的含义python/queen.pyCOMPUTER_SAFE_SPOTS {(2,3), (4,5), (5,1), (6,2)}即格号 73、75、126、127——电脑总是优先移动到这些格SAFE_SPOTS在电脑安全点基础上再加(0,4)41与(3,7)44注释说明这些位置是任一方都能强制获胜的位置——因此当玩家恰好站在这些格时电脑无法阻止玩家取胜只能随机应对。随机移动同样遵循三步走BASIC queen.basPython python/queen.py随机值区间移动方向格号增量z 0.6向下一步110.3 z ≤ 0.6向左下一步21z ≤ 0.3向左一步10之所以随机移动存在这些固定的格号增量正是第二节所述编号体系十位、个位分别编码行与列的直接推论也是整份代码中数学建模最精妙的一处。从源码结构看Rust 移植版 rust/src/ai.rs 对策略常数做了简化SAFE_MOVES [44, 41]、PREFERRED_MOVES [158, 72, 75, 126, 127]其中 72 与 BASIC 原版的 73 存在细微差异是移植过程中值得注意的偏差点。五、胜负判定与游戏流程5.1 完整对局流程综合 BASIC 主循环queen.bas与 C# 的PlayGamecsharp/Game.cs每局游戏按如下流程推进打印棋盘玩家输入起始格必须位于顶行或最右列若输0则直接认输电脑计算移动并打印 COMPUTER MOVES TO SQUARE xxx若电脑落到 158 → 电脑获胜玩家输入下一步必须从电脑所在格按合法方向移动若输0认输若玩家落到 158 → 玩家获胜回到第 3 步循环。5.2 胜负消息玩家获胜输出 C O N G R A T U L A T I O N S . . . YOU HAVE WON--VERY WELL PLAYED. 等台词queen.bas电脑获胜输出 NICE TRY, BUT IT LOOKS LIKE I HAVE WON.queen.bas认输输出 IT LOOKS LIKE I HAVE WON BY FORFEIT.。C# 移植版将这些文案全部外置到独立的资源文件如 csharp/Resources/Congratulations.txt、csharp/Resources/IWin.txt、csharp/Resources/Forfeit.txt由 csharp/Game.cs 中的switch表达式按Result枚举统一分发是文案与逻辑分离的移植范例。5.3 多局循环每局结束后程序询问 ANYONE ELSE CARE TO TRY?接受 YES/NO 决定是否再来一局结束后输出 OK --- THANKS AGAIN.queen.bas。六、多语言移植概览与运行方式本仓库为 Queen 提供了丰富的移植形态各目录内均有对应语言的README.md结合目录结构可以这样运行语言主要文件运行方式从仓库结构推断原始 BASICqueen.bas使用 Vintage BASIC 等解释器加载运行C#csharp/Queen.sln、csharp/Program.csdotnet run需 .NET SDKJavajava/Queen.javajavac Queen.java java QueenPythonpython/queen.pypython3 queen.py需 Python 3.8见文件 docstringJavaScriptjavascript/queen.html浏览器直接打开Rustrust/Cargo.toml、rust/src/main.rscargo runPerlperl/queen.plperl queen.pl此外00_Alternate_Languages/72_Queen 目录还收录了 Go*.go与 MSX BASIC*.ms等更多语言的移植版本可作为交叉对照参考。七、移植注意事项Python 版的三个可配置开关原 README 的 Porting Notes 部分鼓励移植者记录移植难点。Python 移植版 python/queen.py 通过三个文件级常量集中展示了移植过程中的典型问题与修复方案极具参考价值FIX_BOARD_BUG: Final[bool] False # 修复允许移出棋盘如 91的原始 bug SHOW_BOARD_ALWAYS: Final[bool] False # 是否每回合都打印棋盘 ALIGNED_BOARD: Final[bool] False # 是否对齐棋盘数字解决位数不齐的排版问题FIX_BOARD_BUG原始实现存在允许玩家移动到棋盘外格子的缺陷例如起始格 91 并不存在置为True后会在起始与后续移动校验中额外检查0 col且row 8python/queen.pySHOW_BOARD_ALWAYS默认只在每局开始时打印一次棋盘与 BASIC 一致置为True可每回合刷新棋盘提升可玩性python/queen.pyALIGNED_BOARD由于格号位数不一两位与三位混杂默认棋盘排版歪斜置为True后loc_to_num会给两位格号补空格对齐python/queen.py。这三个开关集中体现了忠实复刻原始行为与改善现代可玩性之间的权衡是阅读移植代码时理解作者取舍的绝佳入口。八、结语Queen 虽然只是一款 1978 年的小型文字游戏但其设计展现了极高的建模密度一个简单的两位数格号同时编码行与列使得移动校验与 AI 策略全部退化为纯算术运算这在内存与计算资源极其有限的年代堪称优雅。本仓库 72_Queen/README.md 保留的原始规则描述与 queen.bas 的完整实现再加上 C#、Java、Python、Rust、JavaScript 等移植版的互相印证构成了一个极佳的学习样本——无论是研究经典博弈算法、棋盘坐标建模还是练习跨语言移植Queen 都是一个小而完整的起点。赞分享示例工程【免费下载链接】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 之 Chomp毒曲奇博弈Perl 版移植实现解析Basic Computer Games 之 Chomp毒曲奇博弈Perl 版移植实现解析 导读 Chomp 是 1978 年经典《Basic Comput示例工程ESP32 Arduino 的 OpenThread CLI 使用指南CLI Helper 函数与 OpenThreadCLI 类详解ESP32 Arduino 的 OpenThread CLI 使用指南CLI Helper 函数与 OpenThreadCLI 类详解 本指南以 ESP32示例工程Basic Computer Games 移植指南Hockey 冰球模拟游戏BASIC 源码剖析与多语言移植实践Basic Computer Games 移植指南Hockey 冰球模拟游戏BASIC 源码剖析与多语言移植实践 本文以《Basic Computer G示例工程上一篇Conky文档写作规范保持知识库的一致性下一篇如何优化huihui-Qwen3-VL-2B-Instruct-ab-4bit性能4位量化与内存效率提升技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考