人力资源机器 | |||||||
![]() | |||||||
原名 | Human Resource Machine | ||||||
常用译名 | 人力资源机、程序员升职记 | ||||||
类型 | 解谜、编程 | ||||||
平台 | Microsoft Windows | ||||||
分级 |
| ||||||
开发 | Tomorrow Corporation | ||||||
发行 | Tomorrow Corporation Experimental Gameplay Group (iOS) | ||||||
设计师 | Kyle Gabler Kyle Gray | ||||||
程序 | Allan Blomquist | ||||||
美工 | Kyle Gabler Kyle Gray | ||||||
音乐 | Kyle Gabler 没错整个团队只有3个人 | ||||||
模式 | 单人 | ||||||
发行时间 | Microsoft Windows, MacOS:2015年10月15日 Wii U:2015年10月29日 | ||||||
相关作品 | 续作:70亿人 |
人力资源机器(Steam译名为“程序员升职记”,英语:Human Resource Machine)是一款可视化编程游戏,由Tomorrow Corporation开发并发行。游戏于2015年在Windows和MacOS平台首发,之后被移植至Android、Nintendo Switch等平台。
简介
游戏包含了近40个关卡,每个关卡都有一个“年份”。游戏发生在一间办公室里,坐在屏幕右上角的上司会指派任务,通常是从输入(英语:inbox)中取出带有数字或字母的方块并进行处理后,放到输出(英语:outbox)处。玩家需要使用游戏提供的指令编程以移动小人(相当于一台电脑中唯一的一个寄存器)完成任务。
随着游戏推进,玩家会逐步解锁更为高级的指令;而一些关卡中,玩家实际上用较为低级的指令实现了高级指令(例如用加法和循环实现乘法和除法[1])。玩家不需要关注垃圾回收——小人不需要手上的方块时可以直接丢掉销毁[2]。
办公室的地毯上设有可以存储方块的格子,印有编号。玩家可以将其作为存储器使用,相当于电脑的内存,而编号即为内存地址,从0开始。
游戏整体的编程风格接近于汇编语言,含有逻辑判断、循环等结构,但只能使用“jump(跳转)”指令(相当于C语言和C++编程中的goto),令一些习惯了高级语言的程序员玩家十分不爽。[3]
关卡
虽然每个关卡都有按顺序编号的“年份”,但玩家不一定要按照年份顺序游戏。部分关卡属于支线关卡,不影响玩家主线推进。而有些“关卡”实际是过场动画,在选关界面(“电梯”)中的图标是一杯咖啡并被称为“咖啡时间”[4]@Java,但仍然计入年份,玩家也不能直接跳过(动画开始后可以跳过动画)。
每个关卡还会有两个附加挑战,分别要求玩家使用尽可能少的指令数量以及尽可能提高程序运行的速度[5][6],两个附加挑战可以使用不同的程序达成。为方便玩家游戏,每个关卡都有三个独立的档案,玩家可以将程序保存在不同档案中以实现修改备份、达到不同目标等。此外,移动端游戏可以切换横/竖屏布局。
剧情
虽然游戏的主体是编程,但游戏实际是有剧情的。主要的剧情出现在“咖啡时间”中,内容是主角所在的城市遭遇了智械危机,这也为续作的剧情埋下了伏笔。
同时如果仔细观察,会发现随着游戏进度的推进,主角头上的毛发会越来越少程序员容易秃顶。
数据类型
游戏里的数据类型包括数字和字母两种,数字印在绿色的盒子上,范围是±999范围内的整数;字母则是大写的A~Z,印在紫色的盒子上。
整数运算如果超过范围会导致溢出报错[7],字母只能和另一个字母执行减法运算,不能执行加法运算,也不能和数字运算。字母执行减法运算则会将A~Z视为1~26[8]进行运算。
指令
游戏的指令系统原型相当于Intel x86架构,这些指令和8086的指令集都有对应,因此可算作一种类汇编语言例如把if和jump绑定一块不能分割同时由于只有一个寄存器,因此运算指令就只有一个操作数。
游戏提供了以下几种指令,随着游戏进行会逐渐引入。其中有一些(比如方括号用作间接寻址)是后期引入的。
inbox
:从输入栏取出一个方块。outbox
:从输入栏取出一个方块。copyto x
:把手上的方块复制到地毯上的x号位置,相当于汇编语言的直接寻址。[9]相当于8086里的mov
指令。copyto [x]
:看一下x号位置中的值(必须是一个非负整数,如果是负数或者字母或者空则会报错),将这个值当做地址,把手上的方块复制到地毯上的对应编号位置。相当于间接寻址。copyfrom x
:把地毯上的x号位置的方块复制到手上。相当于8086里的mov
指令。copyfrom [x]
:看一下x号位置中的值(必须是一个非负整数,如果是负数或者字母或者空则会报错),将这个值当做地址,把这个地址对应位置的方块复制到手上。add x
:把手上的方块与地毯上x号位置的值相加,把结果拿在手上。相当于8086里的add
指令。add [x]
:看一下x号位置中的值(必须是一个非负整数,如果是负数或者字母或者空则会报错),将这个值当做地址,把手上的方块与地毯对应地址位置的值相加,把结果拿在手上。sub x
:用手上的方块减去地毯上x号位置的方块,把结果拿在手上。相当于8086里的sub
指令。sub [x]
:看一下x号位置中的值(必须是一个非负整数,如果是负数或者字母或者空则会报错),将这个值当做地址,把手上的方块与地毯对应地址位置的值相减,把结果拿在手上。bump+ x
:地毯的x号位置增加1,增加后的值也会复制到手里[10]。相当于8086里的inc
指令。bump+ [x]
:将x视为地址,地毯的对应地址位置增加1,增加后的值也会复制到手里。bump- x
:地毯的x号位置减少1,减少后的值也会复制到手里[11]。相当于8086里的dec
指令。bump- [x]
:将x视为地址,地毯的对应地址位置减少1,减少后的值也会复制到手里。jump
:跳转(无条件跳转)。相当于8086里的jmp
指令。jump if zero
:如果手上的方块是0,则跳转;反之忽略该条继续向下执行。相当于8086里的jnz
指令。jump if negative
:如果手上的方块是负数,则跳转;反之忽略该条继续向下执行。相当于8086里的js
指令。- 注释:不执行。不能打字,只能手绘笔迹很粗,数位板用户的福音。在8086里,注释需要在分号后面编写。
指令的使用存在下面的限制:
copyfrom
必须作用在地毯上放置有方块的位置,copyto
也必须在手里有物品的情况下使用,否则程序会异常结束[12];add/sub/bump+/bump-/jump if zero/jump if negative
:这些指令必须在小人手里有物品的情况下使用,否则会报错[13]。add/bump+/bump-
的操作数只能是数字方块,不能是字母方块。
同时值得注意的是,游戏中不允许使用立即数(汇编语言中称为立即寻址,指的是直接在寄存器或内存中预置一个数,例如mov ax, 10
表示将十进制10移入寄存器ax),也就是说不允许玩家直接在地毯上预置数字或者字母方块,这使得打表的策略(程序设计竞赛用语,指的是直接预先计算出所有的答案,存储在数组里,然后需要的时候进行查询暴力出奇迹,打表进省一)完全不可行。某些关卡涉及到累加和循环,关卡开始时,地毯的某处会预置一个方块(一般是数字0)。
Brainf**k + Scratch即视
所以这游戏真的不要当作编程入门!这是面向有编程基础的人玩的不是编程入门游戏!
成就
本作的Steam版本存在成就系统,现在此列出。
成就名称 | 中文翻译 | 说明 |
---|---|---|
Career Milestone 1 | 生涯里程碑1 | 到达第1个咖啡时间。 |
Career Milestone 2 | 生涯里程碑2 | 到达第2个咖啡时间。 |
Career Milestone 3 | 生涯里程碑3 | 到达第3个咖啡时间。 |
Career Milestone 4 | 生涯里程碑4 | 到达第4个咖啡时间。 |
Career Milestone 5 | 生涯里程碑5 | 到达第5个咖啡时间。 |
Career Milestone 6 | 生涯里程碑6 | 到达第6个咖啡时间。 |
Glorious Failure: Overflow | 伟大的失败:溢出 | 计算出一个超过±999范围内的整数。 |
Glorious Failure: Out of bound | 伟大的失败:越界 | 使用间接寻址时,这个格子里的编号(作为地址)对应的地毯不存在。在真实的电脑程序中,这会导致程序崩溃,返回代码通常是0xc0000005(3221225477)。 |
Glorious Failure: Solution Not Robust | 伟大的失败:解决方案不具备鲁棒性 | 在软件开发中,鲁棒性指的是程序的健壮性,也即面临各种输入和各种状态都能妥善处理的特性。在这里指的是玩家编写的程序能够处理特定的输入数据,但是不具备普适性。 |
Queen of Inefficency | 低效之王 | 求解某关卡使用的总步数超过该关卡“效率诊断”中规定的步数的4倍。 |
King of Verbosity | 冗长之王 | 求解某关卡时,玩家的代码行数超过该关卡“效率诊断”中规定的代码行数的4倍。 |
Excellent Instruction Follower | 优秀的指令执行者 | 通过所有关卡。 |
Blue Optimizaion Award | 蓝色优化奖励 | 所有蓝色关卡的指令数量和执行步数达到“效率诊断”要求。 |
Green Optimizaion Award | 绿色优化奖励 | 所有绿色关卡的指令数量和执行步数达到“效率诊断”要求。 |
Orange Optimizaion Award | 橙色优化奖励 | 所有橙色关卡的指令数量和执行步数达到“效率诊断”要求。 |
Social Engineer | 社交工程师 | 在每一个关卡中都点击右上角的上司让Ta告诉你更多。 |
游戏原声带
本作的游戏BGM可在网易云音乐中查看:
https://music.163.com/#/album/34751202/?userid=38532616
续作
- 主条目:70亿人
鉴于本作获得的极高评价,开发商于2018年推出了续作《70亿人》。相比于本作,续作中玩家可以使用的指令集有所扩展,指挥的对象则由单个小人变为了多个小人,同时也引入了小人之间的沟通等新元素。
|
|
|
注释
- 跳转 ↑ 实现乘法和除法容易想到的办法是利用循环重复若干次累加或减去除数操作达成乘法和除法的目的,而这也是早期计算机(8086之前的)的乘法和除法的实现方式。对于乘法而言,可以利用加倍(相当于高级语言和真正的汇编语言里的左移运算)操作提升效率。例如,在“八倍放大器”关卡中,可以利用“加倍加倍再加倍”的方法,只用3次add操作实现。
- 跳转 ↑ 这种机制称为垃圾回收(GC,garbage collection),除了C/C++以外的许多高级语言(比如C#和Java)都有这种机制
- 跳转 ↑ 目前各大高级语言基本都已放弃goto指令(通常仅在需要一次性跳出多层循环时使用),保留goto指令的也不推荐使用。在Java中,goto被视为特殊关键字,不允许用来跳转,也不允许用作变量名。
- 跳转 ↑ 在Steam中,每到达一个“咖啡时间”,都会达成一个成就。
- 跳转 ↑ 在真实的程序设计中,减少指令数量能够减少程序源代码占用的空间,后者主要和时间复杂度有关
- 跳转 ↑ 游戏中,如果玩家编写的程序累计执行了5000步,则程序会强制中止,右上角的HR会发飙。
- 跳转 ↑ 在Steam的版本中,有一个成就就是和溢出相关的。
- 跳转 ↑ 事实上按照ASCII编码,在高级语言中,A~Z作为字符使用时会被视为65~90
- 跳转 ↑ 也可以为地毯的每个位置贴一个标签用作注释,也可以将地摊上贴有的注释用作这里的x,下面其他指令与之类似。
- 跳转 ↑ 类似于C++、C#、Java中的前置++运算符。
- 跳转 ↑ 类似于C++、C#、Java中的前置--运算符。
- 跳转 ↑ 地毯上没有放置物品的位置相当于计算机程序运行时,已被分配但尚未初始化的内存。在C++中,读取这样的内存会得到无用的垃圾值,取决于内存中原有的内容;而C#和Java中,不允许将未初始化的变量用作运算。
- 跳转 ↑ 这一点和续作《70亿人》存在区别,在后作中,运算和比大小操作时,没有数字方块的空位置会被视为0。