Awari 游戏 MiniScript 移植版:运行指南与源码实现解析(basic-computer-games)
示例工程【免费下载链接】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点击查看免费下载Awari也称 Kalah / Mancala 类游戏是《Basic Computer Games》经典书籍中的文字策略游戏本仓库在00_Alternate_Languages/04_Awari/MiniScript/下提供了完整的 MiniScript 移植版。本文以该目录下的 README.md 为核心结合 awari.ms 源码与仓库内的规则文档、原始 BASIC 版本系统讲解如何在命令行 MiniScript 与 Mini Micro 两种环境中运行游戏并深入剖析其 14 槽棋盘模型、播种与捕获规则、双层2-ply博弈评估以及“失败开局记录”学习机制的完整实现。读完本文你将能独立运行、阅读乃至改造这份 MiniScript 移植代码。一、关联文档说了什么MiniScript 目录下的 README 是官方移植说明它明确了三个要点来源程序源码最初下载自 Vintage Basic经典 BASIC 游戏存档站随后被转换为 MiniScript 语言。两种运行方式命令行 MiniScript下载对应系统的命令行解释器安装后执行miniscript awari.msMini Micro下载 Mini Micro 桌面环境挂载包含awari.ms与本 README 的文件夹然后在 Mini Micro 命令提示符下执行load awari和run。目录内同时提供 awari.ms 源码与 README 本身。二、游戏背景与规则速览在动手运行前先理解游戏本身。仓库主游戏目录的 04_Awari/README.md 给出了权威规则说明棋盘构成Awari 使用 14 个槽位——双方各有 6 个“坑”pit外加两端各 1 个“家”home。开局时除两个家外每个坑放 3 枚石子共 36 枚。走法从己方任意非空坑取出全部石子按逆时针方向从该坑右侧的下一坑开始逐坑播种每坑 1 枚。连续回合若最后一枚石子落入己方“家”可再走一步最多两步。捕获若最后一枚石子落入空坑、且对侧坑镜像位置非空则将对方对侧坑全部石子连同刚落下的这一枚一起捕获进自己的家。胜负当某一方所有 6 个坑都为空时游戏结束家中石子多者获胜。原书版本中计算机始终让玩家先手并认为这给了玩家轻微优势。在计算机版本中棋盘以 14 个数字打印形如3 3 3 3 3 3 0 0 3 3 3 3 3 3下方是你的 6 个坑从左到右编号 1–6上方是计算机的 6 个坑。三、两种运行方式详解以下命令与步骤均出自关联 README可直接复现。方式一命令行 MiniScript从 MiniScript 官网的 command-line 页面下载对应操作系统的命令行解释器并安装后在终端进入 MiniScript 目录执行miniscript awari.ms程序启动后会先打印标题Awari与Creative Computing Morristown, New Jersey随后立即进入第一局游戏等待Your move?输入。方式二Mini Micro 桌面环境下载并启动 Mini Micro点击顶部磁盘槽位选择 “Mount Folder...”选中包含 awari.ms 与 README 的MiniScript文件夹在 Mini Micro 命令提示符下依次输入load awari run两种方式运行的逻辑完全一致仅解释器环境不同。Mini Micro 额外提供了图形化文件系统与调试界面更适合边运行边单步观察。四、源码结构与 14 槽棋盘模型awari.ms 全文件约 146 行结构清晰badGames跨局记录失败/平局开局的列表学习机制核心printQty(qty)/printBoard棋盘格式化输出moveStones(board, position, homePos)播种与捕获的底层逻辑getPlayerMove(prompt)玩家输入校验getComputerMove计算机走子与 2-ply 评估isGameOver/playOneGame单局流程末尾while true主循环无限对局。棋盘用长度为 14 的列表表示源码注释写“13 个数”属笔误实际为 14 个元素索引 0–5玩家下方6 坑玩家输入 1–6内部映射为pos - 1索引 7–12计算机上方6 坑索引 6玩家“家”索引 13计算机“家”。开局通过globals.board [3]*14; board[13] 0; board[6] 0完成——除两个家外全部放 3 枚。这一布局与原始 BASIC 版本 00_Alternate_Languages/04_Awari/awari.bas 中的FOR I0 TO 12:B(I)3:NEXT I完全一致。播种与捕获moveStonesmoveStones function(board, position, homePos) p board[position]; board[position] 0 while p position (position 1) % 14 board[position] 1 p - 1 end while if board[position] 1 and position ! 6 and position ! 13 and board[12-position] then board[homePos] board[12-position] 1 board[position] 0 board[12-position] 0 end if globals.gameOver board[0:6].sum 0 or board[7:13].sum 0 return position homePos end function关键点用(position 1) % 14实现逆时针环绕播种捕获条件是落点为空坑、非两个家、且镜像坑12 - position非空——镜像映射正是 BASIC 版B(12-M)的直译每步结束后立即用board[0:6].sum 0 or board[7:13].sum 0判断是否有一方清空从而触发终局返回值position homePos告知调用方“最后一子是否落进自己家”决定是否可连续走第二步。玩家输入校验getPlayerMove玩家输入 1–6函数将其转换为 0–5 的坑索引并拒绝非法输入越界或坑为空不断循环直到合法getPlayerMove function(promptYour move) while true pos input(prompt ? ).val if 0 pos 7 and board[pos-1] then return pos - 1 print Illegal move. end while end function这一步对应 BASIC 版的110 INPUT M ... 130 IF B(M)0 THEN 120输入重试逻辑且明确支持小写输入input后直接.val取数值无大小写限制符合仓库“modern coding conventions”的移植要求。五、计算机 AI2-ply 评估与失败开局学习计算机决策是这份源码最有技术含量的部分分两层1. 双层2-ply博弈评估getComputerMove对计算机每个合法走法索引 7–12执行以下流程复制棋盘boardCopy board[:]模拟走子moveStones board, j, 13枚举玩家所有可能的回应索引 0–5用数学估算“玩家该走法的得分”先计算落点landPos board[i] i环绕取模若落点为空且非家则score board[12 - landPos]计入捕获收益取所有玩家回应中的最大得分bestPlayerScore用零和思想计算本走法的质量分ourScore board[13] - board[6] - bestPlayerScore——计算机家中的石子减去玩家家中的石子再减去玩家最优回应的威胁恢复棋盘globals.board boardCopy[:]遍历完所有合法走法后取最高分对应的走法。这正是原始 BASIC 子程序 800 行的直译BASIC 版同样先备份G(I)B(I)、遍历 J7–12、对每个玩家回应打分QB(13)-B(6)-Q、再恢复B(I)G(I)。注意 Python 移植版 04_Awari/python/awari.py 的移植注释中明确指出BASIC 原版830 IF L13 THEN LL-14:R1:GOTO 830中R1疑似应为RR1每绕一圈加分Python 版将其修正为累加而 MiniScript 版直接用floor(landPos / 14)累加圈数行为与修正后一致。2. “失败开局”学习机制badGames源码顶部注释道出了设计意图保留以往输掉或平局对局的前 8 步开局走法序列用于惩罚未来重复相同开局。每局结束后playOneGame会把本局前 8 步走法存入gameMoves若本局是玩家获胜或平局且该序列尚未记录则加入badGamesif badGames.indexOf(gameMoves) null then badGames.push gameMoves评估走法时若当前累计走法gameMoves [j]与某个badGame前缀完全匹配则该走法质量分减 2ourScore - 2这个机制只在gameMoves.len 8时生效即只“惩罚”开局阶段。对比 Python 版的实现细节更有意思Python 版用losing_book以六进制编码整局走法历史losing_book[game_number] * 6 move_digitMAX_HISTORY 9、LOSING_BOOK_SIZE 50BASIC 原版同样用F(N)F(N)*6K编码。而 MiniScript 版选择了更直观的“走法序列列表 前缀匹配”方案可读性更强功能等价——这正是仓库所倡导的“把原代码中巧妙技巧拆解为更简单、注释充分的代码”。3. 对局主流程playOneGame主循环完整复刻原书流程打印棋盘getPlayerMove取玩家走法moveStones(board, pos, 6)执行若落点在自己家且未结束打印棋盘并询问Again再走第二步轮到计算机打印My move is后调用getComputerMove用char(42bestMove)输出 A–F 字母标记走法若可连续则打印...followed by再走一次任一步后若gameOver则立即跳出终局打印GAME OVER以board[6] - board[13]判定胜负负则“I win by N points”且不记录进 badGames零分打印Drawn game正分打印You win by N points后两者记录进 badGames。char(42bestMove)的输出方式也忠实还原了 BASIC 版PRINT CHR$(42M)保证命令行输出与原书风格一致。六、玩法提示与可扩展方向先手提示程序始终让玩家先走输入 1–6 选择己方坑位若上一子落入自家会提示Again。获胜条件提醒不要只顾着捕获注意游戏结束条件是“某一方 6 坑全空”提前布局让对手无子可走同样是取胜策略。想调整难度或规则可参考 Python 移植版 awari.py 顶部 “EXERCISES FOR THE READER” 列出的改造点改变每坑初始石子数、增减坑数、限制捕获范围、禁止捕获、顺时针播种、允许超过两步连走、加深 AI 前瞻层数、将学习历史持久化到磁盘等——这些思路同样适用于 MiniScript 版本。七、小结MiniScript 版 Awari 是“老游戏、新语言”移植的典型范例它用约 146 行紧凑代码完整保留了原书玩法、14 槽棋盘输出格式与 AI 行为同时通过badGames列表将原版晦涩的六进制失败开局编码改造成可读的前缀匹配方案。无论你是想体验 1978 年的经典棋类博弈还是想研究“2-ply 极小化极大 简单经验学习”在脚本语言中的落地实现awari.ms 都是一份值得通读的样例而 04_Awari/README.md 中的规则与 Python 移植版 的移植注释则提供了最完整的背景对照。赞分享示例工程【免费下载链接】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 中 Bug 游戏的 MiniScript 移植版安装运行与源码解析basic computer games 中 Bug 游戏的 MiniScript 移植版安装运行与源码解析 本篇文章基于 basic computer ga示例工程basic-computer-games 之 Hurkle 游戏 MiniScript 移植版三种运行方式与源码逐行解析basic computer games 之 Hurkle 游戏 MiniScript 移植版三种运行方式与源码逐行解析 本指南以 00_Alternate_示例工程WeKnora 技术全景指南企业级 RAG、ReAct Agent 与自动 Wiki 知识平台的架构与部署实践WeKnora 技术全景指南企业级 RAG、ReAct Agent 与自动 Wiki 知识平台的架构与部署实践 WeKnora 是腾讯开源的 LLM 知识平台示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

