资讯动态

Basic Computer Games 之 Weekday 的 MiniScript 移植:安装运行指南与格里高利历算法源码解析

发布时间:2026/9/24 16:05:41 来源:尧图企业网站定制
示例工程【免费下载链接】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 Games1978中 Weekday 游戏的 MiniScript 移植版为对象讲解如何在命令行 MiniScript 与 Mini Micro 两种环境中安装并运行该程序同时结合移植版源码深入解析其星期推算、年龄计算与时间分配的核心算法并给出与原始 BASIC 及主流语言移植版的对照帮助你掌握这类日期计算类经典程序在现代脚本语言中的移植思路与验证方法。一、程序背景与移植定位Weekday 是 1978 年Basic Computer Games一书中的经典程序由 Tom Kloos 在俄勒冈科学与工业博物馆Oregon Museum of Science and Industry的 GE 分时系统程序改编而来参见 95_Weekday/README.md。它要求用户输入今天的日期和出生日期或其他感兴趣的日期程序随后输出目标日期是星期几用户的实际年龄年、月、日一生中用于睡觉、吃饭、工作/学习/玩耍、休闲的时间分配65 岁退休的年份若恰逢 13 号星期五还会输出 The Thirteenth--Beware! 的警告若输入的恰好是生日当天则输出 HAPPY BIRTHDAY。本仓库将 Weekday 移植到了 MiniScript 这一脚本语言放在 00_Alternate_Languages/95_Weekday/MiniScript/ 目录下。根据 00_Alternate_Languages/README.md 的约定该目录收纳不属于约定的 10 种语言C#、Java、JavaScript、Kotlin、Lua、Perl、Python、Ruby、Rust、VB.NET的移植版本仅用于教学目的。MiniScript 移植版完整保留了原版的控制台外观与行为符合项目忠实还原原始程序观感的移植准则见 README.md。二、两种运行环境与安装步骤MiniScript 移植版weekday.ms支持两种官方运行方式原版 MiniScript/README.md 对此有明确说明。1. 命令行 MiniScriptCommand-Line MiniScript命令行版适合在终端中快速运行无需图形界面前往 miniscript.org 的 Command-Line 页面根据操作系统下载对应的命令行解释器并完成安装在包含weekday.ms的目录下执行miniscript weekday.ms程序会立即打印标题与引导语并等待输入日期。2. Mini Micro 虚拟机Mini Micro 是 MiniScript 官方提供的图形化运行环境操作流程如下从 miniscript.org 的 Mini Micro 页面下载并启动点击顶部的磁盘插槽选择 Mount Folder...挂载文件夹选择包含weekday.ms与本 README 文件的目录即00_Alternate_Languages/95_Weekday/MiniScript/在 Mini Micro 的命令行提示符下依次输入load weekday runload将weekday.ms载入内存run启动执行。两种方式最终运行效果一致程序在控制台输出WEEKDAY标题与Creative Computing Morristown, New Jersey署名并提示输入日期。输入格式说明程序要求以美式顺序、逗号分隔的方式输入日期例如3,24,1979表示 1979 年 3 月 24 日Enter todays date in the form: 3,24,1979? Enter day of birth (or other day of interest)?输入解析由Date.init完成先以逗号切分字符串校验是否恰好包含 3 个部分再依次将月、日、年转为数值见 weekday.msDate.init function(dt) d dt.split(,) if d.len ! 3 then return noob new Date noob.m d[0].val noob.d d[1].val noob.y d[2].val return noob end function三、源码结构用类组织日期运算与原始 BASIC 依赖GOTO与全局变量的做法不同MiniScript 移植版weekday.ms采用现代语言惯例定义了Age与Date两个类类职责关键方法Age表示年/月/日时长并做算术运算init、sub时长相减、multiply按比例折算时长Date表示日期并提供历法计算init、diff、value、dayOfWeek、weekday、_isLeapYear、_leapYears其中Date类还内置了两张查表数据Date.daysPerMonth[0,31,28,31,30,31,30,31,31,30,31,30]记录从 1 月到次月 1 日之间的天数索引 0 占位用于把日期换算为自 1583 年初以来的天数Date.dayNames[Sunday,Monday,...,Saturday]用于把星期索引映射为英文名称。这段设计体现了项目结构化编程、注释充分的移植要求见 README.md 的移植指南把原 BASIC 中 1500 行的线性流程拆解为可复用的对象方法。四、核心算法深度解析1. 历法适用范围1582 年的格里高利历转折原版 BASIC 在 95_Weekday/weekday.bas 中以IF Y-1582 0 THEN 1300拒绝 1582 年以前的日期并打印NOT PREPARED TO GIVE DAY OF WEEK PRIOR TO MDLXXXII.MDLXXXII 即罗马数字 1582。MiniScript 版在 weekday.ms 中做了同样的边界检查if dob.y 1583 then print Not prepared to give day of the week prior to 1583 exit end if代码注释解释了原因1582 年发生了儒略历向格里高利历Gregorian calendar的过渡在此之前无法按现行历法可靠推算星期。MiniScript 版因此把日期基准设定为 1583 年 1 月 1 日Date.value以1583 年 1 月 1 日 1作为累加起点见 weekday.ms。值得注意的移植细节BASIC 版判定边界是 1582 年MiniScript 版则是 1583 年二者相差一年。这是移植过程中可观察到的细微差异读者在对照不同移植版时需留意。2. 星期几的推算自 1583 年起的日数取模Date.value计算指定日期距离 1583 年初的总天数Date.value function years self.y - 1583 days years * 365 self._leapYears Date.daysPerMonth[:self.m].sum self.d return days // returns 1 for 1,1,1583 end function其组成为整年天数每年按 365 天 期间闰年天数 当年已过月份的天数 当月天数。_leapYearsweekday.ms则统计 1580 年以来闰年数量并按照格里高利历规则排除整百世纪年、再补回能被 400 整除的世纪年最后对 3 月前的日期做当年闰日修正Date._leapYears function ly floor((self.y - 1580) / 4) centuries floor((self.y - 1500) / 100) centuries400 floor((self.y - 1200) / 400) ly ly - centuries centuries400 if self._isLeapYear and self.m 3 then ly - 1 return ly end function闰年判定_isLeapYearweekday.ms实现的是标准规则能被 4 整除、不能被 100 整除或能被 400 整除。已知 1583 年 1 月 1 日是星期六因此星期索引为(value 5) % 7weekday.ms再用Date.dayNames查表得到 Saturday 等星期名称。这套基准日 日数取模的思路与 JavaScript 移植版getDayOfWeek()中世纪偏移 年份内偏移 月份偏移表的算法见 95_Weekday/javascript/weekday.js殊途同归但实现方式更贴近原 BASIC 的查表风格。3. 年龄差与时间分配得到目标日期的星期后程序用Date.diff计算今天 - 目标日期的差值先按月、日分别做差若天数不足 30 则向月借位月数不足 12 则向年借位weekday.ms。之后进入时间分配报表仅当目标日期是过去日期时输出。原版 BASIC 在 95_Weekday/weekday.bas 中用GOSUB子程序按固定比例折算人生时间MiniScript 版则把这一逻辑封装进Age.multiplyAge.multiply function(multiplier) ageInDays self.y *365 self.m * 30 self.d floor(self.m / 2) newAge ageInDays * multiplier years floor(newAge/ 365) leftover newAge % 365 months floor(leftover / 30) days floor(leftover % 30) return Age.init(months, days, years) end function人生总天数采用近似公式年×365 月×30 日 ⌊月/2⌋额外补偿每两个月多出的半天再乘以百分比折算回年/月/日。报表依次扣除四类时间见 weekday.ms活动占比输出文案睡觉35%You have slept吃饭17%You have eaten工作/学习/玩耍23%随剩余年数变化见下休闲剩余约 25%You have relaxed第三项文案根据扣除前两项后的剩余年龄动态选择weekday.ms剩余 ≤ 3 年 →You have played剩余 ≤ 9 年 →You have played/studied其余 →You have worked/played报表输出通过lines数组逐行右对齐打印格式为活动名 年/月/日四列与 BASIC 版PRINT的YEARS MONTHS DAYS表头保持视觉一致。4. 特殊输出与收尾生日检测若目标日期与今天的月、日完全相同输出***HAPPY BIRTHDAY***weekday.ms13 号星期五当目标日期为 13 日且星期推算结果为 Friday 时输出The Thirteenth--Beware!weekday.ms对应原 BASIC 的FRIDAY THE THIRTEENTH---BEWARE!分支95_Weekday/weekday.bas未来日期若目标日期晚于今天则使用will be a恰为今天则使用is a否则使用was aweekday.ms退休年份程序最后打印*** You may retire in 出生年65 ***即假定 65 岁退休weekday.ms。五、与原始 BASIC 及其他移植版的对照实现位置特点原始 BASIC95_Weekday/weekday.bas使用GOTO/GOSUB、DATA月份表0,3,3,6,1,4,6,2,5,0,3,5与DEF FNA/FNB辅助函数全部大写输出MiniScript00_Alternate_Languages/95_Weekday/MiniScript/weekday.ms用Age/Date类封装算法输出混合大小写时间分配逻辑集中为Age.multiplyPython95_Weekday/python/weekday.py提供GET_TODAY_FROM_SYSTEM开关可从系统时钟自动获取今天日期calculate_day_of_week直接复刻 BASIC 的世纪偏移公式JavaScript95_Weekday/javascript/weekday.js浏览器版用DateStruct/Duration类与私有字段#year等实现同套算法含isGregorianDate更精确的历法边界判断可以看到MiniScript 版延续了忠实于原程序行为的移植原则同时把晦涩的 BASIC 查表与取模逻辑重写为带注释、可读性强的面向对象代码这正是该项目对非 10 种约定语言移植版的要求保留控制台外观代码仅用于教学目的见 00_Alternate_Languages/README.md。六、快速验证最小运行样例以经典样例3,24,1979为例完整交互流程如下WEEKDAY Creative Computing Morristown, New Jersey WEEKDAY is a computer demonstration that gives facts about a date of interest to you. Enter todays date in the form: 3,24,1979? 3,24,1979 Enter day of birth (or other day of interest)? 2,11,1940 2/11/1940 was a Sunday. ... *** You may retire in 2005 ***如果你想快速对比算法输出可以同时运行同目录下其他移植版如 python/weekday.py输入相同日期进行交叉验证确认各移植版的星期推算与时间分配结果一致。赞分享示例工程【免费下载链接】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 之 Boxing 的 MiniScript 移植版安装运行与源码玩法解析basic computer games 之 Boxing 的 MiniScript 移植版安装运行与源码玩法解析 本篇技术指南聚焦《Basic Comput示例工程Basic Computer Games 之 Bullfight 的 MiniScript 移植版安装与运行指南Basic Computer Games 之 Bullfight 的 MiniScript 移植版安装与运行指南 本指南面向希望以 MiniScript 语言示例工程《Basic Computer Games》Bombs Away 的 MiniScript 移植运行指南与源码解析《Basic Computer Games》Bombs Away 的 MiniScript 移植运行指南与源码解析 本篇技术指南围绕经典 BASIC 游戏《B示例工程上一篇Rescuezilla终极指南系统救援的瑞士军刀完整教程下一篇如何快速找到 Blender 免费插件与素材awesome-blender 资源清单完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价