---
# System prepended metadata

title: 程式設計專案 書面報告

---

 

# <p class="text-center">  程式設計專案  書面報告 </p>


:::info

<p class="text-center"> 此書面報告由戴永宸增修、校訂、排版、遷移至HackMD
 </p>
 
:::

## <p class="text-center">  組別資訊 </p>


 組內成員與分工組內成員與分工 

    
| 系級與姓名 | 學號   | 組別組別 | 
| :--------: | :--------: | :--------: | 
| 資管一戴永宸     | A113610318   | 開發組、事務組|
| 資管一邱堉齊 | A113610353     |開發組 |  
| 資管一洪苡毓     | A113610354     |設計組 | 
| 資設一林秀雅     | A113520367     | 設計組| 
| 資管一葉怡廷     | A113610342     | 設計組 | 
| 資管一張益塏     | A113610338     | 事務組|

## <p class="text-center">  專案資訊 </p>



#### <p class="text-center">  簡短文字介紹 </p>

內容

你和你的隊友將針對一個自選的主題自行設計並實作一個資訊系統（或軟體，或程式，看你喜歡怎麼稱呼它）。你的系統可能含有一或多個程式。

-   你們能設定一個有趣又不失挑戰性的題目
-   你們能分析問題並且制定出好的系統架構和分工
-   你們能編寫正確、有效且容易維護的程式
-   你們能清楚生動地展示你們的想法和成果

各組必須自選主題並且實作一個資訊系統。雖然主題沒有任何限制，但理想上它應該適合被資訊化，並且可以在合理時間內被班上的大家理解。

-   （最佳化）你可以針對一個困難的最佳化問題設計演算法，並且將演算法實作出來；這跟期中專案的型態蠻類似的。
-   （資料分析與處理）若你手上有一家零售店的歷史交易記錄，你能做一個系統讓人們能輕鬆地查詢嗎？還是你能將大量資料有效地視覺化呢？又或者，你能否從這批資料中發現什麼令人意想不到的事實？你發現的事情對這個零售商能帶來什麼行銷或作業管理上的意涵？如果是臺鐵的列車到站時間記錄呢？如果是公共單車的借還記錄呢？
-   （遊戲）你可以寫個網路對戰的五子棋，或是介面精美、操控流暢的射擊遊戲。你可以使用<windows.h>、SFML之類的library來實現更好的介面設計。


## <p class="text-center">  專案簡介</p>

#### <p class="text-center">   作品名稱 </p> 
#### <p class="text-center">   《IM TANKER》 </p> 


遊戲介紹

《IM TANKER》是一款單機雙人對戰的坦克遊戲。

遊戲採五戰三勝制，每回合提供九張地圖給玩家自由選擇，首先獲得三勝者為最終贏家！

每張地圖都有不同的主題，其中有許多可以與玩家互動的物件：舉凡讓玩家生命值無意間減少的岩漿地塊、可推動或摧毀掉落道具的箱子。

因為地圖甚大，為了讓玩家有更好的遊戲體驗，兩玩家有各自的分割畫面。

玩家會面後，這時就是考驗操縱的熟練度了！除了高超的槍法外，還需要能巧妙地躲開對方的攻擊。若覺得實力懸殊的話，也可以藉由箱子掉落的各種道具增強能力。趕快找朋友來試一局吧！


### <p class="text-center">   完整書面報告 </p>
---------------
#### <p class="text-center">   遊戲介紹 </p>