wandb-core 日志依赖解析:使用 stdr 以 Go 标准库 log 实现 logr 结构化日志接口

wandb-core 日志依赖解析:使用 stdr 以 Go 标准库 log 实现 logr 结构化日志接口

机器学习深度学习数据可视化可观测性 【免费下载链接】wandb The AI developer platform. Use Weights & Biases to train and fine-tune models, and manage models from experimentation to production. 项目地址: https://gitcode.com/gh_mirrors/wa/wandb 点…

2026/9/24 3:26:33 阅读更多 →
Serdes眼图抖动测试实操指南:Rj/Dj/Tj精准测量方法

Serdes眼图抖动测试实操指南:Rj/Dj/Tj精准测量方法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 3:26:33 阅读更多 →
ESP32无线调试新方案:用PyBLE和MicroPython实现BLE串口

ESP32无线调试新方案:用PyBLE和MicroPython实现BLE串口

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 3:26:33 阅读更多 →

最新新闻

AI陪伴机器人API设计-api-users到api-alerts的二十个接口

AI陪伴机器人API设计-api-users到api-alerts的二十个接口

05-API设计-api-users到api-alerts的二十个接口黒漂技术佬 AI 伙伴(AI-Partner)「数据接口部署与二次开发」系列 05数据层拆完了,这篇上到接口层。AI 伙伴后端一共 9 个 Controller、19 个 HTTP 接口,全部基于 http://localhost:…

