在Minecraft的世界中,每個人可以選擇自己想要擔任的角色,像是當個魔物獵人、旅行家、深海探險者或者是建築師,你也可以自訂規則,既然如此,身為開發者的我,可以選擇的角色之一,就是當個程式設計師在Minecraft中玩弄魔法!如果是你,又會有什麼想法呢?

Minecraft模組或plugins?

跟著女兒玩弄Minecraft一段時間後,逐漸對於重複性的挖掘、使用方塊一個一個來建築感到一絲絲的不耐,比方說為了想增加村民來蓋幾個豆腐房,動作其實都是相同的,這不能自動化嗎?有沒有方法改變一些參數,就蓋出不同的豆腐房?嗯?這需求有點像是先前玩3D建模時的想法?這不就是對於手動建模的不快感嗎?這麼一想就對了,Minecraft中這些動作,正像是在進行3D建模啊!?

既然如此,那就來試試在Minecraft中進行3D建模吧!這麼一來,開發者在Minecraft中,不就是個魔法師了嗎?在調查了如何對Minecraft做程式設計後,正如先前專欄〈找樂子的程式設計〉談到的,設計上主要可以有模組與plugins兩種方式,為了省去探尋模索的時間,我決定尋找相關書籍,以便系統性地瞭解整個開發概貌,而臺灣有《Minecraft模組設計》與《Minecraft新魔法》兩本翻譯書可以參考,前者使用Java來開發模組,後者使用Python來撰寫plugins。

實際上,兩本在Minecraft的版本都有些過時了。前者使用Forge 1.8,因此若想針對目前最新的1.12撰寫模組,會需要用到既有的Java開發經驗,來自行調整書中API的變更;後者使用的是Python 2.7,基於舊版本的Bukkit伺服端與RaspberryJuice,實際上,現在可以使用Python 3.x來開發了,類似地,為了自行更新書中的過時資訊,對Python要有一定程度的認識。

就撰寫程式時的API來說,使用Python來撰寫plugins會比較簡單,而且Minecraft版本變更之後,plugins的程式碼相對來說,比較不需要變更,但在兩本書都看完之後,最後我仍是選擇使用Java來開發模組,一是本身對於Java的熟悉度仍是大於Python,二是Forge相對來說比較活躍(然而它並不是模組開發的唯一選擇),三是考量到Minecraft本身就是用Java開發的,設計時若想要有進一步的彈性,使用Java應該會有其優勢。

Minecraft與程式教育

由於看書一向都有閱讀序言的習慣,兩本書的序言都很有趣,《Minecraft模組設計》其實是爸爸與兒子合寫,一開始是兒子解決模組安裝的問題,問了身為Java開發者的老爸該怎麼解決,後來兩人一同學習如何開發模組,從而開始舉辦研習營,教小朋友如何開發Minecraft模組,這些小朋友都很熟悉Minecraft,有的玩了兩年了,有的甚至每天玩兩個小時以上,一開啟Minecraft的話題就停不下來,從而進入了想要對Minecraft控制更多的世界之中。

我想到了朋友圈裏,幾個在教育界,特別是在大學任教的朋友們都曾提到過,每當問到學生有沒有想寫的程式,大多不知道有什麼題目可以寫的,讓他們找找開放原始碼方面的專案,又多半不知道從何開始,通常就是沒有想法,沒有足夠的基礎而卻步不進,更重要的是,沒有感興趣的題目。

《Minecraft新魔法》的前言中談到,作者是在電腦教室中,從一個學生玩弄的遊戲中首次接觸到Minecraft,這個場景我有幾次經驗,在幾次到學校擔任業師的機會裡,每次課程進行時,總是會有學生埋頭苦練眼前的遊戲,整個課程從開始至結束,可以完全不抬頭看你一眼。

這對許多講師而言,應該是個感覺滿不好的場面,然而作者從學生玩弄的遊戲中看到了可能性,最後在學校建立了Minecraft伺服器,讓學生競賽,指派團隊任務,接著開始有了程式設計,有學生開始建立建造房屋的腳本,更多複雜的自動化開始進行,最後他們在Minecraft裏完成作業,提出作品來獲得評分,讓整個程式設計的學習,似乎變成了很自然的過程。

