読者です 読者をやめる 読者になる 読者になる

亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

ちょっとコマンドバトルのクラスを考えてみるよ。

雑記 C++

今、会社内の勉強会でC++の勉強をしてます。んで、課題として出されたのがC++的なコマンドラインバトルだったので、そのクラス設計をする様子をツラツラと書いていこうかと思います。ちなみに、書き始めてる時点で頭はまっさらです。つらつらふらふら迷いながらプログラミングしますので、そこらへんに付き合ってやるという奇特な方を対象としてます。

要は、自分用のメモに近いです、はい。

まずはザクッとしたクラス図から

そいでは、まずは最初のクラス設計。まぁ、こういうのは普通Gameクラスみたいのにキャラクターを放り込みますよね。というわけで、まずはこうじゃないですかね。

f:id:posaunehm:20120219222024p:image

とはいえ、コレだとあんまり宜しくないです。まずGameクラスってなにをするんでしょ?何か役割が大きすぎる気がします。GameじゃなくてBattle位のほうが分かりやすそうです。
Battleクラスの責務は、まず敵・味方それぞれのインスタンスの攻撃を管理すること。ここではドラクエみたいなターンバトルをとりあえず前提にしようかと思ってるので、「ターンを進める」みたいなメソッドが必要でしょう。
また、ドラクエみたい、と考えると敵や味方も複数人いることが必要でしょう。なので、ちゃんと多重度も書いておきます。それに、それぞれの敵に対してクラスを作るのもアレですので、共通のインタフェースを定義しておきましょう。てなわけで。

f:id:posaunehm:20120219223659p:image

あとは各クラスが持つべきプロパティやメソッド、すなわち書くクラスの外部設計をもう少し考えてみましょう。

Battleクラスの外部設計

Battleクラスは敵と味方キャラを複数人ずつ受け取り、それを外部から駆動されるターン進行処理によりターンごとに戦わせる、というようなモデルと考えましょう。そうすると、まず戦闘の終了を意味する何かがほしいです。ProgressTurnの返り値にboolを指定して、進められなければfalseにするって方法もあるかと思いますが、あんまり返り値に処理の結果ではなく状態を返すのは個人的にあんまり好きじゃないです。HRESULTみたいで。てなわけで、プロパティを設けましょう。IsBattleEnd、とかですかね。
あとは現在のターン数とかはほしいかも。追加しときましょう。

IPlayerの外部設計

基本的には、攻撃を受けることと攻撃を与えることが出来ればそれで良いはずです。つまり攻撃力とHPが有ればとりあえずOK。。。ですが、やっぱり防御力はほしいですよね。RPG的には。
というわけでこの3つをプロパティとして設定できればそれでよさそうです。
他には・・・、あ、取りうるコマンドが有りますね。

IEnemyの外部設計

基本的には、攻撃を受けることと攻撃を与えることが出来ればそれで良いはずですが、やっぱり防御力も、ってあれ?IPlayerと同じですよね。。。そうか、ここをインタフェースとして分ける必要性は無いですね、今のところ。かりに別のInterfaceがあるにしろ、共通部分を抜き出すことはしておいたほうがよさそうです。

そいじゃこんな感じ?

f:id:posaunehm:20120219225442p:image


ふむ、とりあえずスッキリとはしたかな・・・。

コマンド選択どうするよ?

ん?しかしもう一つ気になることが出てきました。コマンド選択事態をどうしましょう。いまだとBattleクラスに一任しちゃいそうですが、さすがにそれはなんか違いそうです。まず、コマンド自体が持つべき責務を考えてみましょう。単純に考えると、

  1. ターゲットに対して
  2. 何か操作を行い、パラメータを変更させる

という特徴が有りそうです。んじゃ、そういうインターフェースを持たせてみればいいのかな。
んで、それを各キャラクターが持っている、と。こんな感じでしょうか。

f:id:posaunehm:20120220004602p:image

とりあえず、こんな感じまで来ましたが、コレ思ってるほど単純じゃないですね。。。
明日までにはちょっとできそうにないなぁ。まぁ設計にこだわらなければサッと出来るんだろうけど。