RPG Battle Arena


Submit solution

Points: 50
Time limit: 1.0s
Memory limit: 10M

Author:
Problem type
Allowed languages
Java 19

Description

請設計一個 RPG 戰鬥模擬系統。場上有 n 位角色,每位角色都有姓名、生命值與攻擊力。角色分為 WarriorMageHealerTank 四種職業。請使用 這學期學到的 繼承、建構子、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 只會是 WarriorMageHealerTank 其中一種,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 -> MerlinMerlin -> GraceMerlin -> LancelotGrace -> ArthurGrace -> LancelotLancelot -> Grace。其中 Mage 傷害為 attack + 10Healer 每次攻擊前回血 5Tank 每次受到攻擊時減少 5 點傷害,因此最後輸出如上。


Comments

There are no comments at the moment.