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

草食動物を作成する(3)

泉 祐介+デジタルアドバンテージ
2002/05/25

攻撃よりも摂食するかを判定するIsRequireFood

 先のIdleEventの項目で、攻撃よりも摂食を優先した方がよい場合があると書いたが、これについては次のような場合に摂食を優先することにした。

  • 生物がまだ成熟しきっていないとき。生物が成長するにはそれなりのエネルギーが必要であるし、また成熟していない状態でほかの生物と戦うのはあまり好ましいことではない。

  • 飢餓にあえいでいるとき。餓死してしまっては元も子もない。

  • 生殖活動を行っているとき。生殖には通常よりずっと多くのエネルギーを必要とするためだ。

  • 戦闘によりダメージを負ったとき。空腹の状態では動物はダメージを癒すことかできないからだ。ただし、少々のダメージ程度の場合は考慮に入れないことにした。

 ただし、うえの条件に当てはまっても、生殖活動ができない状態(IsRetireプロパティがtrueになったとき)では攻撃を優先することにした。これは先にも書いたとおり、生き残るのことをあきらめ、ほかの動物の邪魔をするためである。

 いま書いた方針を具体的なコードにすると、次のようになる。

protected bool IsRequireFood {
  get {
    if(IsRetire) return false;
    return
      !State.IsMature ||
      State.EnergyState == EnergyState.Deterioration ||
      State.IsIncubating ||
      State.PercentInjured > 0.3;
  }
}
攻撃よりも摂食を優先するかを判定するIsRequireFoodプロパティ

 IsMatureは、生物が成熟しきったときにtrueになるプロパティである。EnergyStateについてはすでに説明した。

 IsIncubatingは、その生物が生殖活動を行っているときにtrueになるプロパティである(前回に述べたように、生殖行動を開始してから出産までには10ティック以上かかる)。

 PercentInjuredは、戦闘などによってその動物がどのくらい傷ついたかを表すAnimalStateクラスのプロパティである。このプロパティは0から1までの値で、それぞれ0はその動物が無傷であることを、1は傷害により動物が死んでしまったことを表す。

オーバーライドしたKAnimalクラスのメソッド

 KAnimalクラスには、virtual宣言されているメソッドやプロパティがいくつかある。これらのメソッドには必要最低限のコードは書かれているが、必要に応じて継承した側のクラスでオーバーライドしてもらうことを意図している。

 このTabataクラスでは、WannaEatメソッドとFavSpeedプロパティをオーバーライドすることにした。

食べるかどうかを判定するWannaEatメソッド

 このメソッドは、食料が目の前にあるときに、その食料を食べるか食べないかを決めるメソッドで、食料をどのくらい残しながら食べるか(あるいは残さずに食べつくしてしまうか)といったことをコントロールするためのメソッドだ。IdleEventを記述するときにこのメソッドを使ったが、KAnimalクラス内部でも必要に応じてこのメソッドは使用される。

 仮想メソッドでは、常にtrueを返すようにしてある。つまり、目の前に食料があれば問答無用で食べてしまうというわけだ。しかし、これでは食料がなくなってしまうこともあるので、ある程度食料を残しながら食べることにした。こうしておけば植物は自然に回復して、常に食料を提供してくれる。具体的には次のとおり。

protected override bool WannaEat(OrganismState target) {
  if(target == null || IsRetire) {
    return false;
  }
  if(target.FoodChunks < plantChunks3) {
    return false;
  }
  return
    target.FoodChunks > plantChunks1 ||
    (State.PercentEnergy < 0.25 && target.FoodChunks > plantChunks2) ||
    State.IsIncubating ||
    State.EnergyState == EnergyState.Deterioration;
}
食べるかどうかを判定するWannaEatメソッド

 最後のreturn文では、対象となる生物(ここでは植物)のFoodChunksを成長具合の指標として利用している。plantChunks1とplantChunks2はTabataクラスで用意した定数値だ。

移動速度を決定するFavSpeedプロパティ

 IdleEventのところでも述べたが、このプロパティは移動におけるデフォルトの速さを示す。

 KAnimalの仮想メソッドでは、動物が持っているエネルギー量(満腹度)に応じて速さを指定するようにしている。動物が移動する際にはエネルギーを消費するが、消費するエネルギー量はその動物の半径、移動の速さ、移動距離にそれぞれ比例する(ちなみに、比例定数はEngineSettings.RequiredEnergyPerUnitOfRadiusSpeedDistanceで定義されている)。従って、生物の半径が同じであれば、同じ距離を移動する場合でも、速く移動すれば速く移動するほど大きなエネルギーを消費することになる。そのため、エネルギーをたくさん持っているときはある程度速く移動するようにし、エネルギーがあまりないときは移動の速さを抑えるようにするのも1つの作戦である。

 参考までに示すと、KAnimalクラスでのコードは次のようになっている。これは、「Terrarium開発ガイド」の「生物の速度をコントロールするには」という項目を参考にして記述したものである。

virtual protected int FavSpeed {
  get {
    switch(State.EnergyState) {
      case EnergyState.Full:
        return (int)(Species.MaximumSpeed * .7);
      case EnergyState.Normal:
        return (int)(Species.MaximumSpeed * .5);
      case EnergyState.Hungry:
        return (int)(Species.MaximumSpeed * .4);
      default:
        return (int)(Species.MaximumSpeed * .25);
    }
  }
}
Terrarium開発ガイド」にある移動速度を決定するためのFavSpeedメソッド

 一方、このTabataクラスでは、このプロパティの定義を次のように変更した。

protected override int FavSpeed {
  get {
    switch(State.EnergyState) {
      case EnergyState.Full:
        return 8;
      case EnergyState.Normal:
        return 8;
      case EnergyState.Hungry:
        return 10;
      default:
        return 2;
    }
  }
}
Tabataクラスで定義したFavSpeedメソッド

 「属性によるポイント配分」の項で指定した速度に基づいて、KAnimalクラスで実装されているFavSpeedの値を計算すると、満腹時の速さはおよそ14前後になるのだが、うえのコードではそれよりもかなり小さい値を指定している。これは、腹が満たされている間はできるだけ体力を温存しておくためだ。一方、空腹のときはなるべく速く食料にありつけるように、少し大きめの値を設定した。しかし、飢餓状態のときは、あまり速く移動してしまうと餓死してしまうので、設定可能な最小の値(=2)にし、エネルギーの消費を極限まで抑えることにする。


 INDEX
  [連載]テラリウム徹底攻略ガイド
  第4回 KAnimalクラスを使った草食動物の作成
     KAnimalクラスとは
     草食動物を作成する(1)
     草食動物を作成する(2)
   草食動物を作成する(3)
     KAnimalクラスのプロパティとメソッド
     KAnimalクラスで処理しているイベント(1)
     KAnimalクラスで処理しているイベント(2)
 
インデックス・ページヘ  「連載  テラリウム徹底攻略ガイド」


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 記事ランキング

本日 月間