NTUT-FUCK-PTSD / Fuck-PTSD

This is a repo about rewriting the game `crypt of the necrodancer` in OOP Lab
MIT License
2 stars 2 forks source link

Crypt of the NecroDancer

國立臺北科技大學 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)

程式設計

程式架構

程式技術

在這次實作中學習與研究到了許多技術,讓這個遊戲的開發更加順利,以下是我們一些重要的技術:

事件處理(Event)

由於我們的遊戲中擁有大量的互動事件,例如怪物攻擊玩家、玩家攻擊怪物、玩家移動、節奏移動等事件,這些事件往往需要雙方進行控制。我們採用了一個事件庫來處理這類事件,這樣可以減少程式的相互依賴性,提高可讀性及可維護性。

路徑搜尋(A*演算法)

在怪物搜尋路徑的地方,我們採用 A 演算法完成,因為 A 是在這裡最適合我們的演算法之一,並且有著不錯的效率。

視野計算(布雷森漢姆直線演算法)

在視野的處理上,我們使用了 Bresenham's line algorithm,因為我們的視野是以一個方格去處理,因此使用這個演算法的優勢在於我們不需要使用浮點計算,只需要用到整數加法、減法。

XML 地圖讀取(反序列化)

這個 XML 檔相容於原版遊戲中的地圖,主要操作是將 XML 檔先進行反序列化,接著再進行每個 level 的物件生成。在這過程中,因為 XML 檔會丟失一些細節,我們需要補上,例如地圖邊界、地圖大小,我們需要在讀取時額外加入這些部分。

怪物優先級(Priority)

由於我們這款遊戲是根據節奏為中心,因此我們必須決定怪物在每次節奏的優先級。目前我們的算法是先計算怪物自身的優先度,從血量、攻擊、金幣及隱藏的優先度進行第一次優先度檢查,而當以上均相等時,我們進行第二次優先度判斷,根據距離玩家的距離進行怪物的更新。

我們不是使用 priority queue,因為我們在每個 tempo 都需要進行優先度調整,而使用 priority queue 需要建立新的 priority queue,這樣改動會較大,因此我們選擇對 vector 做 sort。

結語

問題及解決方法

在這次實作中我們遇到了很多問題:

  1. 音樂的問題:我們需要取得音樂的時間來產生對應的節奏,原版的 PTSD 中無法簡單完成這件事,所以我們改用了外部的音樂庫。
  2. 性能問題:在進行怪物、地圖更新時,我們一直關注性能優化,使用了多種計算方式,目前的方式在能接受的性能下是最好的解決方案,特別是在處理視野的部分。
  3. 互動事件處理:在每個節奏中處理不同的事件時常遇到問題,我們採用事件庫來提高處理的效率和準確性。

貢獻比例

學號/姓名 貢獻比例
111590028 張睿恩 50%
111590009 陳世昂 50%

自我檢核表

項目 完成
完成協議書上所描述的最小關卡數量 V
完成專案權限改為 public V
具有 debug mode 的功能 V
解決專案上所有 Memory Leak 的問題 V
報告中沒有任何錯字,以及沒有任何一項遺漏 V
報告至少保持基本的美感,人類可讀 V

收穫

這堂課對我而言最大的收穫在於如何使用 C++ 完成一個遊戲專案,並讓我認識到了與別人共同開發專案會面臨的問題。在這過程中,我們會有一些盲點,透過討論也能增進我們的程式技巧。此外,在開發這次專案的過程中,讓我掌握了很多新的技巧,特別是 Github、CMake 及演算法在實際專案中的應用。

心得、感想

這次遊戲開發讓我認識到了自己的不足之處,例如該如何處理多人專案。在此之前我對這了解甚少,在這次之後我對於這方面的能力有了些許增強。但這次專案有個遺憾之處,就是由於時間有限,有些功能無法完全呈現,但我們已經盡力做到最好,希望這款遊戲能給予玩家好的遊戲體驗。

對於本課程的建議

沒有,謝謝老師。