2014-01-17

http://anond.hatelabo.jp/20140117111737

守備力だとか、耐性だとかは、モンスター属性なので、影響はモンスター側で面倒見てもらいたいから

攻撃でHPを減らすのは、モンスターメソッド経由になると思う。

結局、

class 勇者 :
  method attack(モンスター: monster):
      monster.attackedBy(self.attackPower)

みたいなコードになると思うんだけど。

ぐうの音もでません、その通りですね。

攻撃方法の実装もわかりました。

遅延攻撃や即死攻撃に対応したい場合、例えば次のように変更すればよいでしょうか。

interface 攻撃方法:
    /** 対称を攻撃 */
    method apply(攻撃対象: atackee);

それで、その他のクラスは下記のような感じに。

class 勇者 :
  // 中略
  method attack(モンスター: monster):
      self.currentAttackMethod.apply(monster)

class 即死攻撃 : implements 攻撃方法
  method apply(攻撃対象: atackee):
      atackee.kill

class 通常攻撃 : implements 攻撃方法
  // 中略
  method apply(攻撃対象: atackee):
      atackee.attackedBy(self.getAttackPower)

小一時間考えてみましたが、通常攻撃は

new 通常攻撃(player)

より

new 通常攻撃(player.getAttackPower)

の方が良いかもしれませんね。攻撃が放たれたら、その攻撃を誰が行ったか関係なくなる、とした方が情報の流れがすっきりすると思います

攻撃者 → 攻撃方法(突撃・斬撃・ジャンプ即死攻撃) → 攻撃対象
記事への反応 -
  • 例えばスーファミのFFみたいな、古典的なRPGの戦闘シーンを作っていて、「勇者がモンスターを攻撃する」。 勇者.attack(モンスター); という設計だったとする。 これに「モンスターが毒...

    • MVC以前にオブジェクト指向がしっくりきてないでしょ。 「勇者がモンスターを攻撃する」。 勇者.attack(モンスター); という設計だったとする。 これが既にオブジェクト指向的じゃな...

      • ご意見くださって、ありがとうございます。 例にあげたRPGのモデル設計はhttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1178047006を参考にしました。 ですが自分で書くとしても、十中八九そ...

        • 一理あるご意見をいただきました。ありがとうございます。 英語として読みにくいなら、メソッド名のほうを変えるよ。 モンスター.attackedBy(勇者.attackPower) 誤解を招いてしまったよ...

          • わかりやすさについてとやかく言わないけどさ、攻撃するってことは、モンスターのHPだとかが減るんだよね? 勇者.attack(モンスター) って書いたとしてもさ、勇者.attackメソッドの中で、...

            • 守備力だとか、耐性だとかは、モンスターの属性なので、影響はモンスター側で面倒見てもらいたいから、 攻撃でHPを減らすのは、モンスターのメソッド経由になると思う。 結局、 c...

        • 英語として読みにくいなら、メソッド名のほうを変えるよ。 モンスター.attackedBy(勇者.attackPower) 攻撃方法が増えるなら、攻撃方法を抽象化するでしょ。 攻撃方法型を作って モンスター....

    • モデルで発生するイベントが多く、複雑になるほど、ビューとの関連は密になる。 ここの所は、今回の例ではいまいち見えづらい気がする。今回の例で複雑になっているのはモデルだ...

      • 元増田です。ありがとうございます。 モデルで発生するイベントが多く、複雑になるほど、ビューとの関連は密になる。 ここの所は、今回の例ではいまいち見えづらい気がする。 ...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん