之前在终端里跑htop、vim、tmux大家都见多了,但你见过在终端里玩跑酷吗?moon-buggy就是这样一款能在纯文本终端里运行的经典跑酷游戏——你驾驶一台月球车,在布满陨石坑的月面上一路狂奔,空格键跳跃躲坑,跑得越远分数越高。最近我在一台KeyarchOS(KOS)系统上把它装起来实测了一遍,整个过程比想象中顺畅,装完就能直接开玩,几乎不用做任何额外配置。
这篇东西不是简单地告诉你“安装之后按一下回车”就完事,而是把我从环境检查、仓库确认、安装原理、玩法参数到踩坑排查的完整过程写出来。不管你是刚接触Linux的小白,还是想给服务器找点轻松时刻的运维老手,应该都能从这里拿到点有用的东西。
1. 项目概述:一个在纯文本终端里跑酷的老家伙
1.1 moon-buggy是什么来头
moon-buggy的历史可以追溯到上世纪90年代。当时图形界面还没普及,终端游戏是极客们为数不多的娱乐方式之一。moon-buggy模仿的是当年街机上的赛车躲避类玩法:你控制的是一辆月球探测车,屏幕从左往右滚动,月面随机出现大小不一的陨石坑,车跑到坑边必须按空格起跳,落点要是没对准下一个坑,就会一头栽进去,游戏结束。它整个画面都是由字符和符号拼出来的,用到了curses这个终端图形库。
别看它画面简陋,moon-buggy的完成度非常高:有连续跳跃带来的节奏感,有速度随距离增加带来的压迫感,有藏在坑后面的小彩蛋——当你在某段距离内表现优秀时,车会弹出小小的动画反馈。后来很多Linux发行版把moon-buggy放进了软件仓库,成为系统里“默认自带的小游戏家族”成员。标题里写的1.0.51-13,就是moon-buggy上游1.0.51版本在发行版打包体系里的具体修订号。
1.2 KeyarchOS的出场定位
KeyarchOS(常被简称为KOS)是面向服务器场景做的一套操作系统。它天然兼容主流Linux生态,软件包管理采用dnf/yum体系,底层遵循RHEL类的仓库结构,所以很多现成软件包可以直接从仓库安装。我这次就是在一台装了KeyarchOS的机器上操作,整个安装流程和我在其它同生态发行版上的经验几乎一致,基本可以无缝迁移。
选择KOS跑moon-buggy还有一个好处:服务器版系统通常比较干净,没有桌面环境里那一堆预装软件干扰,运行终端游戏的依赖关系反而更清晰,装的过程中能很直观地看到包管理器到底解决了哪些依赖,特别适合拿来理解Linux软件包机制。
1.3 为什么非要纠结在终端里跑酷
把游戏“塞”进终端,今日看来更像是极客文化里的行为艺术。但反过来想,终端游戏对运行环境的要求低到令人发指:一个几兆的二进制文件,一个能显示ANSI字符的终端模拟器,就够了。这意味着你可以在远程服务器、在SSH连接里、在没有图形界面的最小化安装环境里,随时开启一局。
对我而言,moon-buggy还有一个更实际的用途:它是检验终端显示能力和curses环境是否健康的“金丝雀”。如果它能正常跑起来,说明终端的字符刷新、颜色控制、按键回显机制基本都是正常的。这个思路在我后来排查其他终端问题时帮了不少忙,一个老游戏反而成了环境诊断工具。
2. 安装前的状态检查和环境确认
2.1 先搞清楚系统身份和架构
装任何软件前,我都习惯先确认三件事:系统版本、架构、仓库状态。系统版本决定软件包兼容性,架构决定下载的rpm包格式,仓库状态决定能不能直接搜到目标包。
我在这台机器上执行:
cat /etc/os-release uname -m/etc/os-release里能看到系统名称和版本号,uname -m输出的x86_64表示64位架构。moon-buggy这种老软件虽然源码可以跨平台编译,但发行版的预编译rpm包通常只做x86_64和aarch64两种,先确认架构能避免后面装错包。
2.2 看看软件仓库里有没有货
接着检查仓库列表:
dnf repolist如果输出空荡荡的,说明系统没配置任何软件源,后面dnf install会直接报“找不到软件包”。如果仓库正常,可以顺手搜一下:
dnf search moon-buggy我第一次搜的时候,输出是这样的:
moon-buggy.x86_64 : A game where you drive a moon buggy看到这几行就说明有戏。这里有个小经验:搜索时如果包名记得不全,可以只搜关键词,比如dnf search buggy,大概率也能找到。搜索不到的时候,先别急着怪系统,看看仓库里是不是缺了EPEL或者PowerTools这类附加源,老游戏塞在这些附加源里的概率非常大。
2.3 终端模拟器的三个前置设置
在图形终端里玩这种基于curses的游戏,有几点最好提前确认。一是TERM环境变量,我一般建议设置为xterm-256color,它能够同时兼顾256色支持和大部分现代终端模拟器的兼容性。二是字体建议选择等宽字体,中文字体或者比例字体会让字符间距错乱,导致月球车“变形”。三是窗口大小要足够宽,最好至少80列,不然画面会被折行。
可以用一条命令查看当前终端支持多少种颜色:
tput colors输出256代表支持256色,输出8表示只支持基础ANSI色。moon-buggy对颜色要求不算高,8色也能玩,但256色下配色过渡更舒服。我后来调整过几个终端模拟器的配色主题,发现在深色背景下moon-buggy的橙色车体和灰色月球表面显示效果最好。
3. 安装实操:从一条命令到理解整个链路
3.1 一条命令完成安装
环境确认没问题之后,安装其实就一步:
sudo dnf install -y moon-buggysudo提权是因为要写入系统目录;dnf是包管理器;install是子命令;-y表示所有询问都自动回答yes,免去手动确认。命令执行时,dnf会先解析依赖,再下载rpm包,最后安装。moon-buggy的依赖很少,核心就是ncurses-libs,这套库在大部分系统上都默认存在,所以安装过程几乎是一瞬间的事。
装完可以用rpm -qi moon-buggy查看包信息:
rpm -qi moon-buggy输出里能看到Version、Release、Install Date这些字段。Version是上游版本号,Release是发行版打包时使用的修订号,标题里的1.0.51-13就是这两个字段的组合。-13意味着这个包在发行版仓库里被反复构建和修复过13次,它通常包含一些适配当前系统的补丁,比裸编译上游源码更稳。
3.2 直接运行看看效果
此时输入:
moon-buggy屏幕上会立刻进入游戏界面。第一次玩的时候,我甚至不需要看说明,直觉就能上手:月球车自动往前跑,按空格起跳,落地不准就会车毁人亡。车跑过一定距离后,速度会越来越快,陨石坑也会越来越宽,玩的就是心跳。
这里有个值得留意的细节:游戏开始前如果有历史最高分,屏幕上会显示排行榜,它默认保存在/var/games/moon-buggy.scores这类系统目录下。如果你是以普通用户身份运行,而当前用户对那个文件没有写权限,游戏并不会报错,只是不会记录分数,具体原因后面细说。
3.3 仓库里找不到包时的备选方案
不是所有机器的仓库都收录了moon-buggy。万一你执行dnf search结果空空如也,至少还有三条路可以走。
第一条,启用附加仓库。在同生态发行版里,EPEL几乎是老游戏的宝库,PowerTools/CRB仓库里也经常藏着被主仓库忽略的软件包。启用之后重新dnf search moon-buggy,就有很大概率找到。
第二条,直接下载rpm包离线安装。找到对应架构的rpm文件之后,可以用:
sudo dnf install ./moon-buggy-1.0.51-13.x86_64.rpm注意命令里写的路径前缀./,它的作用是告诉dnf“我要安装本地文件,而不是从仓库里找”,这个细节经常有人忽略。如果漏掉这个前缀,dnf会把它当成仓库里的包名去搜索,然后报错。
第三条,源码编译。下载moon-buggy源码包,解压后依次执行:
./configure make sudo make install编译前需要确认系统里有gcc和ncurses-devel,用sudo dnf install -y gcc ncurses-devel补上就行。这个方案的优点是不受仓库版本限制,缺点是手动处理依赖,对新手不够友好。我自己的习惯是:能走仓库绝不动手编译,因为发行版维护者已经帮你把常见问题都处理好了。
3.4 版本号差异带来的兼容性思考
如果你在不同发行版之间迁移,会发现moon-buggy的版本号五花八门:有的仓库里是1.0.51,有的还在1.0.50,Release号也各不相同。这不代表游戏本身有多大变化——十几年前这游戏就已经非常完整,后续的修订号更多是在做编译兼容、安全依赖和文档修补。
这种“老软件稳定到不需要频繁更新”的特性,恰恰是它最大的优势。安装完的moon-buggy几乎可以看作一个静态的、不变的二进制,你不用担心哪天系统更新导致它突然不能玩。反观那些被反复重构的新软件,倒是三天两头出新问题。
4. 玩法精讲与参数调试
4.1 按键和操作逻辑这门基本功
moon-buggy的操作简单到了极致,一共就几个键:
- 空格:起跳
- r:重开本局
- q:退出游戏
- p:暂停(某些版本支持)
入门的关键在于跳跃时机。坑的宽度在屏幕上能直观看到,但月球车的跳跃弧线是固定的,所以起跳点有个“安全窗口”。我实测下来的经验是:看到车头接近坑边缘的瞬间再按空格,比早早起跳要稳得多。因为起跳太早,车会飞过头直接落进下一个坑;起跳太晚,车头已经掉进坑口,神仙也救不回来。
游戏速度会随距离逐渐提升,高速下屏幕滚动的节奏感很强,新手一般能撑过第一个100米就算入门了。那些看似“运气好”的连续跳跃,其实都是在心里默数节奏,类似节奏游戏的打法。
4.2 得分机制和难度曲线
moon-buggy的计分逻辑大致和行进距离挂钩:跑得越远,单次得分越多。速度提升后,每秒钟滚过的距离变长,陨石坑出现频率和宽度都会增加。难度曲线做得很平滑,前期给你足够的上手时间,后期几乎不给喘息机会。
这种设计放到今天的游戏里依然不过时。它抓住了“跑酷”这个品类的核心体验:不是考验反应有多快,而是考验你在高压下保持节奏的能力。我第一次跑到几百米时,明显感到注意力越来越集中,那种紧张感在纯文字界面上居然一点不打折扣。好的游戏机制就是有这种魔力,载体再简陋都不影响体验。
4.3 启动参数与自定义难度
moon-buggy提供了一组命令行参数,虽然不复杂,但很实用。我常用的几个是:
moon-buggy -l 3 # 设定关卡难度 moon-buggy -s 1 # 设定初始速度 moon-buggy -w 120 # 设定画面宽度 moon-buggy -h 40 # 设定画面高度-l和-s用来调整上手难度,-w和-h用来配合非标准窗口尺寸。如果你的终端比较窄,或者想在分屏里玩,手动指定宽度和高度能避免画面折行。想看完整参数列表,执行moon-buggy --help即可。
这里有个常见的认知误区:很多人以为把-s调到最高等于“地狱难度”,其实不是。初始速度只是起点,后面随着行进距离一样会加速。与其纠结初始速度,不如把终端窗口开大一点,让视野更开阔,反应时间反而更充裕。
4.4 高分榜与跨用户记录的坑
moon-buggy默认把分数写到/var/games/moon-buggy.scores,这个目录通常只有root能写。普通用户运行游戏时,如果系统里已经存在这个文件,且文件权限允许,那么写入就正常;但如果目录被设置成只读,游戏就会静默地放弃写分数,你玩的每一局都不会留下记录。
我的建议是,如果想让每个用户都能正常记录高分,执行:
sudo touch /var/games/moon-buggy.scores sudo chmod 666 /var/games/moon-buggy.scores666权限意味着所有用户都能读写,对于一份游戏分数文件来说完全够用,也不涉及安全问题。改完之后,再玩就能看到自己的历史记录出现在启动画面里了。
5. 常见问题与排查技巧实录
5.1 字符错乱、花屏和乱码
在终端里跑字符游戏,最烦的就是画面花了。引起花屏的原因通常有三类:终端模拟器解析ANSI转义序列有问题、TERM环境变量和实际终端不匹配、字体比例不对。
排查顺序建议是:先执行echo $TERM,如果不是xterm-256color或xterm,先改成它;再用tput colors确认颜色支持;最后确认终端字体是等宽字体。这三个排查完成后,绝大多数花屏都能解决。如果还不行,退一步用最朴素的TERM=linux试试,虽然颜色少一点,但兼容性反而最好。
5.2 窗口太窄画面被折行
moon-buggy对画面宽度比较敏感,标准的80列终端可以显示,但如果你在分屏或小窗里打开,右侧的月球表面会被截断或折行,导致坑口的位置判断失真。我自己的习惯是把终端拉到至少100列宽,或者用moon-buggy -w 80指定宽度。
想在tmux里分屏玩的话,干脆给这个面板单独开一个窗口,用tmux resize-window -x 120 -y 40先把面板尺寸撑大,再启动游戏。
5.3 跳跃按键不灵敏或“跳歪了”
如果你用SSH远程玩,最明显的问题是按键延迟。moon-buggy这类curses程序依赖终端把按键事件即时传输给进程,网络一来回,体感就很飘。解决办法是:尽量在本地局域网内连接,或者干脆把游戏装在本地终端上跑,延迟完全消失。
另外要注意,某些终端模拟器会把空格键的快速连击识别为“按住空格触发重复”,这和游戏里“每按一次跳一下”的逻辑存在冲突。如果出现按一下就连续跳好几下,检查终端的“按键重复”设置,把它关掉或者调低重复率。
5.4 颜色不对和“看不清车在哪”
有的终端配色主题会把前景色和背景色设置得过于接近,导致月球车的轮廓模糊。moon-buggy的经典配色是橙色车体加灰色月面,在深色背景下非常醒目。如果你的终端是浅色背景,可以临时切换配色主题,或者手动指定终端前景背景色。
更彻底的方案是设置终端的“最低对比度”选项,某些终端模拟器提供这种无障碍设置。我试过一次之后,感觉夜间模式加高对比度是玩这类游戏最舒服的组合。
5.5 高分文件权限不足
前面提过分数写入的问题。其实判断方法也很简单:启动游戏时,如果画面角落出现类似“cannot write scorefile”的提示,或者分数始终不更新,基本就是权限问题。
处理方式参考上面说的chmod 666。如果是企业环境有统一配置管理,也可以把这条命令写进首装脚本里,省得每台机器手动处理。一句话总结:老游戏默认路径下的文件权限,往往比你想的更值得提前检查。
6. 进阶玩法:把moon-buggy玩出花来
6.1 在tmux里一边游戏一边监控
tmux是终端复用神器,用它跑moon-buggy的好处是:游戏意外退出不会导致SSH连接中断,画面也可以随意缩放。我的做法是新建一个会话专门放游戏,另外开一个面板跑top或者htop,一边玩一边看系统负载。你别说,moon-buggy虽然只是个游戏,但它的CPU占用低到可以忽略,几乎就是在“用零成本验证终端性能”。
6.2 通过SSH把游戏搬到远程机器上
moon-buggy很适合装在远程服务器上。理由很简单:它不依赖图形环境,不在乎带宽,只要SSH能连上,就能玩。我实际体验下来,局域网内玩几乎无感,跨地域连接时能察觉到一点点按键延迟,但如果你把难度调低,仍然不影响流畅体验。
这也让它成为了一种很有意思的“网络质量小测试”——延迟高不高,跳一次就知道。如果你的远程服务器正好是KeyarchOS,装一个moon-buggy还能顺手给借服务器的人展示一下“这台机器不只是跑服务的”,也是一种意外的拉近距离方式。
6.3 用别名把常用参数固化下来
如果你习惯用固定的难度和窗口尺寸,可以在~/.bashrc里写:
alias moon='moon-buggy -s 2 -w 100'之后每次输入moon就能用自己习惯的参数直接开局。配合source ~/.bashrc立即生效,不需要重新登录。考虑到moon-buggy的启动画面很短,加个别名后从输入命令到进入游戏基本就是一秒的事。
6.4 老游戏在现代系统里的“轻量彩蛋”
我在实际操作中还发现一个有意思的用法:可以把moon-buggy用作终端相关故障的“快速体检工具”。比如一个新装的KeyarchOS系统,图形终端显示中文乱码、颜色不对、按键不响应,与其对着配置文件头疼,不如先跑一局moon-buggy。如果有画面有颜色有按键反馈,终端链路基本就是健康的,剩下问题基本可以锁定在locale或字体层面。这个思路帮我快速排查过好几次环境问题,算是个冷门但高效的小技巧。
另外,如果你喜欢折腾,还可以把游戏命令写进登录后的欢迎脚本里,或者做成某个维护窗口期的“彩蛋”。不过要注意,生产环境服务器上还是尽量别给人留这种玩游戏的入口,容易带来管理风险,自己本机玩玩就好。
我个人玩了几十局之后最大的体会是:几十年前的老程序,在今天的新系统里还能用一条命令装好、一键开跑,这种感觉本身就很有意思。moon-buggy不是什么大作,但它把“终端能干什么”这件事做成了一个能随时拿出来体验的样本。下次你打开终端不知道干嘛的时候,不妨试试这个老家伙,它可能比你手头正在调的配置文件有意思多了。