Newer
Older
Onitaizi / src / Kabu / TheGiantTurnip.java
@motoki miura motoki miura on 17 Oct 2023 3 KB ignore
package Kabu;

public class TheGiantTurnip {
    public static void main(String[] args) {
        System.out.println("「おおきなかぶ」~ロシア民話~");

        Human jisan = new Human("おじいさん", 40);
        Turnip kabu = jisan.plant();
        jisan.grab(kabu);
        jisan.pull();
        Human basan = new Human("おばあさん", 20);
        jisan.call(basan); // お爺さんがお婆さんを呼んでくる(お婆さんはお爺さんを掴む)
        basan.pull(); // お婆さんが引っ張る
        Human mago = new Human("まご", 10);
        basan.call(mago);
        mago.pull();
        Dog inu = new Dog(15);
        mago.call(inu);
        inu.pull();
        Cat neko = new Cat(10);
        inu.call(neko);
        neko.pull();
        Mouse nezumi = new Mouse(5);
        neko.call(nezumi);
        nezumi.pull();
    }
}

abstract class Organism {
    String name = "";
    int power;

    abstract void pull(int receivedPower);

    String getName() {
        return name;
    }
}

class Animal extends Organism {

    Organism grabbingObject;

    Turnip plant() {
        System.out.println(name + "はカブを植えました.");
        return new Turnip();
    }

    void call(Animal dareka) {
        System.out.println(name + "は" + dareka.getName() + "を呼んできました.");
        // dareka.grabbingObject = this;
        dareka.grab(this);
    }
    void grab(Organism _grabbingObject) {
        grabbingObject = _grabbingObject;
    }

    void pull() { /* 末尾の生き物が引っ張るときに呼び出す */
        if (grabbingObject == null) {
            System.out.println("何も掴んでいません");
            return;
        }
        if (grabbingObject instanceof Vegetable) {
            System.out.println(name + "は" + grabbingObject.getName() + "を引っ張りました.");
        } else {
            System.out.println(name + "は" + grabbingObject.getName() + "を引っ張り,");
        }
        grabbingObject.pull(power); // 末尾の生き物が、掴んでいるモノを、powerの力で引っ張る
    }

    void pull(int receivedPower) { /* メソッドのオーバーロード */ // 生き物がpowerで引っ張るとき
        if (grabbingObject == null) {
            System.out.println("何も掴んでいません");
            return;
        }
        if (grabbingObject instanceof Vegetable) { // 引っ張り対象が野菜(カブ)だったら、おわり
            System.out.println(name + "は" + grabbingObject.getName() + "を引っ張りました.");
        } else {
            System.out.println(name + "は" + grabbingObject.getName() + "を引っ張り,");
        }
        grabbingObject.pull(power + receivedPower); // 再帰呼び出し
    }
}

class Human extends Animal {
    Human(String _name, int _power) {
        name = _name;
        power = _power;
    }
}

class Dog extends Animal {
    Dog(int _power) {
        name = "犬";
        power = _power;
    }
}

class Cat extends Animal {
    Cat(int _power) {
        name = "猫";
        power = _power;
    }
}

class Mouse extends Animal {
    Mouse(int _power) {
        name = "ねずみ";
        power = _power;
    }
}

class Vegetable extends Organism {
    boolean harvest = false;

    @Override
    void pull(int receivedPower) { // カブのとき(サブクラスでのオーバーライド)
        System.out.println("うんとこしょ,どっこいしょ");
        if (power <= receivedPower) {
            System.out.println(name + "は抜けました.(条件:" + power + "以上,現在:" + receivedPower + ")");
            harvest = true;
        } else {
            System.out.println("しかし" + name + "は抜けません.(条件:" + power + "以上,現在:" + receivedPower + ")");
            System.out.println();
        }
    }
}

class Turnip extends Vegetable {
    Turnip() {
        name = "カブ";
        power = 100;
        System.out.println("大きな" + name + "ができました.");
    }
}