物件導向綜合訓練

Chengkai730發表於2024-10-20

練習 1: 文字版格鬥遊戲

最原始的寫法:

Javabean 類:

import java.util.Random;

public class Role {
    private int blood;
    private String name;

    public Role() {
    }

    public Role(int blood, String name) {
        this.blood = blood;
        this.name = name;
    }

    public int getBlood() {
        return blood;
    }

    public void setBlood(int blood) {
        this.blood = blood;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // 攻擊方法
    // 呼叫方法的物件攻擊該方法的形參
    public void attack(Role role) {
        // 計算造成的傷害
        // 傷害是一個隨機數, 範圍是 [1, 20]
        Random r = new Random();
        // 得到造成的傷害
        int hurt = r.nextInt(20) + 1;
        // 獲取被攻擊者原來的血量
        int currentBlood = role.getBlood();
        // 計算被攻擊者現在剩餘的血量
        int remainBlood = currentBlood - hurt;
        // 當前血量低於造成的傷害時, 剩餘血量將變為負數, 顯然不可能, 此時將其賦值為 0
        remainBlood = remainBlood > 0 ? remainBlood : 0;
        // 將剩餘血量賦值給被攻擊的物件
        role.setBlood(remainBlood);
        // 列印攻擊的過程
        System.out.println(this.getName() + "打了" + role.getName() + "一下, 造成了 " + hurt + " 點傷害, " +
                role.getName() + "還剩下 " + role.getBlood() + " 點血量.");
    }
}

測試類:

public class GameTest {
    public static void main(String[] args) {
        // 建立一個角色
        Role role1 = new Role(100, "喬峰");
        // 建立另一個角色
        Role role2 = new Role(100, "鳩摩智");
        // 開始格鬥, 回合制遊戲
        while (true) {
            // role1 先攻擊 role2
            role1.attack(role2);
            // 判斷 role2 剩餘血量, 從而決定迴圈是否繼續
            if (role2.getBlood() == 0) {
                System.out.println(role1.getName() + "K.O. 了" + role2.getName());
                break;
            }

            // 回合制遊戲, 輪到 role2 攻擊 role1 了
            // role2 攻擊 role1
            role2.attack(role1);
            // 判斷 role1 剩餘血量, 從而決定迴圈是否繼續
            if (role1.getBlood() == 0) {
                System.out.println(role2.getName() + "K.O. 了" + role1.getName());
                break;
            }
        }
    }
}

執行結果:

喬峰打了鳩摩智一下, 造成了 17 點傷害, 鳩摩智還剩下 83 點血量.
鳩摩智打了喬峰一下, 造成了 9 點傷害, 喬峰還剩下 91 點血量.
喬峰打了鳩摩智一下, 造成了 6 點傷害, 鳩摩智還剩下 77 點血量.
鳩摩智打了喬峰一下, 造成了 1 點傷害, 喬峰還剩下 90 點血量.
喬峰打了鳩摩智一下, 造成了 11 點傷害, 鳩摩智還剩下 66 點血量.
鳩摩智打了喬峰一下, 造成了 18 點傷害, 喬峰還剩下 72 點血量.
喬峰打了鳩摩智一下, 造成了 4 點傷害, 鳩摩智還剩下 62 點血量.
鳩摩智打了喬峰一下, 造成了 7 點傷害, 喬峰還剩下 65 點血量.
喬峰打了鳩摩智一下, 造成了 12 點傷害, 鳩摩智還剩下 50 點血量.
鳩摩智打了喬峰一下, 造成了 4 點傷害, 喬峰還剩下 61 點血量.
喬峰打了鳩摩智一下, 造成了 19 點傷害, 鳩摩智還剩下 31 點血量.
鳩摩智打了喬峰一下, 造成了 13 點傷害, 喬峰還剩下 48 點血量.
喬峰打了鳩摩智一下, 造成了 7 點傷害, 鳩摩智還剩下 24 點血量.
鳩摩智打了喬峰一下, 造成了 20 點傷害, 喬峰還剩下 28 點血量.
喬峰打了鳩摩智一下, 造成了 19 點傷害, 鳩摩智還剩下 5 點血量.
鳩摩智打了喬峰一下, 造成了 1 點傷害, 喬峰還剩下 27 點血量.
喬峰打了鳩摩智一下, 造成了 8 點傷害, 鳩摩智還剩下 0 點血量.
喬峰K.O. 了鳩摩智

相關文章