連載

テラリウム徹底攻略ガイド (改訂版)

第6回 より高度な障害物回避


泉 祐介+デジタルアドバンテージ
2003/05/10
Page1 Page2 Page3 Page4

本稿は、以前の連載を大幅に加筆・修正し、Terrarium Ver1.1に対応したのもです

 前回前々回と、テラリウム動物をプログラミングする上で必要となる基本処理についてはだいたい述べた。第6回目となる今回は応用編として、生物が移動する際の障害物回避について取り上げる。

 テラリウムにおいて、障害物を回避して移動できるようになることの重要性は、すでに動物プログラミングを始めている人にとっては説明しなくても理解してもらえるだろう。エサを食べるために死体に近づこうとした場合や、敵から逃げようとした場合に、途中で植物のカドに引っかかって進めなくなってしまい、仕方なくランダムにさまよい始める。単純にBeginMovingメソッドで目標に向かって一直線に進んでいれば、これはよくあることだ。しかし、確実かつ迅速に獲物にありつき、あるいは敵から逃げ延びることがいかに重要であるかもまた、説明するまでもないだろう。むしろ、し烈を極めるEcosystemにおいては、障害物を回避しての移動は必須の処理ともいえる。

 簡易な障害物回避の方法については、すでに前回で肉食動物を作成したときに解説している。だがこれは、障害物にぶつかったら向きを変えて少しずれてみるという至極単純なやり方だった。今回は、障害物にぶつからずにわきをすり抜け、目的とする場所に辿り着けるような、よりインテリジェントで高度な障害物回避アルゴリズムを考え、実装してみる。

障害物の扱い方

 具体的な障害物回避アルゴリズムの話に入る前に、本アルゴリズムにおける障害物の扱い方についてまず解説しておく必要がある。

 生物は8ピクセル単位のグリッド(格子)を単位とした正方形の領域を占有するということは、前回の「KAnimalクラスのGetBypassメソッド」のところで述べた。従って、生物、あるいは障害物はすべて正方形の形状をしたものとして扱うことができる。

 ところで、実際に障害物をよけて移動するときには、当然のことながら自分自身の大きさも考慮してよける必要がある。例えば、下の図で示しているように、障害物のすぐ横を通るようなときも、障害物の少し外側を通るような指示をしなければならない。

障害物をよける(1)
自分自身の大きさがあるため、障害物のすぐ横を通るような場合であっても、障害物の少し外側を通るように指定する必要がある。

 また、その下の図のように、障害物と障害物との間隔が自分の大きさよりも狭いときには、その隙間を通り抜けることができない。

障害物をよける(2)
障害物と障害物との間隔が狭すぎると、隙間を通り抜けることができない。

 しかし、自分自身の大きさを常に考慮するというのは実に面倒である。そこで、障害物のまわりに、自分自身の半径の分だけ通行できない部分があるものとして考える。すると、その通行できない部分のすぐ横を通るように指示すれば、生物は障害物のすぐ横を通ることになる。また、図では示していないが、障害物と障害物の間隔が狭ければ、その隙間がお互いの通行できない部分によって覆われてしまうため、自分の大きさを考えなくても、その障害物同士の隙間を通ることができないことが分かる。

通行できない部分
障害物のまわりに、通行できない部分があるものとして考える。その通行できない部分のすぐ横を通るような経路を指定すれば、生物は障害物のすぐ横を通るようになる。

 結局、障害物のまわりに通行できない部分があると考えれば、自分自身の大きさを考えなくても済むということがいえる。以後、障害物が占める領域と通行できない部分とを合わせた領域を、「障害領域」と呼ぶことにする。


 INDEX
  テラリウム徹底攻略ガイド (改訂版)
  第6回 より高度な障害物回避
   障害物の扱い方
     障害物回避のためのアルゴリズム
     障害物回避アルゴリズムの実装
     KAnimalクラスにあるメソッドのオーバーライド
 
インデックス・ページヘ  「テラリウム徹底攻略ガイド(改訂版)」


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

本日 月間