也許可以在一開始就鼓勵學生來寫個遊戲,不過,要我從無到有寫出一個遊戲,其實也不知道該寫什麼遊戲。然而,談到為什麼我會想在Minecraft中寫點東西,應該是因為我也玩了好一陣子,在玩的過程中有一些想法,而遊戲本身有既有的基礎設施,我可以在上頭疊加這些想法,光是想到在這基礎上實現想法的那一刻,就會覺得非常有趣。不過,這種方式在臺灣的學校裏實行,應該會有很大的困難度,光是課程中,讓學生先玩某個遊戲玩到爽、玩到有想法,大概就會被一堆家長反對吧!

雕琢3D建模程式庫

在玩弄Minecraft的過程中,我產生的想法就是,來打造個3D建模程式庫吧!實際上,若使用Python撰寫plugins,可以直接使用Microcraft API的擴充模組minecraftstuff,裏頭就提供了繪圖API,如果是使用Java開發模組的話,應該也有類似的程式庫才對,不過,我又有了自己打造輪子的想法。

畢竟也有一陣子沒用Java來寫點東西了,想試著用這個題目來抓回一點寫Java的手感,因此,雖然想寫的功能很多,然而功能達標的進度很慢,大多數的時間,我都是在做些調整變數名稱、抽取方法、調整參數個數與位置、抽取共同行為等重構,或者是調整程式碼的上下文、風格等,從可讀性的角度來處理等,很有趣的一個感覺,我在寫著3D建模程式庫,然而,我卻是在雕琢程式碼本身。

程式庫本身的功能,當然也是個挑戰,這想法來自於想試著將先前玩OpenSCAD時學到的東西,過渡到Minecraft的世界之中,這部份真的就像是從無到有打造了──OpenSCAD至少還有circle、cube等基礎模組,然而,在Minecraft的世界一開始就沒這些東西,從先前玩弄遊戲的過程中,想著要畫這些東西時會有哪些重複動作,會是決定該有哪些指令,以及程式碼應如何撰寫的依據。

更重要地,這程式庫提供的指令,已經有個使用對象了,就是我女兒,因此,指令的使用上必須直覺,Minecraft是有fill指令,然而使用絕對座標,遊戲中預設不會有座標軸可以參考,主角也不會正好出生在座標原點,我自己都常搞不清楚要下哪個座標值,因此首要之務,就是使用第一人稱視角座標系統,然後寫個自動轉換為絕對座標的程式,接下來就輕鬆多了,寫程式或實際下指令時,都只需要想著「在我前方幾行幾列多高的地方畫個……」就可以了。

值得高興的一件事是,在撰寫的過程中,並沒有要女兒就馬上來用用看,我寫了個turtle指令,可以類似海龜繪圖一樣,操作的主角走到哪,手上的方塊就放到哪,因此,走過的路徑就都會是指定的方塊了,我戲稱為「凡走過必留下痕跡」指令,女兒看到之後,立即表示她想要有這個功能,然後就在她建立的世界中,開始用走的方式畫起圖來了,這倒讓我想到了英國有個藝術家Simon Beck,擅長在雪地透過行走、印出腳印的方式來創作的事了。

記得先玩再說!

有想法是很重要的一件事,這不單是針對學生,對於已經身處業界的開發者也是,對於努力追求更高境界的開發者來說,失去想法的空虛,會是很可怕的一種感覺,這或許是我前篇專欄提到「陷入泥淖」的感覺,有時不是學不了新東西,而是沒有想法了。

從遊戲中產生想法是其中一種可行而相對自然的方式,當然,不一定要從Minecraft中著手,也可以是其他的遊戲,也可以是實體的東西,無論如何,重要的是先玩一陣子再說,直到你仍舊覺得好玩,但不滿意當中的某個元素之時,這就會是想法的發源之處!

作者簡介


Advertisement

更多 iThome相關內容