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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

オブジェクト指向

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

Q&A

解決済

1回答

1097閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

オブジェクト指向

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

0グッド

0クリップ

投稿2018/07/19 06:48

編集2018/07/19 08:10

オブジェクト指向で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等を実行で良いのか?(間違ってなければスルーで)

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/07/19 06:52

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

回答1

0

ベストアンサー

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

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

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


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

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

Java

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

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

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

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

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

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

Java

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

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 08:19

編集2018/07/19 11:19
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/07/19 09:24

回答ありがとうございます。 つまりBattleClass(審判)は今はAのターンだからAが行動してという指示を出すだけで、実際の行動はCharacterClassのAが決めるということですね。自身が戦闘不能なら審判に伝えてターンを終えると。 敵の行動もturnに入れれば良いので分かりました。 スキルを使用する場合はSkillDataClassに public abstract int damage(Character user,Character target){ //インナークラスで追加があるならここ //共通の基本ダメージ計算処理 } という抽象メソッドを書いてキャラのturn内で使ったスキルのdamageメソッドを呼び出すで合ってますね? ファイルから読み込まない場合、スキルの追加はインナークラスで書いて行けば良いのでしょうか?
退会済みユーザー

退会済みユーザー

2018/07/19 11:39

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問