發表文章

目前顯示的是 2023的文章

Escape from Planet Delta by Russell Wallace 文字冒險遊戲

Escape from Planet Delta是以OASYS系統製作的文字冒險遊戲,OASIS是一個用於製作文字冒險遊戲的物件導向的系統。最早Escape是在1980年代中期在Commodore64上以The Quill製作的,在1991年時移植至OASYS系統。Escape發佈於public domain,可以任意複制和散佈source和可執行檔。 OASYS是Object-Oriented Adventure System的縮寫,它的作者是Russell Wallace,在1992年於comp.binaries.ibm.pc發佈的,並且可以在各大FTP站取得。下載的zip包包含一個說明文件檔、二個範例(其中一個是escape)、反組譯器、編譯器及解譯器的C的source、以及MS-DOS的反組譯器、編譯器及解譯器的可執行檔。原始的zip包裡的source缺少include檔不過不難移植到非MS-DOS的平台。 [ Play ] / [ Github ] 1. 編譯程式碼及執行 OASYS製作的遊戲是先以OASYS程式語言撰寫好程式碼後,再以oac編譯器編譯為物件碼,再透過oai解譯器執行。 1.1 OAC 首先你需要使用一個文字編輯器編輯你的遊戲原始碼,一般附屬檔名為s,例如test.s。接著使用oac編譯器把你的遊戲原始碼編譯為物件碼。 請執行以下命令編譯原始碼 oac test.s 或者省略附屬檔名 oac test 編譯成功的話會輸出同檔名的物件檔,不包含附屬檔名。如編譯test.s成功後,產生名為test的物件檔。 編譯過程如果有任何錯誤,則會輸出錯誤訊息。請再根據錯誤訊息,修正程式錯誤,並再重複以上的編譯命令及修正錯誤的流程,直到成功編譯出物件檔。 1.2 OAI 編譯成功的物件檔,可透過oai解譯器執行。 請執行以下命令執行物件檔 oai test 載入並成功啟動遊戲的話,可以看的遊戲輸出的訊息,以及接受文字命令的輸入提示符號。透過文字命令進行遊戲,quit離開。 2. OASYS程式語言 Language 底下介紹基本的OASYS程式語言語法規則,更詳細的說明請參數OASYS說明文件。 2.1 大小寫 Case 雖然底下的範例都是以大寫字母作示範,但OASYS程式語言不區分大小寫英文字母。 2.2 空白字元 Spaces 空白字元包含space、

無限隨機地圖生成 Wang Tiles

圖片
Wang Tiles ---------------- 在研究關於可用於地圖生成的 波函數坍縮 演算法(Wave Function Collapse,底下簡寫WFC)的時候,又看到關於 王式磚 的資料(Wang Tiles,底下簡寫WT)。跟WFC比起來,WT比較容易理解和實作,所以我就先根據WT的原理實作了一個無限隨機地圖生成的測試。 關於WT,這個 網站 有詳細的介紹,同時也有許多tilesets可以用來作為測試資源。WT是數學家發明的遊戲,主要概念是邊緣匹配的tile連通拚接。每一個矩形tile有4個邊和4個角,所以有2種拼法,一種是邊匹配的拼法,一種是角匹配的拼法。 邊匹配 2Edge --------------------- 以邊匹配的拼法為例,每一個矩形tile的4個邊裡面,每個邊如果用0或1表示不同顏色,則總共有2x2x2x2共16種不同的tile。如下圖,生成tilemap時,如果一個tileA的上方的tileB的下邊是1,則tileA的上邊必須也是1,才能連通。同理,右方的tileC的左邊是1的話tileA的右邊也要是1,等等。整個tilemap的每一個tile都符合這個規則,就是一個符合WT的tilemap。 生成隨機tilemap的方式不只一種,一個簡單的方法是從左到右從上到下,一個一個tile生成。每一個新tile生成時,針對它的上方及左方2個己生成的tile的邊建立連通狀態(上方tile的下邊是1則新tile的上邊也需為1,左方tile的右邊為1則新tile的左邊也需為1),而新tile的右方及下方的邊則隨機選擇0或1。 如下圖,針對tileX的4個邊依序上右下左以2進制編碼為1,2,4,8,這樣在生成tilemap時可以使用bit運算操作方便判斷。 這樣16種tile的編號也同時是它的編碼。如tile0表示4個邊都是0,tile8表示左邊是1其餘3邊是0,tile13表示上左下邊是1右邊是0,等等。底下是生成邊匹配的tilemap的虛擬碼。 void gen2EdgeWangTilesmap(cx, cy) {   foreach tile i of tilemap {     tile = 0;     if (tilemap[upper] & 4) {           // Match upper edge.