オブジェクト指向とかデザインパターンとか開発プロセスとかツールとか

satoshi's ソフトウェア開発

js



当サイトはアフィリエイト広告を利用してます。

Java UML オブジェクト指向

JavaでRPGを作る|フィールドで「やくそう」を拾えるようにしよう

投稿日:


前回は、敵の種類を増やして、スライム以外にゴーストも登場するようにしました。

Slime も Ghost も Chara を継承しているため、戦闘処理ではどちらも Chara として扱うことができました。

これにより、敵の種類を増やしても、戦闘処理の多くをそのまま使えるようになりました。

また、同じ手順で敵の種類を増やせることがわかりました。

今回は、敵ではなくアイテムを追加してみます。

RPGでは、フィールドを歩いていると、たまにアイテムを拾うことがあります。

そこで今回は、勇者がフィールド上を移動したときに、一定の確率で「やくそう」を拾えるようにします。

アイテムは誰が持つのか

今回は、フィールドを歩いていると、たまにやくそうを拾えるようにします。

ここで少し考えたいのが、

拾ったアイテムは、どのクラスが持つべきか

という点です。

思いつくのは、Rpg クラスにアイテム一覧を持たせる方法です。

Rpg はゲーム全体の状態を管理しているので、そこに持たせても動きます。

ただ、今回やくそうを拾うのは勇者です。

そして、今後やくそうを使うとしたら、使うのも勇者です。

そう考えると、アイテムを持つのは Rpg ではなく、Hero の方が自然です。

そこで今回は、拾ったアイテムを Hero に持たせるようにします。

Itemクラスを作る

まず、アイテム共通のクラスとして Item を作ります。

public class Item {
    private String name;

