質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • Java

    14359questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • オブジェクト指向

    297questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

RPGにおける戦闘の処理について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 597

amagri

score 2

オブジェクト指向でRPGの戦闘を作成する際の行動・メソッドの書き方について質問があります。Javaを使用しています。
戦闘部分作成は初めてです。

 主なクラス構成・流れ

○○DataClassはファイル等からデータを入力
CharacterClass//HPなどのステータスや戦闘不能フラグ等を管理する(戦闘ではデータを貰って元データが変わらないように)
PlayerDataClass//主人公側(装備データも含む、コマンド選択で行動、それぞれに固有スキル)
EnemyDataClass//敵側(2ターンに1回、HP50%以下等で分岐して行動、複数回行動もアリ)
SkillDataClass//通常攻撃や防御を含むスキルの威力や範囲、付加する効果等を纏めてある。
BattleClass//戦闘するための場。若しくは戦闘を監視する審判。今回のmain.java
戦闘開始の際はBattleClass内で(仮に2vs2の戦闘)
//戦闘に必要なデータのコピー
CharacterClass player_a=new CharacterClass(PlayerDataClass hero)
CharacterClass player_b=new CharacterClass(PlayerDataClass witch)
CharacterClass enemy_a=new CharacterClass(EnemyDataClass bat)
CharacterClass enemy_b=new CharacterClass(EnemyDataClass slime)//データはArraylistで格納して置き、idか名前で呼び出す
としようと考えたのですが、基本的なHP等のステータスは移せますが行動はどのように書いて処理すれば良いかが分かりません。
この後whileループ処理→抜けたら戦闘終了処理(プレイヤーのHPを更新、ドロップ処理など)→フィールドに戻る。という流れです。
現在、設計の案を試行錯誤している段階です。(具体的なコードは無いです)

 要点

メソッドは自身が使うべきか、データを扱う人が使うべきかを教えて頂きたいです。
以下に具体例を用意したので、場合による時はこの番号のケースではこっちと教えて頂きたいです。

 具体的な質問・不安な点

1.キャラか審判か
1-1.act(SkillDataClass sd,CharacterClass target)メソッドを作り、ダメージ計算を行いたいが、CharacterClassとBattleClassのどちらに書くべきか。(人数が増えた場合、戦闘不能情報なども考慮するとフラグ等もBattleClassが全て管理するべき?その場合引数も追加)
1-2.PlayerClassとEnemyClassはCharacterClassを継承させる必要があるか?その場合actメソッド等無駄にならないか(1-1の答えによってはオーバーライドするべきか)

2.敵の行動は、{条件のID(2ターンに1回、HP50%以下等をID化)と攻撃対象(最もHPが低い等)とスキル}の纏まりを最大10個EnemyClassDataに書き込んで管理したい(敵のデータは別ファイルから入力)が、条件のIDを受け取ってswitch文でtrueorfalse判定を返すメソッドはどこに書けば良いか?呼び出しはBattleClassのwhileループ内。候補:EnemyClass、BattleClass

3.スキル自身かスキル実行者か
3-1.使うとダメージや回復ではない特殊な追加効果が起きる(戦闘不能者の数だけ攻撃アップ)スキルAの場合、その処理はactメソッドの中に書いて置くのが良いのでしょうか?if(sd=skiilA){戦闘不能者の数×10を攻撃力に加算}としてからダメージ計算処理(同じような効果が増えたら特殊効果番号と効果値をSkillDataに加えて関数化?)。もしくはSkillDataにusedメソッドを作り、スキル個別に実行された処理を書くべきなのか?
3-2.主人公側のみの固有スキル(例heroならHP80%以上なら自身が狙われる等)の処理はどこに入れるべきか?固有スキル名だけCharacterClassに移して3-1と同様にすれば良い?

4.(念のため)味方の行動はBattleClassのWhileループ内に選択された行動から条件分岐書いてact等を実行で良いのか?(間違ってなければスルーで)

オブジェクト指向の細かい部分が分からない為よろしくお願いします。長い部分は太字にしました。
回答は出来ればこっちにすると○○な点で不便だから××の方が良いと思う等の理由や意見が欲しいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/07/19 15:52

    質問が多すぎてみている方の負担が大きすぎます。要点を絞ってください。現状だとコードも何もないので文章の羅列に過ぎず、どのようなoutputがあるのか分かりません。 質問内容を精査してください。

    キャンセル

回答 1

checkベストアンサー

+1

質問文が長すぎて全部読んでないです。

a. 他のクラスの内部実装について知りすぎない。
b. 他のクラスについて知りたいことがあれば、そのクラスに問い合わせをする。

まず、これを意識してクラスのメッセージ設計を行ってくださいな。


