ARTICLE DETAIL

资讯详情

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

Basic Computer Games 之 Diamond:用 60 列字符终端打印菱形花砖图案的移植指南

Basic Computer Games 之 Diamond:用 60 列字符终端打印菱形花砖图案的移植指南 示例工程【免费下载链接】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点击查看免费下载本文以 32_Diamond/README.md 为骨架深入解读经典 BASIC 程序 Diamond 的运行规则、算法原理与多语言移植实践。你将理解它是如何用“奇数宽度 字符填充”在 8.5×11 英寸的硬拷贝终端上铺满菱形图案以及如何在 C#、Java、Kotlin、Ruby、Rust、Python、JavaScript 等实现中复刻其核心逻辑。程序背景与出处Diamond 是 1978 年 David Ahl 所著《Basic Computer Games》中的经典程序由 Creative Computing 出品。它不是一个“游戏”而是一个纯粹的艺术图案生成器程序会在一张 8.5×11 英寸的纸张上以硬拷贝终端打印为前提铺满由字符组成的菱形图案。原版出处收录于 Atari Archives 与 Annarchive 的《Basic Computer Games (1978)》扫描件BASIC 源文件则由 Vintage Basic 网站下载归档见 32_Diamond/README.md。当前仓库在保留原始 diamond.bas 的同时提供了 C#、Java、JavaScript、Kotlin、Lua、Perl、Python、Ruby、Rust、VB.NET 等十余种移植版本。运行规则奇数、范围与页宽程序的核心交互只有一个输入提示语FOR A PRETTY DIAMOND PATTERN, TYPE IN AN ODD NUMBER BETWEEN 5 AND 21输入要求一个5 到 21 之间的奇数README 提及范围可达 31不同移植版的边界处理略有差异页面宽度固定为60 字符对应 8.5 英寸纸张的字符宽度输入值决定菱形的高度与宽度字符数同时决定每行能横向排布几个菱形每行菱形数 60 / 输入值整数除法例如输入 5 时每行可排 12 个菱形输入 21 时每行约 2 个输入 31 时每行 1 个菱形铺满整行。各移植版对这个规则的印证python/diamond.py 中PAGE_WIDTH 60、count PAGE_WIDTH // widthcsharp/Pattern.cs 中diamondCount (int)(60 / diamondSize)java/Diamond.java 与 kotlin/diamond.kt 均以常量LINE_WIDTH 60定义页宽rust/src/lib.rs 中line_width 60并在 5~31 范围内额外强制校验输入必须为奇数num % 2 0时要求重输图案结构CC 前缀与 ! 填充单个菱形的字符构成非常简单最上/最下的尖顶先输出C两侧以空格对称扩张到宽度 ≥ 3 的行左右两侧各一个C即固定前缀CC中间全部用!填充行宽由 1 递增到用户输入值步长 2保证奇数再递减回 1BASIC 原文通过A$CC与MID$逐字符截取实现该逻辑diamond.basA$CC FOR A1 TO N IF CLEN(A$) THEN PRINT !; : GOTO 50 PRINT MID$(A$,C,1);各移植版的等价实现C# 中直接new string(C, Math.Min((int)i, 2)) new string(!, Math.Max(0, (int)i - 2))csharp/Pattern.csJava 以PREFIX CC、SYMBOL !两个常量驱动逐字符拼装java/Diamond.javaRuby 则用数组推导式生成行集合 * spacers CC ! * v * spacers再取lines[0..-2].reverse拼接出完整菱形的上下两半ruby/diamond.rb铺排算法左右缩进与横向重复图案生成的几何关键有两个每行左侧缩进菱形第 N 行的左侧缩进为(R-N)/2个空格其中 R 是输入宽度。行越宽缩进越小行宽为 R 时缩进为 0。横向铺排每个菱形之间需要补足到整数个菱形宽度的间距。BASIC 中通过TAB(R*M(R-N)/2)实现diamond.basPython 与 Java 则通过不断向行缓冲追加空格直到目标长度line_buffer * ((width - n) // 2) for across in range(count): for a in range(n): line_buffer fill if a len(edge_string) else edge_string[a] line_buffer * ((width * (across 1) (width - n) // 2) - len(line_buffer)) print(line_buffer)python/diamond.pyJava 的对应循环为while (lineContent.length() (userNum * column (userNum - body) / 2))追加空格java/Diamond.javaKotlin 完全沿用该逻辑kotlin/diamond.kt。纵向重复Q 层菱形带的拼接BASIC 的总体结构是外层循环FOR L1 TO QQ 60/R 取整每层先自上而下画一个菱形行宽 1→R步长 2再自下而上画一个菱形行宽 R-2→1步长 -2。于是页面上纵向也按菱形宽度密集拼接形成砖墙式的菱形带diamond.bas。C# 移植版将这种“单个菱形的所有行”预计算为diamondLines再按行列嵌套铺排patternRow × patternColumncsharp/Pattern.csRuby 则以lines lines[0..-2].reverse一次生成完整菱形再通过l * repeat横向重复整行ruby/diamond.rb。两种做法分别体现了“BASIC 逐字符逐行模拟”与“结构化语言按几何单元合成”的两种移植思路。输入校验的演进从裸奔到防御原始 BASIC 不做任何输入校验直接INPUT后使用输入非法值如偶数、越界会得到不对称的图案或运行错误。不同移植版对此采取了不同策略Java 版刻意“不加任何校验”忠实还原 1970 年代原版体验java/Diamond.javaKotlin 版在文件头注明“Input is validated”通过isValid检查输入落在 5~21 且为奇数非法输入直接打印Invalid input退出kotlin/diamond.ktRust 版封装了通用输入工具get_number_from_input支持[min, max]区间校验、[min, ∞)下界校验、(∞, max]上界校验三种模式并对偶数输入循环要求重输rust/src/lib.rs、rust/src/lib.rsRuby 版通过正则/^\d$/拒绝非数字输入并提示!NUMBER EXPECTED - RETRY INPUT LINEruby/diamond.rb各移植版运行方式一览语言入口文件运行方式BASIC原版diamond.basVintage BASIC 解释器执行C#csharp/Program.csdotnet runcsharp/Diamond.csprojJavajava/Diamond.javajava Diamond.javaJavaScriptjavascript/diamond.js浏览器打开 diamond.html图案输出到页面output元素Kotlinkotlin/diamond.ktkotlinc diamond.kt -include-runtime -d diamond.jar java -jar diamond.jarPythonpython/diamond.pypython diamond.pyRubyruby/diamond.rbruby diamond.rbRustrust/src/main.rscargo runrust/Cargo.tomlPerlperl/diamond.plperl diamond.pl各语言目录内均有对应语言的 README注明源文件从 Vintage Basic 下载及转换说明C# 版还额外将提示文案抽离到 csharp/Resources 资源文件Introduction.txt、Rules.txt、TypeNumber.txt便于本地化与界面文案维护。自定义图案内容README 明确指出“You can change the content of the pattern if you wish”即菱形内部的字符是可替换的。在原 BASIC 中只需修改第 6 行的A$CC字符串内容——例如改为A$*#或A$AB程序会自动截取前 2 个字符作为菱形两侧边缘其余部分继续用!填充。C# 移植版则将这一逻辑参数化在 csharp/Pattern.cs 的GetLine函数中new string(C, ...)的字符 C 与new string(!, ...)的字符 ! 都是可独立调整的常量Rust 版在 rust/src/lib.rs 中把paddingC、filling!、border#分别定义为可配置变量。若想自定义图案修改这些常量即可无需改动几何铺排逻辑。小结Diamond 是一个体积极小但算法密度很高的经典程序60 列页宽、奇数菱形宽度、(R-N)/2缩进与TAB(R*M(R-N)/2)横排三个关键公式共同决定了最终图案。阅读本仓库的多种移植实现可以直观对比“忠实还原 BASIC 逐字符输出”与“面向几何单元的结构化实现”两种移植哲学——前者如 java/Diamond.java 刻意不加校验后者如 rust/src/lib.rs 引入输入校验与字符常量配置。理解这些差异对后续阅读本仓库其他 96 个经典 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 之 Diamond 菱形图案程序从 1978 年 BASIC 到现代语言的移植解析Basic Computer Games 之 Diamond 菱形图案程序从 1978 年 BASIC 到现代语言的移植解析 本指南以经典书籍《Basic C示例工程Basic Computer Games 之 BowlingMiniScript 移植版完整指南Basic Computer Games 之 BowlingMiniScript 移植版完整指南 导读 本文以 00_Alternate_Languages/示例工程Basic Computer Games 之 Diamond 的 Kotlin 移植编译运行与输入验证实现解析Basic Computer Games 之 Diamond 的 Kotlin 移植编译运行与输入验证实现解析 本文以仓库 32_Diamond/kotlin示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表