Kalan's Blog

目前主題 亮色

與程式有關的遊戲三選 (2) | 興趣使然的研究之旅

與程式有關的遊戲三選 (2) – TIS-100 與 Turing Complete

今天繼續介紹幾個與寫程式有關的遊戲。分別是 TIS-100 與 Turing Complete。

TIS-100

image10

這一款遊戲跟上一篇介紹的遊戲 A=B 有著異曲同工之妙。

遊戲內容是你有一台 TIS-100 的電腦,具備了一個很像組合語言的語法以及 12 個節點。每個節點都有一個暫存器,某些節點則可以當作輸入與輸出,有點像是 GPIO 的概念。遊戲給的組合語言是簡化後的語法,沒有複雜的尋址模式或中斷。

在這個遊戲裡也是一樣要解各式各樣的謎題,不過由於是用組合語言來寫,所以難度上來說:

  • 已經有組合語言的基本概念:會比 A=B 簡單,畢竟 A=B 是要你在殘破的語法中解題,但組合語言不用
  • 沒有組合語言的概念:這個遊戲可能會跟 A=B 差不多難。要了解組合語言的概念需要一段時間

image20

遊戲中有關任何語法都涵蓋在一個 pdf 裡面。

遊戲裡面會統計你的程式碼跑了幾次、程式碼的長度、使用的節點數量等等,對於喜歡挑戰最佳解的玩家來說應該是個不錯的消遣。

**這個遊戲沒有教學!**對完全沒有程式基礎的玩家來說門檻很高。然而遊戲規格本身相當簡化,實際上需要記住的指令和規格數量比真正的組合語言少得多。

問題其實也不難,例如「將輸入 A 和輸入 B 相加後送至輸出 A」或「將輸入 A 和輸入 B 相乘後進行輸出」。當然,組合語言並不是難如登天,如果你能學起來並成功破關,或許就已經比一半的軟體工程師還厲害了。畢竟不是所有軟體工程師都會碰到組合語言。

Turing Complete

這是一款從頭打造 CPU 的遊戲。

你的目標是從最基本的邏輯閘開始,從加法器、多工器、暫存器等基本元件,一步步造出 CPU。造出 CPU 之後還沒完,你可以為你的 CPU 寫指令集,最後變成組合語言,再用你創造的組合語言來解謎。

Steam 的預告片裡有一句我很喜歡的話:

If you try to make such projects, unseen by others, as perfect as any human could, you'll develop skills that other professionals don't have

當然,遊戲中的 CPU 是相當簡化的版本,不管是在半導體製程上,還是電路設計上,都不是像遊戲中描述的那樣。最簡單的像是 branch prediction,在遊戲中是沒有實作的。然而,這並不妨礙我們學習 CPU 的運作原理。

有很多軟體工程師,如果不是在相關產業工作,很多時候他們不一定了解 CPU 大致上是怎麼運作的,也不知道怎麼看組合語言,如果願意花時間破完遊戲裡所有關卡,的確會學到很多軟體工程師不知道的事。

遊戲中的 UI 主要以拉線的方式為主,當你完成了一個邏輯閘元件之後,它就會變成可以重複使用的元件,供你在之後的關卡使用。

遊戲進行到後面,元件就會越來越多。關卡後面的電路也會越來越複雜,需要的元件與拉線也會越來越多。

圖靈完備

遊戲當中一個重要的分水嶺是圖靈完備,當你完成 WORKING COMPUTER 之後會發現原來之前辛苦組合的電路都是為了這一刻。這個關卡會要求你達成幾個條件:

  • 根據 byte code 的 bit 判斷要執行哪個操作:ADD、XOR、OR 等等
  • Program Counter:紀錄程式執行到哪個位置
  • 根據某個 bit 判斷是否要執行 jump(跳至指定位址):要實作六種情形(大於、小於、等於、always、never)
  • 5 個暫存器

到這一步,基本上一個簡陋的 CPU 已經完成了,雖然是完全在軟體上執行,但完成的當下還是很有成就感。

解謎

接下來遊戲會要求你寫組合語言,這些組合語言是你可以自己定義的,最後會映射到機器碼。之後的關卡會要求你用組合語言解謎,像是求算模數、走迷宮等等。

感想

程式的本質從來就不是語法本身,而是背後的思考邏輯

很多人可能會問:「既然跟寫程式沒有差太多,為什麼不直接去寫程式就好了?」。我自己的想法是,遊戲可以在保持視覺設計以及簡化的條件下讓人學習到新東西。不需要額外調整設定、跟 IDE 打交道、學習怎麼用 debugger。降低回饋週期的成本對學習是很有幫助的。

如果覺得這篇文章對你有幫助的話,可以考慮到下面的連結請我喝一杯 ☕️ 可以讓我平凡的一天變得閃閃發光 ✨

Buy me a coffee