
猫が迷路の中でチーズを探し回るゲームを作る3回目。今回は主人公猫のネコチンと虫が、迷路の壁を通り抜けられないようにするプログラムを追加する。
ネコチンの邪魔をする幽霊は迷路の壁を自由に通り抜けられる設定だが、ネコチンと虫は迷路の壁を通り抜けられない。このアルゴリズムはどう作るのだろう?
ネコチンが壁に接触したらどうなる?
迷路をスプライトで作ったので、ネコチンと迷路はスプライト同士だから、接触したかどうかの判定ができる。迷路が背景の絵であったらこの判定ができない。と、私は理解した。
先に作ったネコチンのプログラムでは、方向キーを押すと、その方向に向かってネコチンが5ステップ進むようにしてある。
もしネコチンが迷路の壁に触れた場合、ネコチンはどのように動けば良いのだろうか?その場で停止すれば良いのか?
ちょっと細かく見てみる。ネコチンが5ステップ進んで壁に触れた瞬間、もしその場で停止したとしたら、ネコチンは壁に触れたままの状態で停止しているので身動きできないからゲームを進められない。
そこでネコチンが5ステップ進んだのだから5ステップバックさせてやれば、ネコチンは壁に接触する直前に戻ったことになるので、方向を変えてやれば先に進める。
簡単な理屈のアルゴリズムだが、教科書の説明を読んで私は感心してしまった。アルゴリズムというのは、瞬間の動きをスローモーションのように分析して作り出すものなのかと思った。
具体的なプログラムは、「if ~」コマンドに「touching ~ ?」というセンサーコマンド(sensingグループのコマンド)を組み合わせて、「if touching maze ?」と、「もし迷路に触れたら」というブロックを作り、そのブロックの中に「move -5 steps」を入れる。

(写真:ネコチンが壁に触れたら5ステップバックするブロックを作る)
できたif以下のブロックを4つの方向キーの操作のifブロックの中にそれぞれコピーする。
これで4つの方向キーのどれを押しても、もし壁に触れたらネコチンが壁に触れる直前の位置に戻ることができる。

(写真:4つの方向キー全てで、ネコチンが壁に触れたら元の位置に戻れる)
虫も壁に接触したら左右どちらかに方向転換させる
ネコチンは主人公なのでプレイヤーが方向キーで操作するが、虫は邪魔する側なので自動で動き回らなければならない。
「forever ~」ブロックの間に「move 5 steps」を挟めばゲームが終わるまで虫は動き続けることができるが、虫は幽霊みたいに壁を通り抜けられないので、ネコチンと同じようなアルゴリズムで壁に接触する直前の位置に戻り、自分で方向転換できるようにしなければならない。
虫のプログラムは次のようになる。
先ず、ゲーム開始時にサイズの縮小と位置座標と向きを指定する。
サイズは15%、位置はネコチンの対角の位置で迷路の右下隅のX205,Y-135、向きは右向きに指定する。
次に「forever ~」の中に「move 5 steps」を入れる。その後に「if ~ 」と「touching maze ?」を組み合わせて、「もし迷路に触れたら」を作り、その中に「move -5 steps」を挟んでバックさせて元の位置に戻させる。
この後に、更に「if ~ else ~」と「pick random 1 to 2 = 1」を組み合わせて、1か2をランダムに発生させ、左右のどちらかに90度向けさせるようにした。
これで、虫はゲームの間5ステップ進みながら、壁に触れたら方向を左右どちらか90度向きを変え、さらに進み続けるという自動化プログラムができた。

(写真:虫の自動化プログラム。迷路に触れたら元の位置に戻て方向転換)
参考文献:
コメント