ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Basic Computer Games 之 Bowling:MiniScript 移植版完整指南

Basic Computer Games 之 Bowling:MiniScript 移植版完整指南 Basic Computer Games 之 BowlingMiniScript 移植版完整指南【免费下载链接】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导读本文以 00_Alternate_Languages/14_Bowling/MiniScript/README.md 为骨架系统讲解经典 BASIC 保龄球模拟游戏 Bowling 的 MiniScript 移植版从获取与安装运行环境命令行 MiniScript 与 Mini Micro 双方案、启动游戏的完整命令到逐段剖析 bowling.ms 源码中的随机滚球算法、计分模型与界面渲染逻辑。读完本文你将掌握如何在两种 MiniScript 环境中运行这款最多 4 人对战的 10 局制保龄球游戏并理解它与原始 bowling.bas 及仓库内其他语言移植版在实现细节上的异同。一、背景从 1978 年的 BASIC 到现代脚本语言Bowling 是 1978 年经典书籍《Basic Computer Games》中的一款保龄球模拟游戏由当时旧金山伍德罗·威尔逊高中的学生 Paul Peraino 编写完整游戏规则说明可参阅 14_Bowling/README.md游戏支持最多四名玩家同场竞技每人打满 10 局frame输入 ROLL 即可掷球程序会绘制剩余球瓶示意图O 表示球瓶已倒 表示球瓶仍站立并给出每次掷球的判定结果GUTTER落沟一个球瓶都没击中STRIKE全中第一球击倒全部 10 个球瓶SPARE补中第二球击倒剩余全部球瓶ERROR第二球后仍有球瓶站立本仓库的 00_Alternate_Languages 目录收录了上述约定十种语言之外的各种移植版这些移植仅供教学目的使用。其中 MiniScript 版本位于 00_Alternate_Languages/14_Bowling/MiniScript/源码文件为 bowling.ms其原始 BASIC 代码来源于 Vintage Basic 网站。二、运行环境与启动方式原文档核心内容MiniScript 移植版bowling.ms不依赖任何第三方库仅import listUtil使用内置工具库但需要 MiniScript 解释器。原文档给出了两种官方推荐的运行方式方式一命令行版 MiniScriptCommand-Line MiniScript从 MiniScript 官方网站的 Command-Line 页面下载适配你操作系统的命令行解释器并完成安装在终端中进入包含bowling.ms的目录执行miniscript bowling.ms命令行版适合在纯终端环境中体验程序的全部输入输出均走标准控制台input读取玩家指令print输出球瓶图与计分结果。方式二Mini Micro 图形环境Mini Micro 是 MiniScript 的图形化运行时类似一台内置 MiniScript 的小型虚拟机从 MiniScript 官网的 Mini Micro 页面下载并启动 Mini Micro点击顶部磁盘槽位选择 Mount Folder...挂载文件夹选中包含bowling.ms与本文 README 的文件夹即00_Alternate_Languages/14_Bowling/MiniScript/在 Mini Micro 的命令提示符下依次输入load bowling runload会加载同目录下的bowling.ms程序文件run启动游戏。Mini Micro 方式保留了与命令行版完全一致的交互流程但运行在模拟器的图形终端中。两种方式运行的是同一个 bowling.ms 文件无需任何修改即可在两种环境下无缝切换这得益于 MiniScript 语言本身的可移植设计。三、游戏启动流程与交互体验结合 bowling.ms 的源码主程序位于文件末尾的Main program段一次完整对局分为以下阶段1. 开场横幅print *34 Bowl print *15 Creative Computing Morristown, New Jersey程序沿袭了原版 BASIC 的开场排版对应 bowling.bas 中的PRINT TAB(34);BOWL与PRINT TAB(15);CREATIVE COMPUTING MORRISTOWN, NEW JERSEY用空格缩进模拟TAB居中效果。2. 欢迎与规则介绍print Welcome to the alley print Bring your friends print Okay lets first get acquainted ans input(The instructions (Y/N)? ).upper if not ans or ans[0] ! N then printInstructions输入非 N含回车留空即打印规则说明printInstructions内容与 1978 年原版逐字对应游戏考验mind and skill、最多 4 名玩家、共 10 局、O 表示球瓶倒下、 表示球瓶站立。3. 玩家数量校验while true numPlayers input(First of all...How many are playing? ).val if 0 numPlayers 5 then break print Please enter a number from 1 to 4. end whileMiniScript 支持链式比较0 numPlayers 5将输入限制在 14 之间非法输入会提示 Please enter a number from 1 to 4. 并要求重新输入这比原版 BASIC 的裸INPUT R多了一层输入健壮性。4. 主对局循环while true playOneGame ans input(Do you want another game? ).upper if not ans or ans[0] ! Y then break end whileplayOneGame负责打完 10 局并打印最终计分表随后询问 Do you want another game?输入 Y 继续、其余任意输入或直接回车结束程序。四、核心玩法与计分模型深度解析4.1 球瓶状态与三维计分数组pinDown [0]*10 // state of each pin: 1down, 0standing scores list.init3d(10, 4, 3, 0) // index by [frame][player][ball], all 0-basedpinDown是长度为 10 的数组1表示球瓶已倒、0表示仍站立对应原版 BASIC 的C(15)数组scores使用 MiniScript 标准库listUtil提供的list.init3d(10, 4, 3, 0)创建三维数组[局][玩家][球]维度为 10 局 × 4 名玩家 × 3 个数据位初值全 0。需要特别指出的是源码注释也明确说明这个移植版的计分并不符合真实保龄球规则——它只是在每一球结束后记录当时累计倒下的球瓶总数并额外存放一个状态码status3STRIKE、2SPARE、1其他没有 strike/spare 的加分滚球逻辑。这与原版 BASIC 的行为一致见 14_Bowling/README.md 的 Known Bugs 一节该游戏每球得分只是该球后累计倒瓶数第三行数据是状态指示器。4.2 随机滚球算法mod 15 系统rollOneBall是整款游戏最有趣的部分它直接继承了原版 BASIC 注释为 ARK BALL GENERATOR USING MOD 15 SYSTEM 的算法rollOneBall function print Type roll to get the ball going. input // (response ignored) for i in range(1, 20) // Generate a random number from 0-99, then take this mod 15. // This gives us a slightly higher chance of hitting a non-existent // pin than one of the actual 10. x floor(rnd*100) if x % 15 10 then pinDown[x % 15] 1 end for printPinDiagram end function算法要点玩家输入任意内容甚至直接回车即可触发掷球输入本身被忽略循环 20 次每次生成[0, 99]的随机整数x取x % 15014只有当余数落在 09 时才将对应编号的球瓶置为倒下由于余数空间是 014 而真实球瓶只有 10 个掷球有 5/15 的概率击打不存在的球瓶等效于脱靶从而模拟出比真实 10 瓶制稍低的命中率同一球瓶可能被重复标记重复置 1 无副作用因此单次掷球倒下的瓶数服从一定随机分布且始终不会超过 10。对照原版 BASIC 的实现FOR I1 TO 20 XINT(RND(1)*100) FOR J1 TO 10 IF X15*J THEN 3330 NEXT J 3330 C(15*J-X)1 NEXT IBASIC 版本用找到第一个使X 15*J成立的J来确定15*J - X114 之间的编号逻辑上等价于 MiniScript 版的x % 15取模运算但 MiniScript 版本的可读性明显更高。4.3 球瓶示意图渲染printPinDiagram把 10 个球瓶按标准三角阵排列为 4 行行row从 0 到 3每行球瓶数递减printPinDiagram function print Player: (player1) Frame: (frame1) Ball: (ball1) print k 0 for row in range (0, 3) line * row for j in range(1, 4-row) line O[pinDown[k]] k 1 end for print line end for end function每行行首缩进row个空格形成三角形站位字符串索引技巧O[pinDown[k]]当pinDown[k]为 0 时取字符站立为 1 时取O倒下一行代码完成条件渲染输出前先打印Player: N Frame: N Ball: N标头注意源码中player、frame、ball均为 0 基索引展示时 1。4.4 掷球分析与状态判定printAnalysis负责根据本球后的倒瓶数给出反馈printAnalysis function(previousDown0) pinsLeft 10 - pinDown.sum if pinDown.sum previousDown then print Gutter!! if ball 0 and pinsLeft 0 then print Strike!!!!! char(7)*4 globals.status 3 else if ball 1 and pinsLeft 0 then print Spare!!!! globals.status 2 else if ball 1 and pinsLeft 0 then print Error!!! // (i.e., didnt clear all the pins in 2 balls) globals.status 1 end if end function若本球倒瓶数与上一球相同即一球未中输出Gutter!!第一球ball 0即清空全部球瓶输出Strike!!!!!并追加 4 个char(7)——这是终端响铃控制字符对应原版 README 提到的 funny control characters in the STRIKE! string literal are there to make the terminal beep第二球ball 1清空Spare!!!!第二球仍未清空Error!!!状态码status3/2/1会写入scores[frame][player][2]供计分表展示。4.5 单局流程控制doOneFrame function globals.pinDown [0]*10 globals.ball 0 rollOneBall printAnalysis hitOnBall0 pinDown.sum scores[frame][player][ball] hitOnBall0 globals.ball 1 if hitOnBall0 10 then print Roll your 2nd ball print rollOneBall printAnalysis hitOnBall0 end if scores[frame][player][ball] pinDown.sum scores[frame][player][2] status end function每局开始重置球瓶并置ball 0第一球后若未全中hitOnBall0 10才提示 Roll your 2nd ball 并掷第二球全中则跳过两个球后的累计倒瓶数分别存入scores[frame][player][0]与[1]状态码存入[2]。4.6 最终计分表printFinalScores先打印 FRAMES 标题与 110 局编号行再按玩家逐行输出三行数据每球的倒瓶数、第二球后累计、状态码pad函数用右对齐格式化输出。值得注意的是原版 BASIC 在多人对局下存在计分错乱缺陷——它用A(F*P,B)存储分数例如第 8 局玩家 1索引 16会覆盖第 4 局玩家 2索引也是 16的数据MiniScript 移植版改用真正的三维数组scores[frame][player][ball]从数据结构上彻底修复了这一索引冲突问题。另外原版 BASIC 在第二局时还会触发 NEXT without FOR 崩溃相关缺陷同样记录在 14_Bowling/README.md 的 Known Bugs 中而 MiniScript 版的主循环使用清晰的while true ... break结构不存在该问题。五、源码结构对照函数清单与职责bowling.ms 全文约 140 行采用 MiniScript 的函数式组织方式比原版 BASIC 的行号跳转结构GOTO 3330、GOTO 6210等更易读。核心函数一览函数职责printInstructions打印游戏规则说明printPinDiagram渲染 4 行三角球瓶示意图printAnalysis(previousDown)判定 Gutter / Strike / Spare / Error 并写入statusrollOneBall读取掷球输入执行 mod 15 随机算法打印球瓶图doOneFrame控制单玩家单局的两球流程与计分存储pad(n, width)右对齐格式化输出printFinalScores打印全部玩家的 FRAMES 计分表playOneGame串行完成 10 局 × N 玩家并输出最终计分全局状态pinDown、player、frame、ball、scores、status、numPlayers通过globals关键字在函数间共享这是 MiniScript 中函数内修改全局变量的标准做法。六、与其他语言移植版的异同仓库中 Bowling 拥有多个移植版对照阅读可更深入理解本 MiniScript 版的取舍Python 版保留了相同的 mod 随机滚球思路random.randint(0, 14)if x len(pins)置瓶但额外实现了真实保龄球计分calculate_score处理 strike/spare 的加分滚球与第 10 局的奖励球并允许为玩家命名——其源码注释明确说明这是对原版计分矩阵 bug 与严格规则的改进JavaScript 版几乎逐行直译 BASIC包括保留a[f*p][b]的计分矩阵与再玩一局不重置 P的原始缺陷可作为理解原始算法行为的对照基准MiniScript 版介于两者之间——忠实保留了 mod 15 算法与非真实计分模型但用三维数组与结构化函数修复了数据结构缺陷。若想进一步对比原始逻辑可同时阅读根目录的 bowling.bas仓库内另一份 00_Alternate_Languages/14_Bowling/bowling.bas 为 Alternate Languages 目录下的副本。七、快速上手指南# 方式一命令行 MiniScript需先安装命令行解释器 cd 00_Alternate_Languages/14_Bowling/MiniScript miniscript bowling.ms # 方式二Mini Micro 图形环境 # 1. 启动 Mini Micro点击磁盘槽位 → Mount Folder... # 2. 选择 00_Alternate_Languages/14_Bowling/MiniScript/ 目录 # 3. 在命令提示符执行 load bowling run进入游戏后按提示操作输入 Y 查看规则 → 输入玩家数14→ 每次出现 Type roll to get the ball going. 时输入任意内容或直接回车掷球 → 观看球瓶图与判定 → 10 局结束后查看 FRAMES 计分表 → 询问 Do you want another game? 时输入 Y 再来一局或回车退出。结语Bowling 的 MiniScript 移植版是理解如何将 1978 年的行号 BASIC 程序改写为现代可读脚本的绝佳范例。它以 bowling.ms 约 140 行代码完整还原了原版游戏的交互流程与 mod 15 随机掷球算法同时用三维数组、链式比较、O[pinDown[k]]索引取字符等现代语法修复了原版的索引错乱缺陷。无论你是 MiniScript 语言学习者还是经典游戏的复古玩家都可以通过本文的两种运行方式在 5 分钟内启动这场最多 4 人的 10 局保龄球大战。【免费下载链接】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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表