テラリウム徹底攻略ガイド

肉食動物の行動パターン

大石 晃裕+デジタルアドバンテージ
2002/06/06

肉食動物Komagomeの行動パターン

 次に生物の行動パターンを記述するIdleEventメソッドを見てみよう。前回でも述べているように、KAnimalクラスを利用した動物の実装では、毎ターンの最後に発生するIdleイベントだけですべての行動を記述する方法をとっている。

protected override void IdleEvent(object sender, IdleEventArgs e) {
  try {
    BeginEating(Food);
    BeginAttacking(Brunt);
    BeginDefending(Threat);

    if(IsReproducing) {
      ReproducingAction(sender, e);
    } else {
      NotReproducingAction(sender, e);
    }
  } catch(Exception exc) {
    WriteTrace(exc);
  }
}
肉食動物KomagomeのIdleEventメソッド

 さて、これがKAnimalクラスで用意されているデフォルトの行動に加え、この生物独自の行動パターンを定義したメソッドだ。

 まず始めに、BeginEatingメソッド、BeginAttackingメソッド、BeginDefendingメソッドを指定している。これは、後にどのような行動をする場合にも、デフォルトの行動として、現状で食べることができるものを食べ、また攻撃できる敵がいれば攻撃させ、最も近い脅威の敵に対して取りあえず防御をさせたいためだ。それぞれのメソッドの引数となっているFood、Brunt、Threatの3つのプロパティは、前項で説明した3つの“Is〜”メソッドを用いてKAnimalクラスにより設定される、各行動に最適な対象生物となっているはずのものである。

 次に、このメソッドでは生殖中かどうかで別の2つの行動を取るようにしている。

 以下、それぞれの行動を記述したコードを列挙する。

protected void ReproducingAction(object sender, IdleEventArgs e) {
  StopMoving();

  if(Threat != null) {
    RunAway(Threat);
  } else if(State.EnergyState == EnergyState.Hungry ||
    State.EnergyState == EnergyState.Deterioration) {
    NotReproducingAction(sender, e);
  }
}
protected void NotReproducingAction(object sender, IdleEventArgs e) {
  if(Threat != null) {
    RunAway(Threat);
  } else if(Food != null) {
    Eat(Food);
  } else if(Brunt != null) {
    Attack(Brunt);
  } else {
    Wander(4);
  }
}
ReproducingActionメソッドとNotReproducingActionメソッド

 まずReproducingActionメソッドだが、基本的に生殖中は体力の消費を最小限に抑える、ということが重要だ。そこで、StopMovingメソッドを呼び出して、取りあえずは、その場にとどまろうとする。ただし脅威となる生物が周りにいる場合には、RunAwayメソッドを呼び出して逃げることとする。

 また、自分のエネルギーの状態であるEnergyStateプロパティがHungry(空腹)かDeterioration(餓死寸前)のときには、生殖活動が一時停止してしまう(食料を補給すれば再び生殖活動は継続する)。この場合には、通常どおりに食物を探し、敵を攻撃する必要がある。これを行うのが次のNotReproducingActionメソッドだ。

 NotReproducingActionメソッドでは、まだ繁殖活動をしていないとき、つまりほとんどの場合での行動を指定している。これらの行動は優先度が違うのだが、それは次のような順序となっている。

  • 脅威となる動物がいた場合は逃げる(RunAway)
  • 食べ物が近くにあった場合はそれを食べようとする(Eat)
  • 獲物がいた場合はそれに襲いかかる(Attack)
  • 最後に何も見つからない場合、敵や食料を求めてさまよう(Wander)

 なお、リストの上の方にあるものほど優先順序が高い。

 この4つの行動に対応したメソッド呼び出しのうち、RanAwayメソッド、WanderメソッドはKAnimalクラスに用意されているものをそのまま利用し、Eatメソッド、AttackメソッドはこのKomagomeクラスで作成したものだ。RanAwayメソッドとWanderメソッドについては前回を参照してほしい。

 では、Eatメソッド、Attackメソッドのコードを見てみよう。

private void Attack(AnimalState target) {
  if(target == null) return;
  if(WithinAttackingRange(target) && CanAttack(target)) {
    BeginAttacking(target);
    BeginDefending(target);
  } else {
    BeginChase(target);
  }
}
private void Eat(OrganismState target) {
  if(target == null) return;
  if(CanEat(target)) {
    StopMoving();
    BeginEating(target);
  } else {
    BeginMoving(target);
  }
}
AttackメソッドとEatメソッド

 それぞれの実装はほとんど共通している。つまり、食べることができない距離に目標がある、または攻撃することができないほど目標と距離がある場合は目標に近寄っていくようにしている。敵がいない場合に呼び出しているBeginChaseメソッドは、敵を追いかけるための処理である(詳細はすぐ次で述べる)。

 ここで気付いた方もいるかもしれないが、AttackメソッドやEatメソッドで呼び出しているBeginAttackingメソッドやBeginEatingメソッドは、IdleEventメソッドで呼び出しているものと重複する可能性がある。しかし、AttackメソッドやEatメソッド自体が持つ意味を考えて、あえてこのようにしている。攻撃や摂食などの“Begin〜”メソッドによる各行動の指定は、ターン内で最後に指定したものが有効になるため、わずかなオーバーヘッドは考えられるが特に問題はない。

 ここまでで大体の肉食動物Komagomeの動きは理解できただろうか。ただしこの生物はごく基本的な実装となっており、ごく基本的な行動しか行わない。実力は推して知るべし、というレベルであろうか。

 改良すべき点の例としては、IsBruntメソッドでCanWinメソッドをそのまま利用しないようにするということが挙げられる。たとえ勝てるとしても、その生物を襲うために消費されたエネルギーが、そのとき得られるエネルギーを上回ってしまってはまったく意味がない。このことも考慮に入れて判定するようにすると、より強い動物を作ることができるであろう。


 INDEX
  [連載]テラリウム徹底攻略ガイド
  第5回 KAnimalクラスを使った肉食動物の作成
     肉食動物を作成する
   肉食動物の行動パターン
     KAnimalクラスのBeginChaseメソッド
     KAnimalクラスのGetBypassメソッド
 
インデックス・ページヘ  「連載  テラリウム徹底攻略ガイド」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間