Strategyパターンデザインパターン実践編は、色々なパターンを使って諸問題を解決していきます。この章ではRPGだけでなくほぼすべてのゲームに存在するヒットポイントを考えてみます。ヒットポイントは数字だけ持てば良いと思っていた...ドラクエなどで同じみのヒットポイント。キャラクタの生命力であり、0になるとキャラクタは死んでしまいます。とあるプロジェクトで、私はヒットポイントを持つキャラクタを作る事になりました。敵の攻撃を受けるとヒットポイントはその分だけ減ります。ヒットポイントが0になるとキャラクタは死亡フラグが立ちます。「んじゃ、ヒットポイントを整数で持つことにするべぇ。ダメージを与えられたらヒットポイントを減らすのね。power);};インターフェイスの意味はコメントの通りです。このクラスを継承して個々のキャラクタクラスが作られていきます。とあるキャラクタについて企画の方からこう言われました。「このキャラクタは難易度に対して初期のヒットポイントを変えて欲しいなぁ」。break;};hoge->setHitPoint(HP);難易度difficultyによって場合分けをしてヒットポイントを決定しています。ヒットポイントをハードコーディングしているはさて置いて、これで企画の仕様は満たしました。ところが、翌日「このキャラクタも難易度別にしてくれないかなぁ」という注文が入りました。break;};foo->setHitPoint(HP);一件落着...ではありませんでした。「このキャラは特定部位が壊されたら途中でHPを1000減らして」と、ヒットポイント周りの自由度たるやとんでも無かったのでした。先のような場当たり的な対処だとあっさりと限界を迎えます。setHitPointに値を渡すだけでは駄目だったんです。その数値を決める「方法」が重要だったのでした。Strategyパターンを使ってみよう状況を整理します。キャラクタのヒットポイントを決める要素は非常に様々で、それはゲームの外的要因(及び企画の想像力)によって変動することがいくらでもありえます。一つ、ヒットポイントを決める方法は別のキャラクタにも適用されることがいくらでもあります。難易度別でヒットポイントを変えるというのは他の色々なキャラクタについても大体当てはまります。ヒットポイントの決め方が変動し、その方法は他の人も使うかもしれない。これを吸収する方法としてまず考えるのが「ヒットポイント決定関数を作る」です。これならば方法は使い回しできます。「ヒットポイント自体をクラス」にすると方法と一緒にヒットポイント自体もこのクラスが管理できます。こちらの方がオブジェクト指向です。0;};IHitPointインターフェイスはinitializeメソッドに与えられたベースとなるinitHPを加工して初期ヒットポイントを内部に格納します。ここでHPを決定するさまざまな方法(ストラテジー:戦略)が動きます。hitPoint;}};現在の難易度に合わせてヒットポイントを増減させるクラスの場合は難易度を設定してあげる必要があります。break;}}};Characterクラスはヒットポイントを受け取る代わりにヒットポイントオブジェクトへのポインタ(スマートポインタ)を受け取ります。power);};後は内部では抽象化されたIHitPointのインターフェイスのみで会話します。Pattern)」です。たかがヒットポイントでさえこうなのですから、ゲームのパラメータの多くは実はストラテジーパターンにしないと怖いというのが分かると思います。Strategyパターンがあると大抵Factoryも必要になるさて、Strategyパターンは仕事の一部を外部のオブジェクトが担うのですから、当然そのオブジェクトを「外部が」作る事になります。);hp_dif->initialize(3500);chara2->setHitPoint(hp_dif);ん〜〜ベースとなるヒットポイントを設定するのは仕方ないとしても、ここにはまずい点があります。それは生成すべき超具体的なオブジェクトが直で書かれている点です。いう具体性はどこかで出てきてしまうのですが、それはぎりぎりまで絞って隠した方が柔軟性が上がります。生成を隠す有効な手段はFactoryクラスです。3500);chara2->setHitPoint(hp_dif);HitPointFactoryは現在のゲームの状態(gameState)を知っていて、createメソッドに渡されたフラグ(HitPoint_Difficultyとか)を元にしてヒットポイントオブジェクトを内部で作成します。すると、外目にはもう生成部分が見えません。引数を上のような値にしてしまうと、例えばスクリプトなどからこれらの値を与えるだけで好きなヒットポイントを持ったキャラクタが作れてしまいます。ここまで来ると、外部のファイルに書き込んだパラメータからキャラクタを作れるようになります。キャラクタ情報ファイルHitPoint,0,3000HitPoint,1,3500という情報ファイルがあれば上のキャラクタオブジェクトが作れるのがわかりますよね(ファイルなのでHitPoint_Normal→0、HitPoint_Difficulty→1と数値化されています)。いう事で、Strategyパターンのような沢山の種類のオブジェクトを生成する場合では大抵Factoryクラスが必要になります。ゲームの画面に出ているヒットポイントや攻撃力、防御力などは、単なる数値ではなくてもはや一つのオブジェクトである。その位ゲームの要素の粒度は小さいんです。する事で、企画が発案する柔軟な発想に対応できるようになります。面倒でも考慮した方が幸せです(^-^)。