2026/9/24 4:03:53 阅读更多 →
SSM毕设项目:基于 SSM 的视频课程资源管理系统的设计与实现 基于 SSM 的在线学习资源推送系统 (源码+文档,讲解、调试运行,定制等)

SSM毕设项目:基于 SSM 的视频课程资源管理系统的设计与实现 基于 SSM 的在线学习资源推送系统 (源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/24 4:03:53 阅读更多 →
GitHub趋势榜解读:从打不开到跑起来的全能实战指南

GitHub趋势榜解读:从打不开到跑起来的全能实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 4:03:53 阅读更多 →
LDO稳定性设计:STB仿真原理与相位裕度实战解析

LDO稳定性设计:STB仿真原理与相位裕度实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 4:03:53 阅读更多 →
牛客网 HJ61 放苹果

牛客网 HJ61 放苹果

牛客网 HJ61 放苹果题目链接:https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf一、原题完整陈述 题目描述 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?重点&#xff1…

2026/9/24 4:03:53 阅读更多 →
Qwen3-0.6B 后训练实践:一次被数据否定的预注册假设,以及 DPO 在小规模下的失效边界

Qwen3-0.6B 后训练实践:一次被数据否定的预注册假设,以及 DPO 在小规模下的失效边界

本文所有数字均来自本人单卡实测,原始 CSV / 日志见文末仓库。文中结论如无特别说明,均为 seed 42 单种子下的观察,不构成统计意义上的证明。 0. 为什么先写结论 这篇文章记录我做的一次完整的小模型后训练实验:在一张 RTX 4060 …

2026/9/24 4:02:52 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →