# 計概 HW12 作業說明文件 [[文章連結]](https://hackmd.io/RrTMRTxgQgS6yUW2Vk-4fg) ## RPG 遊戲概述 這是一款單方向旅程的RPG遊戲,在每個不同的地圖中,尋找通往下個世界的通道。過程中會遇到許多怪物或是寶箱,擊敗怪物、賺取道具,直到世界的盡頭。 ## How to play **此遊戲所有的輸入法都是先在`type: `輸入字元,接著按下enter,即完成該指令輸入。字元對應的指令皆會在最上方提示。** 1. 玩家選擇遊戲創建模式 有三種模式,分別為 `New game` 、`Load game`、`Quit game`。若是在之前沒有save game的情況下選擇了`Load game`的選項,**會提示不要選擇**。黃色光標代表目前選擇,輸入`d`後,表示確定選項。 ![](https://hackmd.io/_uploads/SywTc3xPh.png) 2. 玩家輸入角色數量 輸入玩家希望的腳色數量,建議輸入為1~4的整數,若輸入超出此範圍,自動default設定為3。 ![](https://hackmd.io/_uploads/SJIsonlDh.png) 3. 進入不同世界 下方圖片表示進入世界1,若遊戲持續進行,最多可到世界3。若中途被怪獸打死,則遊戲直接結束。在下方`type: `位置輸入對圖中P的操作指令。a、d、s、w為方向控制,v為查看各角色狀態,e為玩家裝備道具,k為儲存遊戲檔案 ![](https://hackmd.io/_uploads/ryMQ23xw2.png) - 輸入指令 'a、d、s、w' 輸入指令可移動位置,若玩家想要快速移動,可以藉由輸入一連串的方向控制鍵,即可快速移動。 ![](https://hackmd.io/_uploads/rkfDt3WUh.png) - 輸入指令 'v': 如下圖所示,顯示個角色詳細資訊 ![](https://hackmd.io/_uploads/BJCX6nxwn.png) - 輸入指令 'e': 會依照順序為各個角色裝備道具,下突圍第一的角色Orcplayer裝備道具畫面,使用`a`、`d`字元移動紅色光標,使用`s`字元選擇道具,使用`w`字元丟棄道具,當該角色操作結束後,輸入`n`字元完成裝備。開始下一個角色裝備道具。 **特別注意: 不能在戰鬥過程中裝備道具** ![](https://hackmd.io/_uploads/r1zs0aewn.png) - 輸入指令 'k': 顯示儲存畫面,為自動在main檔的資料夾底下生成`record.txt`,裡面內容包括角色數量、當前世界編號、個玩家在detial information顯示的數值和手中的道具,**特別注意: 背包中的道具不會儲存**。 ![](https://hackmd.io/_uploads/H1zyChgP3.png) ![](https://hackmd.io/_uploads/ryFVR3gPh.png) 4. 蒐集寶物 在地圖中觸碰`S`時,自動為各個玩家添加一種藥水,如下圖,可能拿到不同藥水。 ![](https://hackmd.io/_uploads/HyLPTngPn.png) 5. 怪物對戰 在地圖中觸碰`M`時,進入對戰畫面。將出現與角色數量相同的怪獸。如下圖,輸入`a`表示普通攻擊、`s`表示特殊攻擊。攻擊後,會顯示玩家打擊的怪物,綠色為攻擊方、紅色為被攻擊方。將怪物被該角色打倒時,會掉落特定道具,詳見**怪物機率**。 ![](https://hackmd.io/_uploads/SyROyaxDn.png) 怪獸將自動回擊,不同屬性回擊方式不同,下圖可看到Goblin攻擊OrcPlayer。 ![](https://hackmd.io/_uploads/Bkthk6gD3.png) 6. 該世界通關 在該世界中找到紅底白字`D`,即可進入下個世界。代表玩家可以在避免接觸任何怪物的情況下通關。**但必須注意,若角色等級不足,將會導致無法通過後面困難關卡**。 ![](https://hackmd.io/_uploads/SJ0bg0gD3.png) ## Program implementation detial 1. 道具背包 如下方NovicePlayer.h中的程式碼,使用動態的1D array作為背包,每個slot是Item pointer儲存道具。而背包重量上限為100、slot上限為10。**特別注意: 當最後一個存入的道具超過重量上限時,是可以通融的**,但之後的道具將不予儲存。 ``` cpp= public: Item** backpack; int backpack_weight_limit = 100; int backpack_slot_limit = 10; ``` 2. 地圖生成 在Game.cpp中,遇到下個世界的傳送點後,將會執行下方程式,為了節省程式使用記憶體,會在穿梭世界時,刪除舊世界、讀取新世界、創建地圖的方式來實現。 ``` cpp= // next_world if (map->getNextWorld()) { map-> ~Field(); // delete old map // creat new map map_number++; map = new Field(map_file[map_number], 6, 6, 4, 5); // load next map } ``` 3. 儲存遊戲紀錄 依照固定順序: 角色數量、所在世界編號、個玩家詳細數值。當玩家重複儲存時,前一次的儲存數值會被覆蓋。在匯入先前存入的資訊時,會先根據角色數量創造對應角色,接著再使用個角色詳細資訊設定角色。 4. 創造角色 為使玩家快速上手,玩家初始設定僅需輸入角色數量,程式會依序OrcPlayer、KnightPlayer、MagicianPlayer的順序自動生成角色。但怪獸是會依照機率隨機生成,經過測試若不幸在初期遇到2個JWMaster,玩家就等著被打敗結束遊戲。 ## Additional features beyond requirements 1. 掉落機率 - 怪獸機率 各個怪獸遇到的機率、掉落道具是不同的,如下表所示: |怪獸|遇到機率</br>(Battle.cpp fight())|掉落道具</br>(Battle.cpp monsterLeave())| |:--:|:----:|:--:| |Goblin|80%|50% Tunic Armor</br>50% Axe Weapon| |Zombie|10%|50% Life Potion</br>50% Shield Armor| |JWMaster|10%|50% Magic Potion</br>50% Sword Weapon| - 寶箱機率 發現寶物時,分別給予各個角色一個 Life Potion或Magic Potion,機率各為50%。 2. 單方向穿梭世界 為了讓遊戲更加有趣,串聯了地圖庫中的三個地圖,作關卡設計。每個世界中尋找穿梭點,作為破關依據。 3. 光標選擇 看似不奇眼的光標選擇設計,可以降低使用者學習操作的時間,在cmd畫面中實現類似GUI的介面,並且讓助教批改作業時更為流暢。 4. 背包丟棄道具 玩家可能會一直得到重複道具而導致背包爆滿,額外添加丟棄道具的功能,讓玩家對於背包有更好的體驗。 (在equip item的介面中可操作) 5. 手中道具存檔功能 除了儲存各個角色的基本數值之外,還可以儲存手中道具,在復原資料時會自動為角色裝備道具,但先前在背包中的道具不可儲存,必須自行重新收集。 6. 怪獸攻擊特性不同 不同怪獸的攻擊模式皆不同,如下表: |怪獸|攻擊模式| |:--:|:----:| |Goblin|攻擊上一次攻擊自己的玩家| |Zombie|針對特定玩家持續攻擊,直到該玩家死亡| |JWMaster|尋找血量最高者攻擊| ## Third-party lib 沒有任何特殊函式庫,使用`Visual Studio 2017`即可編譯。在編譯時,需把所有資料夾搬到project中,並匯入所有.cpp、.h檔,或是直接點選執行檔main.exe也可以。 ## UML diagram 下方為UML sequential diagram, ![](https://hackmd.io/_uploads/Sy2iPY-P2.png)