學習軌道
/
Java
Java
/
練習
/
巫師與戰士
巫師與戰士

巫師與戰士

學習練習

簡介

繼承

繼承是 OOP(物件導向程式設計)的核心概念。 它代表的是一種 IS-A 關係。 它在程式設計裡的意思,就跟在英文裡一樣,都是從父類別繼承特性(在程式設計裡,這些特性通常就是函式與變數)。

請看下面這個Animal類別:

//Creating an Animal class with bark() as a member function.
public class Animal {

    public void bark() {
        System.out.println("This is an animal");
    }

}

Animal是一個父類別,因為這個類別所擁有的屬性可以延伸給一般的所有動物。

再看一個叫做Lion的動物,它的類別長這樣:

//Lion class is a child class of Animal.
public class Lion extends Animal {

    @Override
    public void bark() {
        System.out.println("Lion here!!");
    }

}
Note

Override註解用來指出子類別中的某個方法正在覆寫父類別的方法。 它不是絕對必要,但使用它是最佳做法。

現在,當我們這樣寫:

Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();

注意:這裡是用Lion來初始化Animal類別。 輸出結果會像這樣:

Lion here!!

根據 OOP,繼承有很多種類型,但 Java 只支援其中幾種(多層繼承與階層繼承)。 想進一步了解的話,請閱讀這篇。

說明

在這個練習中,你會玩一款角色扮演遊戲,不同類型的鬥士可以在裡面互相對戰。 遊戲為每種類型的鬥士訂定了不同的規則。 我們會把焦點放在兩種特定的類型上:巫師與戰士。

對戰士來說,規則如下:

  • 戰士永遠不易受傷。
  • 如果戰士攻擊的鬥士不易受傷,戰士會造成6點傷害。
  • 如果戰士攻擊的鬥士處於易受傷狀態,戰士會造成10點傷害。

對巫師來說,規則如下:

  • 巫師可以事先準備法術。
  • 巫師若沒有事先準備法術,就會處於易受傷狀態。
  • 如果巫師事先準備了法術,會造成12點傷害。
  • 如果巫師沒有事先準備法術,會造成3點傷害。

1. 建立 Warrior 類別

建立一個叫做Warrior的新類別。 這個類別應該繼承現有的Fighter類別。

2. 描述 Warrior

更新Warrior類別,讓它的toString()方法描述他們是哪種類型的鬥士。 這個方法應該回傳字串"Fighter is a Warrior"。

Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"

3. 讓戰士不會受傷

更新Warrior類別,讓它的isVulnerable()方法永遠回傳false。

Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false

4. 計算 Warrior 的傷害點數

更新Warrior類別,讓它的getDamagePoints(Fighter)方法依照上面的規則計算戰士造成的傷害。

Warrior warrior = new Warrior();
Wizard wizard = new Wizard();

warrior.getDamagePoints(wizard);
// => 10

5. 建立 Wizard 類別

再建立一個叫做Wizard的新類別。 這個類別同樣應該繼承現有的Fighter類別。

6. 描述 Wizard

更新Wizard類別,讓它的toString()方法描述他們是哪種類型的鬥士。 這個方法應該回傳字串"Fighter is a Wizard"。

Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"

7. 讓巫師可以準備法術,並在尚未準備法術時處於易受傷狀態

更新Wizard類別,新增一個叫做prepareSpell()的方法。 這個類別應該記住這個方法何時被呼叫,並確保只有在已準備法術時,它的isVulnerable()方法才回傳false。

Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false

8. 計算 Wizard 的傷害點數

更新Wizard類別,讓它的getDamagePoints(Fighter)方法依照上面的規則計算巫師造成的傷害。

Wizard wizard = new Wizard();
Warrior warrior = new Warrior();

wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Java Exercism

準備好開始 巫師與戰士 了嗎?

註冊 Exercism,透過 26 個概念158 個練習 和真人引導來學習並精通 Java,全部免費。