人力資源機器
| 人力資源機器 | |||||||
| 原名 | 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。