【C++】RPGにおけるオブジェクト指向的な設計について質問です。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nc
記事: 2
登録日時: 9年前

【C++】RPGにおけるオブジェクト指向的な設計について質問です。

#1

投稿記事 by nc » 9年前

オブジェクト指向プログラミング初心者です。
C++とDXライブラリを用いてフィールドバトルのできるRPGを制作しようとしています。
カプセル化やポリモーフィズムといったオブジェクト指向の考え方というものは段々と分かってきたのですが、
実際の実装方法が今いちよく分かりません。

別のインスタンスの状態を取得・(間接的にでも)操作しなければならないときってありますよね。
例えば、フィールドバトルを実装したRPGで、プレイヤーがモンスターに攻撃すると、モンスターのHPが減りますよね。

それは、プレイヤークラスのアタックメソッドの中で、モンスタークラスの被ダメージメソッドを呼び出せば良いですよね。
引数に与えたダメージの大きさを渡すなどして。

ただ、実際問題それをどうやって実装したらいいんでしょう?

プレイヤークラス内部から静的でないモンスタークラスのメソッドを呼び出すためにはオブジェクト参照が必要なので、
プレイヤークラス内部でモンスタークラスがnewによって実体化されてないとダメですよね。

しかし、それが間違いであることは承知していますし、そもそも値が初期化されてしまいますよね。
現状、仕方なくグローバル変数を介してプレイヤークラスからリクエストを送信するという形で実装していますが、
とても見づらいプログラムになってしまいました。

どこをどのようにするのがオブジェクト指向的な美しいプログラムなのでしょうか?

hide

Re: 【C++】RPGにおけるオブジェクト指向的な設計について質問です。

#2

投稿記事 by hide » 9年前

直接相手のメソッドを呼び出すのは避けたほうがいいです。

プレイヤーの攻撃を決定する際に、管理側に対してDamageオブジェクトを返して、
管理側がモンスターにDamageオブジェクトを渡す。
モンスターは受け取ったDamageから威力を取得して、自身のHPを減らす。
とかにするとよいかとと思います。

nc
記事: 2
登録日時: 9年前

Re: 【C++】RPGにおけるオブジェクト指向的な設計について質問です。

#3

投稿記事 by nc » 9年前

返信ありがとうございます。

こんな感じでしょうか?
PlayerがAttackメソッドを実行する度に、管理側にモンスターを攻撃するリクエストが送られ、
それを受け取った管理側がモンスターに被ダメ処理を行わせる、というプログラムです。

コード:

// 管理側
void main {
    Player* player = new Player();
    Monster* monster = new Monster();

    while(  ※プログラム終了フラグが立つまで  ) {

            ・・・

        // プレイヤーが攻撃をリクエストしたらモンスターにダメージ
        if(player->GetAttackRequest() == 1) {
            monster->ReceiveDamage(player->GetDamage);
            player->SetAttackRequest(0);
        }

            ・・・

    }
}

// プレイヤー
class Player {
private:
    int attackRequest = 0;
    int damage;

        ・・・

    void Attack() {
        attackRequest = 1;
        damage = 5;
    }
public:
    int GetDamage() {
        return damage;
    }
    int GetAttackRequest() {
        return attackRequest;
    }
    void SetAttackRequest(int var) {
        attackRequest = var;
    }
}

// モンスター
class Monster {
private:
    int hp = 100;

        ・・・

public:
    void ReceiveDamage(int damage) {
        hp -= damage;
    }
}

hide

Re: 【C++】RPGにおけるオブジェクト指向的な設計について質問です。

#4

投稿記事 by hide » 9年前

そんなイメージですね。
最初に管理者にダメージのオブジェクトを返して、って書きましたが
どこかに自身の攻撃を登録するような書き方でもいいのかな。書き方は色々あると思います。

player と monster を抽象化して、共通の親をもたせてそっちに各種メソッドを置く(戦闘なのでお互いに攻撃しますよね?)
ダメージ自体をクラスにする、攻撃対象の扱い方を工夫する
などすれば綺麗になるかと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る