a. PT単位で行動するならば、BattleClassとは別にPTクラスを作成した方が良いと思います。

b. 例えば、戦闘不能情報はPlayerClassEnemyClassがそれぞれ自身が戦闘不能かの状態を返せばよいです。
継承しているなら親クラスにメソッドを定義しても良いと思います。

public boolean isAlive() {
    return this.hp != 0;
}

c. 次にPlayerClassEnemyClassturnメソッドを追加します。
これはBattleClassから呼び出すためのメソッドです。

※)PlayerClassEnemyClassCharacterClassを継承しているのであれば、Character Classturnメソッドを定義してオーバーライドするのでも良いかと。

戦闘はBattleClassPlayerClassクラスとEnemyClassクラスのtrunメソッドを呼び出す形にします。

プレーヤーとエネミーを分けて`List`で管理するのが良いと思います。

戦闘不能ならスキップさせたいのであれば、trunメソッド内で自身がisAliveかどうかを呼び出してください。

public void trun() {
     if(!isAlive()) {
         return; // 戦闘不能ならターンを自動スキップ
     }
     // 以下、自分のターンで行いたい処理
}

d. 最初はシンプルに戦闘の枠組みを作って、あとから細部を詰めていく形のほうが良いです。
初心者なら特にそうです。最初は外部ファイルから読まない、特殊な処理を入れない。


つまりBattleClass(審判)は今はAのターンだからAが行動してという指示を出すだけで、実際の行動はCharacterClassのAが決めるということですね。

はい、その認識でOKです。あとBattleClassが行う事はPT単位の全滅判定です。
全滅したPTがEnemyClassなら戦闘終了、PCならゲームオーバー処理など。

スキルを使用する場合は
> public abstract int damage(Character user,Character target){

Characterの情報はスキルではないので、SkillDataClassにはスキル以外の情報を持たないほうがいいです。
あくまでも該当のスキルを使うのはEnemyDataClassPlayerDataClassなので有って。
SkillDataClassクラスではないからです。

ダメージは考慮事項が多いので、ダメージ計算を行う専用の処理(クラス/メソッド)を作成したほうが良いですが。
ここではまずシンプルに、相手からの被弾時に行う処理としてCharacterClassdamageメソッドを追加します。ここで、Skillの情報を元にHPの加減算、バフデバフの状態を設定すればよいでしょう。

あと考慮することはPT全体への全体攻撃があるかどうかです。
あるなら、その点も考えてみてください。最初はターゲット単体へのダメージ処理を実装するのが良いでしょう。

EnemyClassの場合は、
1,保持しているスキルリストから使用スキルを選択(条件やランダム)
2,BattleClassクラスから相手PTの情報を取得、ヘイトに応じて攻撃するターゲットを選択。
3,スキルをターゲットに攻撃。

このような形に。

ファイルから読み込まない場合、スキルの追加はインナークラスで書いて行けば良いのでしょうか?

SkillBuilderクラスを新設して、Skillを生成して返すクラスを作るのと。
保持しているSkillPlayerDataClassEnemyDataClassでは、HashMapで管理する形で良いかと。SkillTreeクラスを作るかどうかは、好みになるのではないかと。
どうしてもファイルから読みたいならば、リソース(ファイル)をロードするクラスを作って、SkillTreeに展開するなど。
◇参考情報
Properties

長々と書きましたが、実際にコードを書いてみることをお勧めします。
コードを書いた後にポイントを絞って再質問したほうが回答が付きやすいかと。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/19 18:24

    回答ありがとうございます。
    つまりBattleClass(審判)は今はAのターンだからAが行動してという指示を出すだけで、実際の行動はCharacterClassのAが決めるということですね。自身が戦闘不能なら審判に伝えてターンを終えると。
    敵の行動もturnに入れれば良いので分かりました。

    スキルを使用する場合はSkillDataClassに
    public abstract int damage(Character user,Character target){
    //インナークラスで追加があるならここ
    //共通の基本ダメージ計算処理
    }
    という抽象メソッドを書いてキャラのturn内で使ったスキルのdamageメソッドを呼び出すで合ってますね?
    ファイルから読み込まない場合、スキルの追加はインナークラスで書いて行けば良いのでしょうか?

    キャンセル

  • 2018/07/19 20:39

    分かりやすい説明ありがとうございます。
    方針が掴めずどう書けば良いのか悩んでいましたが、それぞれに情報を与えるのではなく、情報だけを持っているクラスとその情報を扱うクラスで分ければ良いのですね。やっとすっきりしました。
    builderについてはまだ理解できていなかった為この機会に学習しコードを書いてみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    14359questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • オブジェクト指向

    297questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。