自律エージェントと遊ぼう!

 これは Tips ではなくちょっとしたお遊びで、 学生時代に作ったもので暇つぶしでもして頂こうというものです。 JavaScript を勉強し始めた方には、役に立つところもあるかもしれません。

 自分で次の行動を決断し、勝手に動き回るものを自律エージェントといいます。 かなり乱暴な言い方ですがだいたいそんなものだと思ってください。 ここでご紹介するのはそんな自律エージェントの1つで、「SR Mario」といいます。 なぜそういうかは知りません。人工知能のテキストにそう書いてあったのでそう呼んでいます。

 実際に遊びながら説明を読んで頂く方がわかりやすいかもしれません。

SR Mario

 上のリンクを開くと、新しいウィンドウにごちゃごちゃしたものが表示されると思います。 画面サイズは少なくとも 1024x768 で、ウィンドウを最大化できないと辛いです。 それぞれにヘルプが付いていますので、詳しい使い方はそちらをご覧ください。 このページでは SR Mario の動作についてだけ説明します。

 さて、SR Mario は、右側の領域にあるステージ上を歩き回るエージェントです。 ステージは周囲を壁で囲まれた 10x10 マスのフィールドです。

SRMario
SR Mario とその周辺

 SR Mario SRMarioは、 真正面 (F) とその左 (L) 右 (R) の合計3マス分を見て、 そこに壁があるかどうかを見分けることができます。 SR Mario の真左や真右、後方のマスの壁の有無は彼の行動には影響を及ぼしません。 このとき、壁の有無を3カ所について調べるので 23 = 8 通りの状態が考えられ、 それぞれ以下のように次の行動を決定します。

SRMario
1. 前方 (L,F,R) すべてに壁がなければ、直進する。

SRMario
2. 真正面 (F) のみに壁があれば、その場で右に向きを変える。

SRMario
3. 正面左 (L) のみに壁があれば、直進する。

SRMario
4. 正面右 (R) のみに壁があれば、直進する。

SRMario
5. 真正面とその左 (F,L) に壁があれば、その場で右に向きを変える。

SRMario
6. 真正面とその右 (F,R) に壁があれば、その場で左に向きを変える。

SRMario
7. 正面左と正面右 (L,R) に壁があれば、 (ちょっと狭いのが気にくわないのか)その場で右に向きを変える。

SRMario
8. 前方 (L,F,R) すべてに壁があれば、その場で右に向きを変える。

 ここでいう向きは SR Mario の相対的な向きなので、 たとえば画面の右を向いているときに上記 2 の状況になれば、 SR Mario はその状態から右向け右をして画面下を向くことになります。

 8通りもの状態を判別するのは面倒に思うかもしれませんが、 結局次の行動としては前に進むか左を向くか右を向くかの3通りしか無いので、

  if (...)
    ...
  else if (...)
    ...
  else
    ...

の最低3段があれば良いのです。 実際どうなっているかはソースをご覧ください。

 このように、SR Mario は基本的には直進し、壁に当たると右を向きたがり、 左のみが空いていれば左を向く、(そして狭いところは通りたがらない;)という単純な性格の持ち主です。 それでも、多くの場合うまく障害物をさけ、立ち止まらずに動き続けます。 同じ道をぐるぐる歩き続けることは良くありますが。

 しかし、あるパターンに遭遇すると、SR Mario はその単細胞さをさらけ出し、 1つのマスから移動できず無様に足踏みをし続けることになります。 この状態を「にわとり」といい、そうなることを「にわとりになる」といいます。 なぜそういうかは知りません。人工知能のテキストにそう書いてあったのでそう呼んでいます。 どういったときにそうなるのか、これを探し出してみるのもおもしろいかもしれません。

 以上で SR Mario に関する説明はおしまいです。 あとはひたすら彼を歩き回らせて楽しんでください。

 そうそう、イースターエッグ(隠しメッセージ)も用意されています(笑)。 ヒントは、「SR Mario が困るようなことをする」です。 2種類ありますので探してみてくださいね。 (JavaScript のソースを見ればすぐ分かってしまいますが・・・)

 なお、外部 JavaScript ファイルにコメントを付記したテキストファイルを以下に用意しました。 もしスクリプトに興味がおありなら参考にしてください。

JavaScript ソース(コメント付き)

 あまり普通の Web ページを作る際にはオブジェクトまでは作ったりしないと思うので、 そういった意味で結構 JavaScript の底力を引き出していると思います(笑)。 アルゴリズムは上の説明を参考に自力で紐解いてください。 決して説明すんのが面倒くさいとか実は書いた本人も良く覚えていないとかではなく、 教えないほうが勉強になると考えたからです(泣