テラリウム徹底攻略ガイド(改訂版)生物テンプレートの詳細(2)デジタルアドバンテージ2003/05/10 |
■生物テンプレートのロジック
生物テンプレートが対応しているイベントのうち、生物の行動ロジックが記述されているのは、Idleイベント・ハンドラのIdleEventメソッドである。続いてこのメソッドの中身を見てみよう。
まずこのメソッドでは、出産可能な状態ならば出産を行う。
これは次のような2行で記述することができる。CanReproduceプロパティは、現在出産が可能かどうかを判定するためのものだ。これがtrueでないような状態では、続くBeginReproductionメソッドを呼び出しても例外が発生する。
|
|
現在出産が可能かどうかを判定し、可能であれば生殖を開始する |
生殖(出産)はある意味、テラリウムでは最も重要な行動だ。いくら動物が強かったとしても、子孫を残して繁殖できなければ、テラリウムの勝者とならない。ではどのようにすれば“CanReproduce == true”になるのか。これにはいくつかの条件をクリアしていなければならない。この詳細については「第 10 章 生殖へとつながる成長」を参照していただきたい。
出産処理のあとは、攻撃中/食事中/移動中ならば何もしないでメソッドを終了する。
これは次のコードによるものだ。しかしこのコードはよく考えると少しおかしい。
|
|
攻撃中/食事中/移動中ならば何もせずに、トレース・メッセージを出力する |
なぜなら、この生物テンプレートでは、このメソッド内で、この処理の以降にしかBeginAttackingやBeginEatingを呼び出していない。よって、IsAttackingやIsEatingが“true”になることはないはずである。また、BeginAttackingやBeginEatingを呼び出すようなイベント処理を追加したとしても、このコードは効率的でないかもしれない。1つのターンでは、攻撃、食事、移動を同時に開始できるためである。つまり移動しながら敵を攻撃し、さらに近くにエサがあればそれを食べることができるのだ。
ところで、このif文ではWriteTraceメソッドにより、トレースのためのメッセージを出力している。出力されたメッセージは、次の画面のように[Trace Window]に表示される。表示されるメッセージは、現在フィールド上で選択している生物が出力しているものだ。
[Trace Window]を開いたテラリウムの実行画面 | ||||||
生物プログラムのデバッグ・メッセージはWriteTraceメソッドにより、このウィンドウに出力することができる。 | ||||||
|
生物テンプレートのように、各処理でWriteTraceメソッドを埋め込んでおけば、生物がどのような状態なのかをトレースすることができる。WriteTraceメソッドでは全角文字も使用可能だ。また、テラリウム 1.1 最新情報で解説しているように、テラリウム1.1では、VS.NETの「出力ウィンドウ」など、外部のデバッグ・ツールへの出力も可能になった。
続く生物テンプレートのコードが、メインのロジックであるが、if文の嵐で少し分かりにくい。ポイントだけをまとめると、生物テンプレートの戦略は次のようなものになっている。
- おなかがすいていなければ何もしない。
- 近くに動物がいなければランダムに移動。
- 動物を見つけたら、その動物へ移動。
- 動物に近づいたら停止して攻撃。
- 動物がすでに死んでいれば停止して食べる。
動物の移動はBeginMovingメソッドにより開始するが、このときパラメータには移動先と移動速度を設定したMovementVectorオブジェクトを指定する。テンプレート動物は、どのような場合も、速度2で移動している(2が速度の下限値)。このため、テンプレート動物はまったくほかの草食動物を攻撃することができない。たまに落ちている死体も、スピードが遅すぎて、たどり着く前に消えてしまう。まずは、ランダムに移動している場合と、目標とする動物がいる場合の速度を分けて設定する必要があるようだ。
また、今のままでは敵に一直線で向かっていくため、速度を上げても目標の動物を追いかける途中で植物などにひっかかってしまうのがオチだろう。生き残る草食動物は、なめらかに速度を変えながら、見事に肉食動物をかわしていく。肉食動物にとっては、いかに最適なスピードで敵までの最短経路を進むかが非常に重要なカギとなる。これは最短経路探索という数学的な命題に行き着くと思われるが、生物に与えられている1つのターンでの処理時間は限られている。これをオーバーしてしまうとシステムにより殺されてしまうこともあるため、いかに計算を簡略化するかということも考慮しなくてはならない。
こんなテンプレート動物にもたまに攻撃できる生物がいる。と思ったら同じ種の生物だ。Scanメソッドにより取得した敵リストから同じ種の生物を省くのは必須の処理だ。この判定にはIsMySpeciesメソッドを使用すればよい。
改善すべき点を挙げているとキリがないので今回は取りあえずこの辺にしておこう。こういったことを踏まえたうえで、次回からはオリジナルな動物作りに挑戦してみる。
INDEX | ||
テラリウム徹底攻略ガイド(改訂版) | ||
第3回 オブジェクト・モデルと生物テンプレート | ||
テラリウムのオブジェクト・モデル概要 | ||
オブジェクト・モデルのクラス構造 | ||
生物テンプレートの詳細(1) | ||
生物テンプレートの詳細(2) | ||
「テラリウム徹底攻略ガイド(改訂版)」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|