• 締切済み

RPGの主人公、町人、敵キャラのクラス関係

world99の回答

  • world99
  • ベストアンサー率64% (20/31)
回答No.2

戦闘に関する処理を親クラスで定義する必要はありません。 戦闘処理を管理するクラスを用意することでもできます。 6.戦闘管理クラス;BattleManager 戦闘処理を管理するクラス。 public class BattleManager { public static int attack (Status status, char chara) { return 0; } public static int guard (Status status, int damage) { status.hp = status.hp - damage; return status.hp; } public static int magic (Status status, char chara) { return 0; } } 7.戦闘インターフェース:BattleInterface 人クラスと敵クラスに実装させるインターフェース。 public interface BattleInterface { int attack (char chara); int guard (int damage); int magic (char chara); } 4’.主人公クラス:Hero public class Hero extends Person implements BattleInterface { private Status status = null; public Hero() { this.status = new Status(); } public Status getStatus() { return this.status; } public int attack(char chara) { return BattleManager.attack(this.status, chara); } public int guard(int damage) { return BattleManager.guard(this.status, damage); } public int magic(char chara) { return BattleManager.magic(this.status, chara); } } 5’.敵キャラ・クラス:Monster public class Monster implements BattleInterface { private Status status; public Status getStatus() { return this.status; } public int attack(char chara) { return BattleManager.attack(this.status, chara); } public int guard(int damage) { return BattleManager.guard(this.status, damage); } public int magic(char chara) { return BattleManager.magic(this.status, chara); } } 先の回答で移動処理を人・抽象クラスに定義しましたが、 戦闘処理クラスを抽象クラスにして、 移動処理を管理するクラスとして実装してもいいかもしれません。 もし移動処理、戦闘処理のほかに、修行処理とか新しい機能を追加したくなった時に 継承だけでクラスを設計しようとすると無理があります。 全体の仕様を考慮しながら柔軟なクラス設計を心がけましょう。

oxfax
質問者

お礼

戦闘のオブジェクトはステータスだけではキャラクターを特定できないので 何らかのオブジェクトで渡す必要があるかと思うのですが (this.status, chara)などのパラメータだけで様々な戦闘処理を網羅できるのでしょうか? BattleManagerに関してはご指摘通りインターフェースを介して実装してみようと思います。

