RPG Battle Arena
Submit solution
Points:
50
Time limit:
1.0s
Memory limit:
10M
Author:
Problem type
Allowed languages
Java 19
Description
請設計一個 RPG 戰鬥模擬系統。場上有 n 位角色,每位角色都有姓名、生命值與攻擊力。角色分為 Warrior、Mage、Healer、Tank 四種職業。請使用 這學期學到的 繼承、建構子、Assessor、Mutator、方法覆寫與多型 完成程式。
Class Requirements
請設計一個抽象父類別 Character,屬性皆需設為 private:
private String name;
private int hp;
private int attack;
// 建構子:建立角色的初始資料
public Character(String name, int hp, int attack) {...}
// Getter:取得角色名稱
public String getName() {...}
// Setter:修改角色名稱
public void setName(String name) {...}
// Getter:取得目前生命值
public int getHp() {...}
// Setter:修改生命值
public void setHp(int hp) {...}
// Getter:取得攻擊力
public int getAttack() {...}
// Setter:修改攻擊力
public void setAttack(int attack) {...}
// 判斷角色是否存活
// 若 hp > 0 回傳 true,否則回傳 false
public boolean isAlive() {...}
// 抽象方法:計算傷害
// 不同職業有不同攻擊方式,因此由子類別自行覆寫
// Warrior、Mage、Healer、Tank 都需要實作此方法
public abstract int calculateDamage();
// 受到攻擊時扣除生命值
// 若 hp 小於 0,需強制設為 0
public void takeDamage(int damage) {...}
四種職業規則如下:
| Class | Rule |
|---|---|
Warrior |
傷害為 attack |
Mage |
傷害為 attack + 10 |
Healer |
每次攻擊前先回復自己 5 點生命值,但不可超過初始生命值;傷害為 attack / 2 |
Tank |
傷害為 attack;受到攻擊時實際傷害為 damage - 5,若小於 0 則視為 0 |
Input Format
第一行輸入整數 n,代表角色數量。接著輸入 n 行,每行格式如下:
type name hp attack
其中 type 只會是 Warrior、Mage、Healer、Tank 其中一種,name 不包含空白。接著輸入一個 n x n 的二維陣列 battle,若 battle[i][j] = 1,代表第 i 位角色攻擊第 j 位角色;若為 0,代表不攻擊。
Battle Rules
請依照二維陣列由上到下、由左到右的順序進行攻擊,也就是:
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
...
}
}
只要遇到 1,就代表:第 i 位角色 攻擊 第 j 位角色
當 battle[i][j] == 1 時,若攻擊者與被攻擊者皆存活,且 i != j,則進行攻擊。死亡角色不能攻擊,也不能被攻擊。攻擊時必須透過多型呼叫:
int damage = attacker.calculateDamage();
target.takeDamage(damage);
不可在主程式中用大量 if-else 判斷職業來計算傷害。
Output Format
所有攻擊結束後,依照輸入順序輸出每位角色的姓名與剩餘生命值,每位角色一行:
name hp
Constraints
1 <= n <= 20
1 <= hp <= 500
1 <= attack <= 100
Sample Input
4
Warrior Arthur 100 20
Mage Merlin 80 15
Healer Grace 70 10
Tank Lancelot 90 18
0 1 0 0
0 0 1 1
1 0 0 1
0 0 1 0
Sample Output
Arthur 95
Merlin 60
Grace 37
Lancelot 70
Sample Explanation
攻擊順序為 Arthur -> Merlin、Merlin -> Grace、Merlin -> Lancelot、Grace -> Arthur、Grace -> Lancelot、Lancelot -> Grace。其中 Mage 傷害為 attack + 10,Healer 每次攻擊前回血 5,Tank 每次受到攻擊時減少 5 點傷害,因此最後輸出如上。
Comments