Emacs中的游戏与乐趣
目录
Emacs中的游戏与乐趣
又是周一,你正在为你的老板 Lumbergh 努力倒腾那些 无聊之极的文档 。为什么不玩玩 Emacs 中类似zork的文本冒险游戏来让你的大脑从单调的工作中解脱出来呢?
但说真的,Emacs中既有游戏,也有古怪的玩物。 有些你可能有所耳闻。这些玩意唯一的共同点就是,它们大多是很久以前就添加到Emacs中的:有些东西真的是相当古怪(如您将在下面看到的),而另一些则显然是由无聊的员工或毕业生编写的。 它们中都带着一种奇思妙想和随意性,这在今天的Emacs中很少见。 Emacs现在变得十分严肃,在某种程度上,它已经与20世纪80年代那些玩意被编写出来的时候大不一样。
汉诺塔
汉诺塔是一款古老的数学解密游戏,有些人可能对它很熟悉,因为它的递归和迭代解决方案经常被用与计算机科学教学辅助。
Emacs中有三个命令可以运行汉诺塔: M-x hanoi
默认为3个碟子; M-x hanoi-unix
和 M-x hanoi-unix-64
使用unix时间戳的位数(32bit或64bit)作为默认盘子的个数,并且每秒钟自动移动一次,两者不同之处在于后者假装使用64位时钟(因此有64个碟子)。
Emacs中汉诺塔的实现可以追溯到20世纪80年代中期——确实是久得可怕。它有一些自定义选项(M-x customize-group RET hanoi RET
),如启用彩色光盘等。
当你离开汉诺塔缓冲区或输入一个字符,你会收到一个讽刺的告别信息(见上文)。
5x5
5x5的游戏是一个逻辑解密游戏: 你有一个5x5的网格,中间的十字被填满;你的目标是通过按正确的顺序切换它们的空满状态来填充所有的单元格,从而获得胜利。这并不像听起来那么容易!
输入 M-x 5x5
就可以开始玩了,使用可选的数字参数可以改变网格的大小。
这款游戏的有趣之处在于它能向你建议下一步行动并尝试解决该游戏网格。它用到了了Emacs自己的一款非常酷的符号RPN计算器 M-x calc
(在 Fun with Emacs Calc 这篇文章中,我使用它来解决了一个简单的问题。)
所以我喜欢这个游戏的原因是它提供了一个非常复杂的解决器——真的,你应该通过 M-x find-library RET 5x5
来阅读其源代码——和一个试图通过强力破解游戏的“破解器”。
创建一个更大的游戏网格,例如输入 M-10 M-x 5x5
, 然后运行下面某个 crack
命令。破坏者将尝试通过迭代获得最佳解决方案。它会实时运行该游戏,观看起来非常有趣:
M-x 5x5-crack-mutating-best
- 试图通过修改最佳解决方案来破解5x5。
M-x 5x5-crack-mutating-current
- 试图通过修改当前解决方案来破解5x5。
M-x 5x5-crack-random
- 尝试使用随机方案解破解5x5。
- (no term)
M-x 5x5-crack-xor-mutate
::尝试通过将当前方案和最佳方案进行异或运算来破解5x5。
文本动画
您可以通过运行 M-x animation-birthday-present
并给出名字来显示一个奇特的生日礼物动画。它看起来很酷!
M-x butterfly
命令中也使用了 animate
包,butterfly 命令被添加到Emacs中,以向上面的XKCD漫画致敬。当然,漫画中的Emacs命令在技术上是无效的,但它的幽默足以弥补这一点。
黑箱
我将逐字引用这款游戏的目标:
游戏的目标是通过向黑盒子发射光线来找到四个隐藏的球。有四种可能: 1)射线将通过盒子不受干扰, 2)它将击中一个球并被吸收, 3)它将偏转并退出盒子,或 4)立即偏转,甚至不被允许进入盒子。
所以,这有点像我们小时候玩的Battleship,但是……是专为物理专业高学历的人准备的?
这是另一款添加于20世纪80年代的游戏。我建议你输入 C-h f blackbox
来阅读玩法说明(文档巨大)。
泡泡
M-x bubble
游戏相当简单:你必须用尽可能少移动清除尽可能多的“泡泡”。当你移除气泡时,其他气泡会掉落并粘在一起。
这是一款有趣的游戏,此外如果你使用Emacs的图形用户界面,它还支持图像现实。而且它还支持鼠标。
您可以通过调用 M-x bubbles-set-game-<难度>
来设置难度,其中嗯 <难度>
可以是其中之一: easy
, medium=, =difficult
, hard
, 或 userdefined
.
此外,您可以使用: M-x custom-group bubbles
来更改图形、网格大小和颜色。
由于它即简单又有趣,这是Emacs中我最喜欢的游戏之一。
幸运饼干
我喜欢 fortune
命令。每当我启动一个新shell时,就会有刻薄、无益、常常带有讽刺意味的“建议(以及文学摘要,谜语)”就会点亮我的一天。
令人困惑的是,Emacs中有两个包做了类似的事情: fortune
和 cookie
. 前者主要用于在电子邮件签名中添加幸运饼干消息,而后者只是一个简单的fortune格式阅读器。
不管怎样,使用Emacs的 cookie
包前,你首先需要通过 customize-option RET cookie RET
来自定义变量 cookie-file
告诉它从哪找到fortune文件.
如果你的操作系统是Ubuntu,那么你先安装 fortune
软件包,然后就能在 /usr/share/games/fortune/
目录中找到这些文件了。
之后你就可以调用 M-x cookie
随机显示fortune内容,或者,如果你想的话,也可以调用 M-x cookie-apropos
查找所有匹配的cookie。
Decipher
这个包完美地抓住了Emacs的实用本质: 这个包为你破解简单的替换密码(如密码谜题)提供了一个很有用的界面。 你知道,二十多年前,某人确实迫切需要破解很多基础密码。 正是像这个模块这样的小玩意让我非常高兴地用起Emacs来:这个模块只对少数人有用,但是,如果你突然需要它了,那么它就在那里等着你。
那么如何使用它呢?让我们假设使用“rot13”密码:在26个字符的字母表中,将字符旋转13个位置。
通过 M-x ielm
(Emacs用于 运行Elisp 的REPL环境)可以很容易在Emacs中进行尝试:
*** Welcome to IELM *** Type (describe-mode) for help. ELISP> (rot13 "Hello, World") "Uryyb, Jbeyq" ELISP> (rot13 "Uryyb, Jbeyq") "Hello, World" ELISP>
简单地说,你把明文旋转13个位置,就得到了密文;你再旋转13次,就会回到开始的地方。这就是这个程序包可以帮助您解决的问题。
那么,decipher模块又是如何帮助我们的呢? 让我们创建一个新的缓冲区 test-cipher
并输入您的密码文本(在我的例子中是 Uryyb, Jbeyq
)
您现在面对的是一个相当复杂的接口。现在把光标放在紫行秘文中的任意字符上,猜猜这个字符可能是什么: Emacs将根据你的选择更新其他明文的猜测结果,并告诉你字母表中的字符是如何分配的。
您现在可以下面各种helper命令来帮助推断密码字符可能对应的明文字符:
D
- 显示数字符号(密码中两个字符组合)及其频率的列表
F
- 表示每个密文字母的频率
N
- 显示字符的邻接信息。我不确定这是干啥的。
M
和R
- 保存和恢复一个检查点,允许你对工作进行分支以探索破解密码的不同方法。
总而言之,对于这样一个深奥的任务,这个包是相当令人印象深刻的!如果你经常破解密码,也许这个程序包能帮上忙?
医生
啊,Emacs医生。其基于最初的ELIZA,“医生”试图对你说的话进行心理分析,并试图把问题复述给你。
体验它的那几分钟相当有趣,它也是Emacs中最著名的古怪玩意之一. 你可以使用 M-x doctor
来运行它。
Dunnet
Emacs自己特有的类 Zork 文本冒险游戏。输入 M-x dunnet
就能玩了。
这是一款相当不错的游戏,虽然时间不长,但非常著名,很少有人真正玩到最后。
如果你发现自己能在无聊的文档工作之间空出时间来,那么这是一个超级棒的游戏,内置“老板屏幕”,因为它是纯文本的。
哦,还有,不要吃掉那块CPU卡 :)
五子棋
另一款写于20世纪80年代的游戏。你必须连接5个方块,井字游戏风格。
你可以运行 M-x gomoku
来与Emacs对抗。游戏还支持鼠标,非常方便。您也可以自定义 gomoku
组来调整网格的大小。
生命游戏
Conway的生命游戏是细胞自动机的一个著名例子。 Emacs版本提供了一些启动模式,你可以(通过elisp编程)通过调整 life-patterns
变量来更改这些模式。
你可以用 M-x life
触发生命游戏。事实上,所有的东西,包括代码,注释和所有的东西,总共不到300行,这也让人印象深刻。
乒乓,贪吃蛇和俄罗斯方块
这些经典游戏都是使用Emacs包 gamegrid
实现的,这是一个用于构建网格游戏(如俄罗斯方块和贪吃蛇)的通用框架。 gamegrid包的伟大之处在于它同时兼容图形化和终端Emacs:如果你在GUI中运行Emacs,你会得到精美的图形;如果你没有,你得到简单的ASCII艺术。
你可以通过输入 M-x pong
, M-x snake
, M-x tetris
来运行这些游戏。
特别是俄罗斯方块游戏实现的非常到位,会逐渐增加速度并且能够滑块。 而且既然你已经有了源代码,你完全可以移除那个讨厌的Z形块,没人喜欢它!
Solitaire
可惜,这不是纸牌游戏,而是一个基于peg的游戏,你可以选择一块石头(o
)并“跳过”相邻的石头进入洞中(.
),并在这个过程中去掉你跳过的那些石头,最终只能在棋盘上留下一块石头,
重复该过程直到板子被请空(只保留一个石头)。
如果你卡住了,有一个内置的解题器名为 M-x solitire-solve
.
Zone
我的另一个最爱。这是一个屏幕保护程序——或者更确切地说,是一系列的屏幕保护程序。
输入 M-x zone
,然后看看屏幕上发生了什么!
您可以通过运行 M-x zone-when-idle
(或从elisp调用它)来配置屏幕保护程序的空闲时间,时间以秒为单位。
您也可以通过 M-x zone-leave-me-alone
来关闭它。
如果它在你的同事看着的时候被启动,你的同事肯定会抓狂的。
乘法解谜
这是另一个脑筋急转弯的益智游戏。当您运行 M-x mpuz
时,将看到一个乘法解谜题,你必须将字母替换为对应的数字,并确保数字相加(相乘?)符合结果
如果遇到难题,可以运行 M-x mpuz-show-solution
来解决。
杂项
还有更多好玩的东西,但它们就不如刚才那些那么好玩好用了:
- 你可以通过
M-x morse-region
和M-x unmorse-region
将一个区域翻译成莫尔斯电码。 - Dissociated Press是一个非常简单的命令,它将类似随机游动markov链生成器应用到buffer中的文本中,并以此生成无意义的文本。试一下
M-x dissociated-press
. - Gamegrid包是构建网格游戏的通用框架。到目前为止,只有俄罗斯方块,乒乓和贪吃蛇使用了它。其名为
gamegrid
. gametree
软件包是一个通过电子邮件记录和跟踪国际象棋游戏的复杂方法。M-x spook
命令插入随机单词(通常是在电子邮件中),目的是混淆/超载“NSA trukn trawler”——记住,这个模块可以追溯到20世纪80年代和90年代——那时应该有间谍们在监听各种单词。当然,即使是在十年前,这样做也会显得非常偏执和古怪,不过现在看来已经不那么奇怪了……
结论
我喜欢Emacs附带的游戏和玩具。它们大多来自于,嗯,我们姑且称之为一个不同的时代: 一个允许或甚至鼓励奇思妙想的时代。 有些玩意非常经典(如俄罗斯方块和汉诺塔),有些对经典游戏进行了有趣的变种(如黑盒)——但我很高兴这么多年后他们依然在Emacs中。 我想知道时至今日,这些玩意是否还会纳入Emacs的代码库中;嗯,它们很可能不会——它们将被归入包管理仓库中,而在这个干净而贫瘠的世界中,它们无疑属于包管理仓库。
Emacs要求将对Emacs体验不重要的内容转移到包管理仓库ELPA中。我的意思是,作为一个开发者,这是有道理的,但是……对于每一个被移出并流放到ELPA的包,我们都在蚕食Emacs的精髓。