- 起始畫面

  ![image](https://hackmd.io/_uploads/B1UTGsugeg.png =50%x)

  #### <p class="text-center">   </p>

- 遊戲說明


   ![image](https://hackmd.io/_uploads/SJX1QsOxxg.png =50%x)



- 戰鬥畫面
  ![image](https://hackmd.io/_uploads/ByVMEj_llg.png =50%x)

##### 小地圖

方便兩玩家了解目前的位置，小地圖位於螢幕正上方中間。

為了提高遊戲體驗，我們在小地圖上將玩家以較顯目的箭頭取代，使玩家們在作戰時能看清自己與對手的相對位置。

##### 兩玩家分割視角 


遊戲地圖甚大，為了要讓兩玩家能更清楚周遭環境，兩玩家各自的分割視野會隨著玩家的移動動態追蹤。

##### 兩玩家生命值條


位於畫面左上角和右上角，分別為兩玩家的生命值。

為了讓玩家能一目瞭然，在畫面採生命條顯示，沒有實際數字。

##### 玩家狀態燈

玩家狀態包含回血、子彈增強、速度提升。

吃到道具會後，相對應狀態燈會在固定時間內亮起，並在效果結束後熄燈。

##### 玩家狀態燈

遊戲採回合制，首先達到三勝的玩家就是最終勝利者。因此，我們在上方顯示了三顆燈，亮著的燈數代表了玩家的勝場數。


 -  戰鬥暫停畫面
      ![image](https://hackmd.io/_uploads/HyfI4iOlxg.png =50%x)
      
      
##### 繼續按鈕

按下後可繼續暫停的遊戲

##### 倒退按鈕


按下後可以重新開始「當個回合」

##### 退出按鈕

按下後將回到主畫面，遊戲紀錄不會保存

#### 回合勝利畫面

![](https://i.imgur.com/wImOY5D.png =50%x)

##### 勝利者頭像

若回合結束，畫面中央會顯示贏家的放大頭像

##### 繼續按鈕

按下後，進到下一回合的地圖選擇畫面

#### 最終勝利畫面

![](https://i.imgur.com/LmLMiSs.png =50%x)

##### 退出按鈕

按下後回到主畫面


----

 #### <p class="text-center"> Presentation 簡報   </p>

[簡報連結](https://www.canva.com/design/DAE31uLpIHE/mNkswelTPy1-c7_Xoh8CXg/view?utm_content=DAE31uLpIHE&utm_campaign=designshare&utm_medium=link&utm_source=publishsharelink#1)




----

#### <p class="text-center">遊戲物件
   </p>

#### 玩家(坦克)

##### [ ](#text種類 "text種類")

種類

共有玩家一與玩家二，分別為藍色坦克與紅色坦克。

##### [ ](#text樣式 "text樣式")

樣式

玩家一

![image](https://hackmd.io/_uploads/Hk2VsjOgeg.png =90x)

玩家二
![image](https://hackmd.io/_uploads/BkNOiouxxg.png =90x)

> 設計者：葉怡廷、林秀雅

##### 操作方式

-   前進與後退
    -   玩家一：W、S
    -   玩家二：上箭頭、下箭頭
-   車身旋轉
    -   玩家一：A、D
    -   玩家二：左箭頭、右箭頭
-   發射砲彈
    -   玩家一：V
    -   玩家二：空白鍵

##### [ ](#text相關參數 "text相關參數")

相關參數相關參數

-   預設移動速度： .5f
-   預設砲彈傷害：20.f
-   最大血量：100.f   
-   換彈速度：1.f(秒)
-   旋轉角速度：3.f
-   補血道具每幀回復量：32.f

投射物(砲彈)

樣式

玩家一
![image](https://hackmd.io/_uploads/Hk4Opsuege.png =30%x)

玩家二
![螢幕擷取畫面 2025-05-07 175110](https://hackmd.io/_uploads/HJCCToulxl.png =30%x)

> 設計者：林秀雅、洪苡毓

##### 生成方式

當玩家按下攻擊鍵，一枚相對應砲彈會產生在玩家砲管前，且面相玩家切線方，並等速飛行。

##### [ ](#text相關參數41 "text相關參數41")

相關參數

-   預設飛行速度：.8f

#### 磚地

##### 

種類

-   玩家一重生點
-   玩家二重生點
-   石頭地板
-   草地
-   木板(未出現在任一張地圖)

##### [ ](#text樣式44 "text樣式44")

樣式

- 玩家重生點  
 
   ![image](https://hackmd.io/_uploads/HyR9U2dgee.png =20%x)



- 石頭地板  
(由於此地磚有隨機生成材質之設計，共有9種，在此只展示其中一種)

  ![image](https://hackmd.io/_uploads/BkxbPhOgxg.png)

- 草地  
(由於此地磚有隨機生成材質之設計，共有62種，在此只展示其中一種)


  ![image](https://hackmd.io/_uploads/SkwzPhulll.png)

#### 

箱子

##### [ ](#text樣式46 "text樣式46")

樣式

![](https://i.imgur.com/dSwZHuw.png)

##### [ ](#text互動方式 "text互動方式")

互動方式

-   玩家可推擠、碰撞
-   玩家可射擊箱子並擊毀
-   玩家可推擠箱子至岩漿中並摧毀之
-   玩家可拾取箱子破壞後掉落的隨機道具



##### 道具掉落

箱子被破壞後會隨機產生至多三樣最少零樣的隨機種類道具，此設計利用了`Generator`類別，下部分系統設計會提到

##### [ ](#text相關參數49 "text相關參數49")

相關參數

-   箱子血量：40
-   最大掉落物數量：3

#### 岩漿

##### [ ](#text樣式51 "text樣式51")

樣式

![](https://i.imgur.com/P1SCrHj.png =20%x)

##### [ ](#text互動模式 "text互動模式")

互動模式

玩家若觸碰到此方塊會立即損血

##### [ ](#text相關參數53 "text相關參數53")

相關參數相關參數

-   傷害：15
-   傷害間隔：3(秒)

#### [ ](#text牆壁 "text牆壁")

牆壁

##### [ ](#text樣式55 "text樣式55")

樣式

此遊戲物件也有隨機材質生成，共兩種

![](https://i.imgur.com/a5lSUFf.png)

![](https://i.imgur.com/lrKUHRv.png)

#### [ ](#text道具 "text道具")

道具

##### [ ](#text種類57 "text種類57")

#### 

##### [ ](#text種類57 "text種類57")

種類

-   回血藥水
-   加速道具
-   子彈增強

##### [ ](#text樣式58 "text樣式58")

樣式

回血藥水  
 

![](https://i.imgur.com/cyn32I6.png =10%x)

加速道具  
 

![](https://i.imgur.com/6TkVGqU.png =10%x)

子彈增強  
 

![](https://i.imgur.com/M37D81w.png =10%x)

##### [ ](#text互動模式59 "text互動模式59")

互動模式

玩家觸碰到道具會自動拾取，拾取後：

-   回血藥水
    -   在5秒內回復定量血量
-   加速道具
    -   在7秒內加速
-   子彈增強
    -   在7秒內砲彈變得更大、傷害更高

##### [ ](#text相關參數60 "text相關參數60")

相關參數
-   子彈增強倍率：.8f
-   速度提升倍率：.1f
------
### 介面元素

#### [ ](#text封面戰車 "text封面戰車")

封面戰車
##### [ ](#text種類63 "text種類63")

種類

封面坦克分為兩部分，如此可透過程式操控造成坦克砲管上下擺動效果

-   藍色戰車車身
-   紅色戰車車身
-   藍色戰車砲管
-   紅色戰車砲管

樣式

![image](https://hackmd.io/_uploads/Hy6Typuege.png =50%x)
![image](https://hackmd.io/_uploads/rJIAyTuxxl.png =50%x)
![image](https://hackmd.io/_uploads/SJyJeTdglx.png =50%x)
![image](https://hackmd.io/_uploads/BJjJxaugee.png =50%x)

> 設計者：林秀雅、洪苡毓

#### 

按鈕

##### [ ](#text動畫 "text動畫")

動畫

按鈕在被使用者點擊後會有按壓動畫
![image](https://hackmd.io/_uploads/rkX5eT_glx.png =30%x)
![image](https://hackmd.io/_uploads/ryL2l6_elx.png  =30%x)

> 設計者：[VOiD1 Gaming](https://itch.io/profile/void1gaming)

##### [ ](#textUX設計 "textUX設計")

  設計UX設計

遊戲中的按鈕有貼心設計：  
若玩家在點後立刻後悔，將鼠標移至按鈕外再方開，則不會觸發事件；唯有在按鈕上點擊並放開才會觸發事件。

#### [ ](#text玩家血條 "text玩家血條")

玩家血條

##### [ ](#text樣式69 "text樣式69")

樣式

![image](https://hackmd.io/_uploads/H1hk-auggg.png =50%x)
![image](https://hackmd.io/_uploads/SkrlWp_lgl.png =50%x)

> 設計者：林秀雅、戴永宸
##### 

動畫

血條會追蹤相對應玩家血量比例，並依比例縮放長度。

#### [ ](#text玩家狀態燈71 "text玩家狀態燈71")

玩家狀態燈

##### [ ](#text樣式72 "text樣式72")

 樣式
![image](https://hackmd.io/_uploads/BJiSbTOxge.png =10%x)
![image](https://hackmd.io/_uploads/Bk-8-puxee.png  =10%x)
![image](https://hackmd.io/_uploads/r1puZadlxx.png  =10%x)
![image](https://hackmd.io/_uploads/SkrYZaOexl.png  =10%x)
![image](https://hackmd.io/_uploads/B15P-T_xel.png  =10%x)
![image](https://hackmd.io/_uploads/Skl_bTuexg.png  =10%x)


##### 動畫

玩家狀態燈會追蹤玩家狀態並以暗、亮表示未激活、被激活。

### 系統設計

#### [ ](#text重點類別Class "text重點類別Class")

 重點類別(Class)

-   `Game`，包裝整個遊戲的最外層類別
-   `SceneManger`，掌管各種與場景相關事宜
-   `MapManager`，讀取文字檔並轉換成二維整數陣列
-   `Map`，讀取二維陣列並產生相對應的地圖與遊戲物件
    -   `Tile`，非互動性地磚
    -   `Box`，可推動、破壞並掉落道具的箱子
    -   `Lava`，可對玩家造成傷害的岩漿方塊
    -   `Wall`，玩家、投射物皆不可穿透的牆壁
-   `Entity`，所有遊戲物件類別的母類別
    -   `Player`，遊戲玩家(坦克)
    -   `Item`，道具(箱子掉落物)
    -   `Projectile`，投射物(砲彈)
-   `Collider`，可加裝於欲有碰撞效果的遊戲類別中
-   `SoundManager`，管理各種音效相關事宜
-   `Generator`，有數個亂數相關函式
-   `UIElement`，非互動性的使用者介面元素
-   `Button`，可互動並有觸發事件能力的按鈕元素

#### [ ](#text其他開發細節 "text其他開發細節")

其他開發細節

##### [ ](#text分檔 "text分檔")


==分檔==

這次專案原始碼非常龐大，因此分成數個檔案(hpp/cpp)並且交互include。在這極為複雜的include關係下，為了避免重新定義類別，使用#ifndef #define #endif等preprocessors。

##### [ ](#text遊戲物件的更新 "text遊戲物件的更新")


==遊戲物件的更新==

因為執行此遊戲的電腦效能不盡相同，為了要讓每個用戶的體驗都可以在一個相同的標準。我們在每一次的遊戲跌代外執行Update這個函數，計算出上一次到此次的時間差(deltaTime)並依此作為更新遊戲物件程度的依據，因此在效能不同的電腦上執行也不會有太大差異。


##### [ ](#text地圖的讀取與渲染 "text地圖的讀取與渲染")


==地圖的讀取與渲染==

初期，設計組在發想地圖的時候，為了更好的視覺化，採用excel的30*30格子，並填滿顏色來表示各種功能的地圖。另外，方便之後資料的轉換，因此除了在每個格子加上顏色，還有編上代號，例如：0-玩家一起始位置、1-玩家二起始位置、2-石頭地板、3-草地、4-岩漿、5-牆壁、6-箱子。

最後，將excel檔案轉成文字檔，再匯入MapManager，將文字檔讀取成二維陣列，後再傳入Map::loadMap生成相對應遊戲物件後渲染。

地圖中的幾種地磚，還有隨間產生材質的設計，例如草地、石頭地板等，因此每次打開同一張地圖都會長得不一樣。


- Excel地圖設計


   ![](https://hackmd.io/_uploads/BJeJMbSBbx.png)

 
   
   -------

### <p class="text-center">   組內分工 </p>

#### [ ](#text開發組 "text開發組")

開發組

系統設計與開發、介面設計。

-   A113610318戴永宸
-   A113610353邱堉齊 
#### 

設計組

遊戲素材蒐集與製作、遊戲模式設計。

-   A113610354 洪苡毓
-   A113520367 林秀雅  
-   A113610342 葉怡廷 

#### [ ](#text事務組 "text事務組")

事務組

書面報告、開會場地安排。
-   A113610338 張益塏 
-   A113610318 戴永宸
