Human Resource Machine游戏介绍
《人力资源机》是Tomorrow Corporation开发的一款为技术宅制作的解谜游戏。在每一层中,玩家的上司会给出一份任务。玩家需要通过给小职员编程来自动化你的任务。如果成功了,玩家会晋升到这幢巨大的办公楼的下一层工作一年。
Human Resource Machine(HRM),是个非常经典的编程类游戏。这个游戏结构非常简单,但是又很有深度,教新手编程语言基础课程时,也可以推荐这款游戏,对于训练编程思维很有帮助。
现在很多教青少年编程入门的时候,都首选Python语言,这当然比较可行,因为Python是一门相对比较好掌握的编程语言,也能实现一些很酷炫的效果,让孩子们很有成就感。并且Python在很多场景下确实是一门生产可用的语言,不单单是教学语言或者一种玩具,这样说来,Python比Scratch或者乐高之类的图形化编程语言更有价值一些。
但是如果一直使用Python来编程,还是会有一些短板的,那就是没法更好的掌握编程的底层知识,无法深刻的理解编程的本质。C语言是一门更接触底层的编程语言,但是C语言不太适合入门的小朋友,缺乏娱乐性,很有可能一开始就会劝退一部分孩子。
这时不妨尝试一下Human Resource Machine,这是一个非常有意思的游戏。看似是一个闯关解谜的小游戏,但是实质可以看作一个极小的计算机系统。首先,它有输入和输出,然后空地可以看作暂存器,起着寄存器的效果,机器人就是一个执行单元,负责指令读取和执行,在输入、输出、寄存器之间传递数据。机器人可以执行的程序类似于计算机的编程语言,有各种类型的指令,包括数据存取(INBOX、OUTBOX)、算术运算(ADD、SUB)、寄存器存取(COPYTO、COPYFROM)、跳转(JUMP、JUMPIFZERO)等等。
HRM的指令系统非常小,小到只有10条左右的指令,看似做不了什么事情,或者做一件很简单的事情也需要很多指令完成,但是仔细琢磨一下,你会发现你其实已经了解到了计算机执行程序的根本。某种意义上,HRM的指令系统于汇编语言甚至机器语言是一个级别的,能更细致的了解计算机的底层逻辑。
比如说,简单的将两个数相加再输出,但是你知道计算机底层都在干什么吗?我们来看一下HRM要完成这个任务的指令序列:
inbox
copyto 0
inbox
add 0
outbox
机器人负责读取指令,然后从inbox获取数据,写道outbox,根据需要还会与寄存器打交道。先看一下指令的说明:
指令 | 操作数 | 说明 |
---|---|---|
inbox | 机器人拿起输入传送带的第一个积木(即成为当前积木)。原有当前积木被舍弃。当输入传送带上没有积木时,游戏结束。 | |
outbox | 将当前积木摆在输出传送带上。(机器人不再拥有当前积木) | |
add | X | 将当前机器人手中积木的数字加上X号空地上的积木。X号空地上的积木保持不变,机器人手中积木的数字替换成加完的结果。 |
sub | X | 将当前积木的数字减去X号空地上的积木。X号空地上的积木保持不变,机器人手中积木的数字替换成减完的结果。 |
copyto | X | 复制当前积木到X号空地。若X空地上有积木则舍弃原有积木。 |
copyfrom | X | 复制X号空地上的积木到当前积木,即把机器人手中积木的数字替换成X号空地上的积木的数字。若存在当前积木则舍弃原有当前积木。 |
jump | X | 改变机器人的机器人程序,将后续执行的指令改为从第X条指令开始执行。(这里的第X条是指机器人程序中的第X条比如假设第一条被执行过10次,它依旧是第一条指令) |
jumpifzero | X | 如果当前积木为0,则改变机器人的机器人程序,将后续执行的指令改为从第X条指令开始执行。如果当前积木不为0,则不做任何操作。 |
指令非常简单,游戏中还有个别指令没在这说明,不过先忽略。我们再回过头看看前面那个例子,两个数相加的过程,细化到每条指令是这样的:
从输入读数
暂存到寄存器0
从输入读数
与寄存器0的数相加
输出
看起来挺繁琐的对不对?但是实际上计算机的运行过程就是这样的!我们再来看一个稍微复杂一些的程序:
INBOX
COPYTO 0
ADD 0
COPYTO 0
ADD 0
COPYTO 0
ADD 0
COPYTO 0
ADD 0
ADD 0
ADD 0
ADD 0
OUTBOX
JUMP 1
这个程序的效果是将一个数乘以40,你可以琢磨一下,程序是怎么实现这个效果的。
有兴趣的建议可以玩一下这个游戏,B站可以找到游戏的攻略视频,在github上还可以找到游戏的完整解决答案,每一关都有若干结果,不同的结果所用到的指令数量和执行时间也有区别,这个从文件名可以看出来。
HRM是一个很高的开端,我们完全可以将其稍微扩展一下,做成一个更有实际效果的编程入门工具。