    public Item(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Item は、アイテム名を持つクラスです。

コンストラクタで、アイテム名を受け取ります。

public Item(String name) {
    this.name = name;
}

そして、アイテム名を取得するために getName() メソッドを用意しています。

public String getName() {
    return name;
}

今回はまだ、アイテム名だけを持つシンプルなクラスにしておきます。

やくそうを表すHerbクラスを作る

次に、やくそうを表す Herb クラスを作ります。

public class Herb extends Item {
    public Herb() {
        super("やくそう");
    }
}

Herb は Item を継承しています。

public class Herb extends Item {

つまり、やくそうはアイテムの一種です。

Item のコンストラクタにはアイテム名を渡す必要があります。

そのため、Herb のコンストラクタでは、親クラスのコンストラクタに "やくそう" を渡しています。

super("やくそう");

これで、`new Herb()` と書くだけで、名前が「やくそう」のアイテムを作れるようになります。

Item item = new Herb();

Heroクラスにアイテムを持たせる

次に、Hero クラスを修正します。

拾ったアイテムは勇者が持つようにしたいので、Hero にアイテム一覧を追加します。

import java.util.ArrayList;
import java.util.List;

public class Hero extends Chara {
    private List<Item> items = new ArrayList<>();

    public Hero() {
        name = "勇者";
        hp = 30;
        attackPower = 10;
    }

    public void addItem(Item item) {
        items.add(item);
    }

    public int getItemCount() {
        return items.size();
    }
}

今回追加したのは、この部分です。

private List<Item> items = new ArrayList<>();

items は、勇者が持っているアイテムの一覧です。

List としているので、やくそう以外のアイテムも同じ一覧に入れることができます。

items.add(new Herb());

アイテムを追加するために、addItem() メソッドを作ります。

public void addItem(Item item) {
    items.add(item);
}

これで、勇者にアイテムを持たせることができます。

hero.addItem(new Herb());

また、今いくつアイテムを持っているか確認するために、getItemCount() も用意しています。

public int getItemCount() {
    return items.size();
}

今回は、まずアイテム数だけを確認できるようにしておきます。

今後、やくそうを使う処理を作るときには、アイテム一覧からやくそうを取り出したり、使ったアイテムを削除したりする処理を追加していきます。

Rpgクラスでやくそうを見つける

次に、Rpg クラスに、やくそうを見つける処理を追加します。

アイテムを持つのは Hero ですが、フィールドを歩いているときにアイテムを見つけるかどうかは、ゲームの進行に関わる処理です。

そのため、アイテムを見つける判定は Rpg に書きます。

public Item findItem() {
    if (inBattle) {
        return null;
    }

    int value = random.nextInt(100);

    if (value < 10) {
        Item item = new Herb();
        hero.addItem(item);
        return item;
    }

    return null;
}

まず、戦闘中ならアイテムを拾わないようにしています。

if (inBattle) {
    return null;
}

次に、乱数を作ります。

int value = random.nextInt(100);

random.nextInt(100) は、0から99までの整数をランダムに返します。

今回は、値が10未満なら、やくそうを拾うことにします。

if (value < 10) {

0から99までの100通りのうち、0から9までの10通りでアイテムを拾います。

つまり、10%の確率でやくそうを拾うことになります。

やくそうを拾った場合は、Herb オブジェクトを作ります。

Item item = new Herb();

そして、勇者に持たせます。

hero.addItem(item);

最後に、拾ったアイテムを返します。

return item;

アイテムを拾わなかった場合は、`null` を返します。

return null;

Rpgクラスの修正部分

Rpg クラスのうち、アイテム拾得に関係する部分は次のようになります。

import java.util.Random;

public class Rpg {
    public static final int FIELD_WIDTH = 10;
    public static final int FIELD_HEIGHT = 8;

    private Hero hero;
    private Chara enemy;

    private int heroX;
    private int heroY;

    private boolean inBattle;

    private Random random = new Random();

    public Rpg() {
        hero = new Hero();
        heroX = 0;
        heroY = 0;
        inBattle = false;
    }

    public Hero getHero() {
        return hero;
    }

    public Chara getEnemy() {
        return enemy;
    }

    public boolean isInBattle() {
        return inBattle;
    }

    public Item findItem() {
        if (inBattle) {
            return null;
        }

        int value = random.nextInt(100);

        if (value < 10) {
            Item item = new Herb();
            hero.addItem(item);
            return item;
        }

        return null;
    }
}

ここで大事なのは、Rpg がアイテム一覧を持っていないことです。

アイテムを持っているのは、あくまで Hero です。

Rpg は、フィールド移動中にアイテムを見つけるかどうかを判定し、見つけたら勇者に渡しています。

RpgFrameで拾ったことを表示する

次に、RpgFrame を修正します。

勇者が移動したあと、敵と遭遇しなかった場合に、アイテムを拾う判定を行います。

private void checkItem() {
    Item item = rpg.findItem();

    if (item != null) {
        javax.swing.JOptionPane.showMessageDialog(
                this,
                item.getName() + "を拾った!\n持っているアイテム: "
                        + rpg.getHero().getItemCount() + "個");
    }
}

rpg.findItem() を呼び出して、アイテムを拾ったかどうかを確認します。

Item item = rpg.findItem();

アイテムを拾わなかった場合は、null が返ります。

アイテムを拾った場合は、Item オブジェクトが返ります。

そのため、item != null で判定しています。

if (item != null) {

拾った場合は、JOptionPane を使ってメッセージを表示します。

javax.swing.JOptionPane.showMessageDialog(
        this,
        item.getName() + "を拾った!\n持っているアイテム: "
                + rpg.getHero().getItemCount() + "個");

アイテム数は、Rpg から勇者を取得し、勇者が持っているアイテム数を表示しています。

rpg.getHero().getItemCount()

ここでも、RpgFrame がアイテム一覧を直接持っていないことに注目してください。

アイテムを持っているのは Hero です。

RpgFrame は、拾ったことを画面に表示しているだけです。

役割を整理する

今回の役割を整理すると、次のようになります。

クラス 役割
Item アイテム共通の情報を持つ
Herb やくそうを表す
Hero 勇者の情報と、持っているアイテムを管理する
Rpg フィールド移動中にアイテムを見つけるかどうかを判定する
RpgFrame アイテムを拾ったことを画面に表示する

アイテムを持つのは Hero です。

アイテムを見つけるかどうかを判定するのは Rpg です。

アイテムを拾ったことを表示するのは RpgFrame です。

このように分けると、それぞれのクラスの役割が分かりやすくなります。

まとめ

今回は、フィールドを移動したときに、たまにやくそうを拾えるようにしました。

まず、アイテム共通のクラスとして Item を作りました。

次に、やくそうを表す Herb クラスを作り、Item を継承させました。

拾ったアイテムは、Rpg ではなく Hero に持たせるようにしました。

やくそうを拾ったら、Rpg の findItem() の中で Hero にアイテムを追加します。

hero.addItem(item);

RpgFrame では、アイテムを拾った場合に、JOptionPane を使ってメッセージを表示しました。

これで、フィールドを歩いていると、たまにやくそうを拾い、勇者がアイテムとして保持できるようになりました。

まだ、拾ったやくそうを使うことはできません。

次回は、戦闘中にやくそうを使って、勇者のHPを回復できるようにしてみます。

-Java, UML, オブジェクト指向
-, , , ,

Copyright© satoshi's ソフトウェア開発 , 2026 All Rights Reserved Powered by STINGER.