関連するQ&A

  • 親クラスのポインタ、クラスを指定しないポインタ

    親クラス A (抽象メソッドX、Yの2つを持つ) と 子クラス B-1 (親はA、抽象メソッドX、Y、Zの3つを持つ) 子クラス B-2 (親はA、抽象メソッドX、Y、Wの3つを持つ) のように、子クラスでポリモーフィズムを実現しているとき、 クラスC   「実行時に、iniファイルに(1)と書かれていたら、B-1のクラスで実体化し、   iniファイルに(2)と書かれていたら、B-2のクラスで実体化する」  というクラスを作りたいです。 //////////////////////////////////////////////////////////////// 質問(1) その際、クラスCは、どうやってもZのメソッドや、Wのメソッドは書けない認識です。 (メソッド名もiniファイルから取るようにすれば別でしょうが。) この認識であっていますでしょうか? 質問(2) 逆に、XとYについては、それぞれ挙動の違う処理を行わせることができる認識です。 (クラスCで、親クラスAのポインタ型の変数を用意しておき、  そのポインタに、DLLのインスタンス化したものをいれておけば、  メソッドXとYについては実行可能という認識です)

  • ~クラスのメソッドと言った場合継承したものを含むか

    お世話になります。 OJC-Pの勉強中、以下の模試問題が出題されました。 ------------------- Threadクラスのメソッドとして正しいものを全て選びなさい wait() notify() run() start() ------------------- 解答はrun()、start()の2つだったのですが、 この場合、Objectクラスから継承したメソッドは Threadクラスのメソッドとは言わないのかを疑問に感じました。 (外部クラスから見た場合、 継承したメソッドもThreadクラスで新しく定義されたメソッドも区別は ないのでは、と考えたためです。) 問題文の表現に不備があるのでしょうか、 それともやはり 「~クラスのメソッド」と言った場合、継承したものは含まないとするのが 一般的な解釈なのでしょうか。 また、後者の場合、それはどうしてなのか理由なども添えていただけると 嬉しいです。 よろしくおねがいいたします。

    • ベストアンサー
    • Java
  • 【C#】内部だけで有効なインターフェースを作りたい

    C#2005でコンポーネントを作ろうと思っています。 そこであらゆるコンポーネントに共通な内部インターフェースが存在し、 更にはコンポーネントはいくつかの種類のコンポーネントを継承したいです。 不可能なコードで記すと、このようなことがしたいです。 【拡張TextBox】 public class ExTextBox : AbstractTextBox { } 【抽象TextBox】 public abstract class AbstractTextBox : TextBox, ICommonControl {  public AbstractTextBox() {   _ifMethod();  }  private void _ifMethod() {  ←これ   // 処理  } } 【内部インターフェース】 public interface ICommonControl {  void _ifMethod(); } インターフェースはpublic宣言以外定義が行えず、内部で利用される インターフェースとしては使えません。 別にインターフェースをそのまま実装すれば出来なくはないですが、 外部にインターフェースを実装したメソッドが見えるのはマズいです。 もしくは多重継承的なことが出来れば解決すると思うのですが・・・。 コンポーネントを継承する関係で、直前のクラスはTextBoxやLabelなどと いったクラスを継承するしかない為、それ以外の内部部分を共通化 したい場合に、どうすればいいのか分かりません。 実現させる方法が思いつかない為、何かシンプルな一例をご提示 頂けないでしょうか?

  • eclipseでabstractクラスをデバックするには

    いつもお世話になっております。 java1.6 eclipse3.3 にてabstractクラスのメソッドを呼び出している手前でブレークポイントを設定し、ステップインしてデバックしていくと、 abstractクラスの方のソースがデバックされます。 abstractクラスを継承している実際に流れているソースをデバックする事はできますでしょうか。 今はソースを追う時、abstractメソッドがきた場合、 そのメソッド名でプロジェクト全体を検索して、どのソースが実行されているのかチェックしていますが、たくさんのソースから継承されている場合、現在流れている処理が、どのソースのロジックかを特定するのが大変です。 簡単に特定する事はできますでしょうか。 よろしくお願いします。

  • クラスの分割

    画像処理のプログラムを書いているのですが、1つのクラスに必要な変数と関数をぶち込んだため、変数20~、関数20~、2000行くらいのクラスになっています。 このままでは見辛いので、クラスを処理ごとに分割して見易くしたいのですが、各関数でいくつか共通の変数を使用しているため上手く分割ができなくて困っています。 データのみのクラスを継承した子クラスを3つ作ってみたらインスタンスが3つできてしまい意味がありませんでした。 ↓の図に示すようなクラスを作りたいのですが、いくつか質問をさせてください       共通データクラス     /    |    \   子クラスA 子クラスB 子クラスC 1、変数20~、関数20~、2000行くらいのクラスは普通でしょうか?(分割する必要がありますか?) 2、↑の図はクラスの作り方として問題がありますか? 3、2で問題がない場合実現する方法として、仮想継承、関数に共通データのポインタを渡す以外に方法があるかどうか まだまだC++を勉強中で、便利な構造体程度にしか使えていませんが、どなたかご教授お願いします。

  • JAVA:抽象クラスとインタフェースクラスの違い

    インタフェースクラスの存在意義がわかりません。 「処理の実体まで実装せず、箱だけ作っておく」という意味では、抽象クラスで良いのでは?と感じます。 (厳密には、インタフェースクラスの方は、継承せずに、複数の実装パターンを分けれるという部分に違いはあると思いますが、ほぼ存在意義がないように感じます。)

    • ベストアンサー
    • Java
  • 【ASP.NET MVC3】共通ビュークラス

    いつも大変にお世話になっています。 ASP.NET MVC3で作成しているシステムで、すべてのビューに、共通のプロパティを用意したいと考えております。 以前のASP.NETでは、System.Web.UI.Page を継承したカスタムクラスを継承していました。 public MyCustomPage : System.Web.UI.Page {  // 共通のプロパティやメソッド } public class Index : MyCustomPage {  public page_load(Object o, EventArgs e){ // ページロード処理 } }; このような継承定義をビューのクラスで行いたく思います。 MVC3のビューで、たとえば、MyViewModelというビューモデルを埋め込んだ、以下のようなクラスは、どのやって定義したら良いのでしょう? @inherits MyCustomView<MyViewModel> 土曜の夜だというのに、まだ帰れません(泣 何とぞよろしくお願い致します。

  • AWT Frameを利用するプログラムのmainメソッドを含むクラスについて

    AWTのFrameを継承してWindowプログラムを作成する際に、どんな書籍のサンプルプログラムを見ても、メインクラスがFrameを継承し、その中にmainメソッドが有って、そのmainメソッド内で自分自身のクラスのインスタンスを作成してshowする、といった事を定石のように行っています。 しかし私が思うに、mainメソッドなど含まずFrameを継承してWindow周りの処理を純粋に行うクラスを作成し、プログラムのメインとなるクラス内のmainメソッドからFrameを継承した別クラスのインスタンスを作成・showする方が、よほどスッキリして理解し易いような気がするのですが、どうなんでしょ? そういったサンプルプログラムを作成してみましたが問題なく動作します。ただそういう事をやっている他のサンプルソースが見当たらないので、何となく不安です(笑)

    • ベストアンサー
    • Java
  • 親クラスコンストラクタを呼び出すタイミングについて

    ・親クラスコンストラクタを呼び出すタイミングに決まりはあるのでしょうか? ・例えば、子クラスのコンストラクタではなくて、子クラスのメソッドとかで呼び出しても良いのでしょうか? ・後、親クラスコンストラクタ処理が不要な場合は、子クラスから呼ばなくても別に構わないのでしょうか?

    • ベストアンサー
    • PHP
  • インターフェイスと抽象クラス

    なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。

    • ベストアンサー
    • Java