國立臺北科技大學 2024 資工系物件導向程式設計實習期末報告
第 P03 組
Crypt of the NecroDancer 是一款結合 Rogue-like 和音樂遊戲元素的遊戲。玩家需要在隨機生成的地下城中,跟隨音樂節奏來移動和戰鬥。這款遊戲的獨特之處在於,玩家的所有動作都必須跟隨音樂的節奏,這不僅增加了遊戲的挑戰性,還讓遊戲充滿了音樂的樂趣。
遊戲的原版包含四個主要區域,每個區域都有其獨特的地圖生成機率和 Boss 強度。此外,DLC 版本還添加了一個額外的區域。在本專案中,我們實現了其中一個區域,確保了遊戲的核心玩法得以呈現。
學號/姓名 | 負責項目 |
---|---|
111590028 張睿恩 | 地圖讀取、Tiles 和 Enemy 產生 |
111590009 陳世昂 | 音樂節奏處理、UI 控制 |
在 Crypt of the NecroDancer 中,玩家的主要目標是到達下一關。由於遊戲過程中無法回復生命值,玩家需要在不受傷的情況下盡量前進。在每一關的最後,玩家需要擊敗 miniBoss 才能開啟前往下一關的樓梯。
我們在本次專案中實現了 Zone1 的三個關卡(Zone1_1、Zone1_2、Zone1_3),以及 Zone1 的 Boss 關卡 King Conga。King Conga 是一個非常有特色的 Boss,具備獨特的攻擊模式和挑戰性。
以下是遊戲的一些主要功能鍵說明,包含了常規操作和 Debug 用的按鍵:
按鍵 | 功能 |
---|---|
WASD | 控制角色操作 |
Esc | 退出遊戲 |
R | 重新開始遊戲 |
Debug Mode | |
B | 前往 Boss 關卡 |
I | 無敵模式 |
M | 無節奏模式(太快會導致畫面卡頓,但功能正常) 備註:會暫停全域 Tempo 更新 |
N | 前往下一關卡 |
O | 一拳超人模式(攻擊力 999) |
在這次實作中學習與研究到了許多技術,讓這個遊戲的開發更加順利,以下是我們一些重要的技術:
由於我們的遊戲中擁有大量的互動事件,例如怪物攻擊玩家、玩家攻擊怪物、玩家移動、節奏移動等事件,這些事件往往需要雙方進行控制。我們採用了一個事件庫來處理這類事件,這樣可以減少程式的相互依賴性,提高可讀性及可維護性。
在怪物搜尋路徑的地方,我們採用 A 演算法完成,因為 A 是在這裡最適合我們的演算法之一,並且有著不錯的效率。
在視野的處理上,我們使用了 Bresenham's line algorithm,因為我們的視野是以一個方格去處理,因此使用這個演算法的優勢在於我們不需要使用浮點計算,只需要用到整數加法、減法。
這個 XML 檔相容於原版遊戲中的地圖,主要操作是將 XML 檔先進行反序列化,接著再進行每個 level 的物件生成。在這過程中,因為 XML 檔會丟失一些細節,我們需要補上,例如地圖邊界、地圖大小,我們需要在讀取時額外加入這些部分。
由於我們這款遊戲是根據節奏為中心,因此我們必須決定怪物在每次節奏的優先級。目前我們的算法是先計算怪物自身的優先度,從血量、攻擊、金幣及隱藏的優先度進行第一次優先度檢查,而當以上均相等時,我們進行第二次優先度判斷,根據距離玩家的距離進行怪物的更新。
我們不是使用 priority queue,因為我們在每個 tempo 都需要進行優先度調整,而使用 priority queue 需要建立新的 priority queue,這樣改動會較大,因此我們選擇對 vector 做 sort。
在這次實作中我們遇到了很多問題:
學號/姓名 | 貢獻比例 |
---|---|
111590028 張睿恩 | 50% |
111590009 陳世昂 | 50% |
項目 | 完成 |
---|---|
完成協議書上所描述的最小關卡數量 | V |
完成專案權限改為 public | V |
具有 debug mode 的功能 | V |
解決專案上所有 Memory Leak 的問題 | V |
報告中沒有任何錯字,以及沒有任何一項遺漏 | V |
報告至少保持基本的美感,人類可讀 | V |
這堂課對我而言最大的收穫在於如何使用 C++ 完成一個遊戲專案,並讓我認識到了與別人共同開發專案會面臨的問題。在這過程中,我們會有一些盲點,透過討論也能增進我們的程式技巧。此外,在開發這次專案的過程中,讓我掌握了很多新的技巧,特別是 Github、CMake 及演算法在實際專案中的應用。
這次遊戲開發讓我認識到了自己的不足之處,例如該如何處理多人專案。在此之前我對這了解甚少,在這次之後我對於這方面的能力有了些許增強。但這次專案有個遺憾之處,就是由於時間有限,有些功能無法完全呈現,但我們已經盡力做到最好,希望這款遊戲能給予玩家好的遊戲體驗。
沒有,謝謝老師。