天龍八部之 Java 類別、屬性與方法

假設你是個導演,當你想拍攝一幕「洪七公說了一聲看招後,使出降龍十八掌」的戲,應該如何做到呢?導演應該先設計好洪七公這個角色,再找一個場地與演員來真實地演出這場戲。

設計階段就是類別的設計,真實演出時,就是產生物件並呼叫方法。

設計洪七公類別之前先提醒,為了容易瞭解,我會在這個範例中的類別名稱、屬性與方法名稱使用中文,但是建議日後設計類別時,為避免日後國際化問題,應避免使用中文為類別名稱或方法名稱。

設計構思階段

洪七公也是個人,而人都有姓名與體力,因此先設計「人」類別是為了日後若有其他角色時,可以重覆使用。而「洪七公」類別則繼承了人的特色,筆者為「人」類別設計姓名與體力兩個屬性,又加了一個方法「說」,這個方法可以接收一個字串後印出。

public class 人 {
    String 姓名;
    int 體力 = 100;

    public void 說(String words){
        System.out.println(姓名 + "說:" + words);
    }
}

接下來設計洪七公類別,由於洪七公也應該有「人」的所有屬性與方法,筆者將洪七公繼承了「人」類別,並設定其姓名,由於練武之人體力較佳,因此應改變父類別(人)的體力為200。又因洪七公擁有絕世武功,我新增了一個新的方法叫「降龍十八掌」,類別設計如下:

public class 洪七公 extends 人 {

    public 洪七公() {
        姓名 = "洪七公";
        體力  = 200;
    }

    public void 降龍十八掌(){
        System.out.println(姓名 + "發出陣陣掌風,使出降龍十八掌");
    }
}

演出階段

接下來可以演出先前「洪七公說了一聲看招後,使出降龍十八掌」這幕戲了,筆者新增一個具有main方法,可測試的類別叫Tester,用來演出這場戲。先以一個演員hong,依照劇本所設計的洪七公來演出:

public class Tester {
    public static void main(String[] args) {
        洪七公 hong = new 洪七公();
        hong.說("看招");
        hong.降龍十八掌();
    }
}

執行的結果為:

洪七公說:看招
洪七公發出陣陣掌風,使出降龍十八掌

進階設計

假如筆者的需求是設計有關遊戲的對戰,遊戲中有歐陽峰與洪七公兩個角色,歐陽峰擁有體力180,內力值是400,發出蛤蟆功後自己會降低體力值40與內力值50,而對方會失去體力值80。而洪七公擁有的體力是200,內力值是500,發出降龍十八掌時自己會降低體力值60與內力值80,而對方會失去體力值120。整理如下表:

說明 洪七公 歐陽峰
預設體力值 200 180
預設內力值 500 400
使出大絕招消耗體力值 60 40
使出大絕招消耗內力值 80 50
對方失去體力值 120 80

「歐陽峰使出蛤蟆功攻擊洪七公後,洪七公受傷後也使出降龍十八掌回擊」

由於設計過程比起上一節要來得複雜,先將兩個類別的架構整理後,再進行類別的實際設計:

洪七公類別

public class 洪七公 extends 人 {
    int 內力 = 500;
    public 洪七公() {
        姓名 = "洪七公";
        體力 = 200;
    }

    public void 降龍十八掌(){
        System.out.println(姓名 + "發出陣陣掌風,使出降龍十八掌");
    }

    public void 降龍十八掌(人  p){
        System.out.println(姓名 + "發出陣陣掌風,使出降龍十八掌打向" + p.姓名);
        體力 = 體力 - 60;
        內力 = 內力 - 80;
        p.體力 = p.體力 - 120;
        System.out.println("  對手" + p.姓名 + "體力剩餘:" + p.體力);
    }
}

上述程式碼為類別新設計一個新的屬性(第2行)與新的方法(第12至18行),第12行的方法降龍十八掌(人 p)接收一個人物件,才能在該方法中操作被攻擊人的體力值。第14,15行扣除洪七公自己的體力與內力值,第16行則扣除被攻擊人的體力值,最後第17行印出被攻擊人被扣除後所剩餘的體力值。

歐陽峰類別

public class 歐陽峰 extends 人 {
    int 內力 = 400;
    public 歐陽峰() {
        姓名 = "歐陽峰";
        體力 = 180;
    }

    public void 蛤蟆功(){
        System.out.println(姓名 + "發出呱呱怪聲,使出蛤蟆功");
    }

    public void 蛤蟆功(人  p){
        System.out.println(姓名 + "發出呱呱怪聲,使出蛤蟆功打向" + p.姓名);
        體力 = 體力 - 40;
        內力 = 內力 - 50;
        p.體力 = p.體力 - 80;
        System.out.println("  對手" + p.姓名 + "體力剩餘:" + p.體力);
    }
}

上述程式碼為類別新設計一個新的屬性(第2行)與新的方法(第12至18行,第12行的方法蛤蟆功(人 p)接收一個人物件,才能在該方法中操作被攻擊人的體力值。第14,15行扣除歐陽峰自己的體力與內力值,第16行則扣除被攻擊人的體力值,最後第17行印出被攻擊人被扣除後所剩餘的體力值。

實例操作程式

遊戲場景演出「歐陽峰使出蛤蟆功攻擊洪七公後,洪七公受傷後也使出降龍十八掌回擊」,在此設計一個Tester2類別,於main方法內演練實例,程式碼如下:

public class Tester2 {
    public static void main(String[] args) {
        洪七公 hong = new 洪七公();
        歐陽峰 oyan = new 歐陽峰();
        oyan.蛤蟆功(hong);
        hong.降龍十八掌(oyan);
    }
}

執行結果如下:

歐陽峰發出呱呱怪聲,使出蛤蟆功打向洪七公
  對手洪七公體力剩餘:120
洪七公發出陣陣掌風,使出降龍十八掌打向歐陽峰
  對手歐陽峰體力剩餘:20

Comments

No comments yet. Why don’t you start the discussion?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *