
最近在玩一款編程類的游戲,叫做《程序員升職記》,steam 平臺只需¥36。通過組合幾條非?;镜闹噶睿缂訙p、自加、自減、比較、跳轉(zhuǎn),實現(xiàn)一些小功能,例如簡單的數(shù)值絕對值輸出、兩數(shù)乘法、階乘運算、反轉(zhuǎn)字符串等。游戲的本質(zhì)是一款支持 11 條指令,最多支持 24 字節(jié)內(nèi)存的 8 位 cpu 的運行。

這款游戲前面的一些關(guān)卡主要在引導(dǎo)和介紹游戲,同時不斷給出新的指令,開始只有簡單的幾條指令,后面會加入對內(nèi)存的使用,間接尋址的使用,因此可以實現(xiàn)指針的操作。每一關(guān)都會給出隨機的輸入,經(jīng)過你編寫的程序后,算出符合要求的輸出。編寫程序的過程可以通過單步運行來調(diào)試,所以可以很快知道程序在哪里出錯,并修改。

這款游戲可以很好地幫助你理解 CPU 的運行原理,編寫的程序其實就是匯編程序,每一條指令都可以對應(yīng)到一條匯編指令。通過復(fù)制指令到記事本也可以看出。關(guān)卡的輸入每一次都是隨機出現(xiàn)的,這就要求程序要在任何合理的輸入下都可以正確運行,而不是當(dāng)前給定的輸入。這款游戲又不像我之前玩過的另一款手機上的編程類游戲--light robot。這款游戲在指令的條數(shù)上沒有任何限制,也就是說你可以使用不限數(shù)量的指令來實現(xiàn)你的程序,但另一方面游戲非常鼓勵你找到一種最優(yōu)解,使得指令條數(shù)和運算次數(shù)都盡可能的少,這意味著程序所需的代碼空間很少,同時運算速度又最快。所以你可以先按照你對這個題目的解題思路來實現(xiàn)這個程序,等程序完美運行沒有出錯后,再來考慮怎么優(yōu)化程序。light robot 是一款通過組合指令來實現(xiàn)不同的點燈效果的游戲,但是這個游戲是限制指令數(shù)量的,因此你不能先實現(xiàn)再進(jìn)行優(yōu)化,你必須一來就找到最優(yōu)解,這讓我在后面的關(guān)卡無法繼續(xù)。

這款游戲還有一個特點就是支持單步調(diào)試,通過單步運行,可以很快看出運行出錯的地方,結(jié)合指令,可以很快看出錯誤。在簡單的測試沒有出錯之后,又可以全速運行程序,完成題目。因為所有的題目基本上都是需要通過跳轉(zhuǎn)來實現(xiàn)循環(huán)結(jié)構(gòu)的,這樣可以實現(xiàn)不停的輸入。而在你剛開始編寫的程序中,很可能是沒有考慮到所有情況的,可能這組輸入運算正確,而到了下一組就不正確了。因此通過單步,中斷運行,回退指令可以查看運算錯誤的原因,這和平常的開發(fā)也很像。
開頭說了,這款游戲的解題過程其實就是一款簡單 CPU 運行的過程。這款 CPU 最多支持11條指令,可以分為四類。第一類基本輸入輸出 input/output,第二類對內(nèi)存的讀寫 copyfrom/copyto,第三類加減運算,包括加減一個數(shù),和一個數(shù)自加一和自減一,第四類跳轉(zhuǎn)指令,包括無條件跳轉(zhuǎn)、值為零跳轉(zhuǎn)、值為負(fù)跳轉(zhuǎn)。第一類和第四類指令的運行不需要提供參數(shù),指令的運行僅影響 CPU 寄存器或者僅受 CPU 寄存器的影響。而第二類和第三類的指令是需要提供一個參數(shù)的,剛開始這個參數(shù)是一個值,后面的關(guān)卡中加入了間接尋址,可以通過類似指針的操作來實現(xiàn)更多的功能,因此第二類和第三類指令的參數(shù)也支持地址參數(shù)。

根據(jù)關(guān)卡的不同,可以用的內(nèi)存大?。ǖ靥簲?shù)量)是不同的,最多的時候有 24 字節(jié),有時候地毯上是有值的,類似于C語言中帶初值的全局變量。對內(nèi)存的使用主要是讀寫,而且不允許對一個空的內(nèi)存執(zhí)行讀操作,因為此時該值是未知的。內(nèi)存用來暫存一些程序運行時的中間數(shù)據(jù)。很多關(guān)卡都會在內(nèi)存中給一個 0 值,因為 CPU 不支持立即尋址,因此將 0 值通過內(nèi)存的方式給定,0 值經(jīng)常被用于計數(shù),因此你可能需要在程序的開始將其復(fù)制到另一塊內(nèi)存中,以確保下一次的輸入還是可以拷貝一個 0,并從 0 開始計數(shù)。
這款游戲的編程語言是匯編,從程序執(zhí)行結(jié)構(gòu)上來說就只有兩種,一種是順序結(jié)構(gòu),另一種是選擇結(jié)構(gòu),而循環(huán)結(jié)構(gòu)則是需要通過選擇結(jié)構(gòu)和跳轉(zhuǎn)指令來實現(xiàn)的。但由于跳轉(zhuǎn)指令只有三條,帶條件的只有值為零和值為負(fù)兩種,也就是說在做某些題是需要判斷值為正的,則需要進(jìn)行對應(yīng)的轉(zhuǎn)換。在后面的關(guān)卡中,出現(xiàn)的題目比較復(fù)雜,需要采用子程序的設(shè)計來實現(xiàn),類似于函數(shù)的概念。有一關(guān)里面甚至給出了一小段程序。
這款游戲的關(guān)卡不是很多,通關(guān)也不會花費很長的時間,但是程序給出了一個最優(yōu)解的標(biāo)準(zhǔn),對指令數(shù)量和運行次數(shù)的最大值給以限制,想要每一關(guān)都可以實現(xiàn)最優(yōu)解也是需要費一番功夫的。另外游戲本身是有一條故事線的,雖然關(guān)系并不大,但是聊勝于無。