テラリウム徹底攻略ガイド生物テンプレートの詳細(2)デジタルアドバンテージ2002/05/18 |
■生物テンプレートのロジック
生物テンプレートが対応しているイベントのうち、生物の行動ロジックが記述されているのは、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メソッドでは全角文字も使用可能だ。
続く生物テンプレートのコードが、メインのロジックであるが、if文の嵐で少し分かりにくい。ポイントだけをまとめると、生物テンプレートの戦略は次のようなものになっている。
- おなかがすいていなければ何もしない。
- 近くに動物がいなければランダムに移動。
- 動物を見つけたら、その動物へ移動。
- 動物に近づいたら停止して攻撃。
- 動物がすでに死んでいれば停止して食べる。
さて、このテンプレート動物をこのままEcosystemにIntroduceするとどうなるだろうか。現在Ecosystemは草食動物の天下だ。ランキング上位の草食動物たちは、視界が広く、豊富な植物を食べながら、肉食動物が近づいてくるとすかさず距離をとる。このため、多くの肉食動物は十分な食料を得ることができずに絶滅している。
動物の移動はBeginMovingメソッドにより開始するが、このときパラメータには移動先と移動速度を設定したMovementVectorオブジェクトを指定する。テンプレート動物は、どのような場合も、速度2で移動している(2が速度の下限値)。このため、テンプレート動物はまったくほかの草食動物を攻撃することができない。たまに落ちている死体も、スピードが遅すぎて、たどり着く前に消えてしまう。まずは、ランダムに移動している場合と、目標とする動物がいる場合の速度を分けて設定する必要があるようだ。
また、今のままでは敵に一直線で向かっていくため、速度を上げても目標の動物を追いかける途中で植物などにひっかかってしまうのがオチだろう。生き残る草食動物は、なめらかに速度を変えながら、見事に肉食動物をかわしていく。肉食動物にとっては、いかに最適なスピードで敵までの最短経路を進むかが非常に重要なカギとなる。これは最短経路探索という数学的な命題に行き着くと思われるが、生物に与えられている1つのターンでの処理時間は限られている。これをオーバーしてしまうとシステムにより殺されてしまうこともあるため、いかに計算を簡略化するかということも考慮しなくてはならない。
こんなテンプレート動物にもたまに攻撃できる生物がいる。と思ったら同じ種の生物だ。Scanメソッドにより取得した敵リストから同じ種の生物を省くのは必須の処理だ。この判定にはIsMySpeciesメソッドを使用すればよい。
改善すべき点を挙げているとキリがないので今回は取りあえずこの辺にしておこう。こういったことを踏まえたうえで、次回からはオリジナルな動物作りに挑戦してみる予定だ。
■
この原稿を執筆中に、テラリウムの本家である米国サイトgotdotnetでは、テラリウムV1.1がリリースされたようだ。詳しくはまだ調べてはいないが、アナウンスによれば、主な新機能として、
- ほかの生物と容易にコミュニケーションを取ることができる“AntennaValue”の実装
- 肉食動物はもはや病気にならない
となっている。後者については、やはり現バージョンではゲーム・バランスが悪く、肉食動物が不利であるということへの対処だと思われる。なお、日本のコンテストで、新しいバージョンのテラリウムの扱いがどうなるかはいまのところはまだ不明である。それはともかく、テラリウムはコンテストの終了とともに消え去るものではなく、さらに磨きがかかって面白くなっていくようだ。
■追加情報(2002/5/20)
プログラミング・コンテストにおけるテラリウム・バージョン1.1の扱いが、テラリウム・オフィシャル・サイトの「Terrarium Q&A」に追加されています。
ここに記載されているように、テラリウム・バージョン1.1ではコンテストに参加できません。コンテストに参加できるのはバージョン1.0(アセンブリのバージョンは1.0.20)のみとなっています(編集部)。
INDEX | ||
[連載]テラリウム徹底攻略ガイド | ||
第3回 オブジェクト・モデルと生物テンプレート | ||
テラリウムのオブジェクト・モデル概要 | ||
オブジェクト・モデルのクラス構造 | ||
生物テンプレートの詳細(1) | ||
生物テンプレートの詳細(2) | ||
更新履歴 |
【2002/05/20】 テラリウム・バージョン1.1に関するコンテストの情報を追加しました。 |
【2002/05/20】 本ページにおいて、「このとき第2パラメータには、移動速度を指定する」となっている個所がありましたが、これは「このときパラメータには移動先と移動速度を設定したMovementVectorオブジェクトを指定する」の誤りでした。 お詫びして訂正させていただきます。 |
「連載 テラリウム徹底攻略ガイド」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|