買い物に行くプログラム
さて、3ページ目はカップ麺や猫でなく、もうちょい難しい事をしてみたい。そこで、スタート地点からゴールまで移動する為のフローチャートを作ってみた。
荒野にロボットを放り出して自動でゴールに向かわせる、みたいな事だ。
左のアイコンがスタート、右のゴールはイトーヨーカドーです。
スタートは西葛西8丁目のミニストップ。そこから、1.7kmほど東にあるイトーヨーカードに行く。
移動の為のルールはフローチャートで書いて僕がその通りに行動するわけだ。そのフローチャートだけど、例えば北に50m進んで90度曲がって東に500m進む、とかそういう風にルートを細かく書く方法だと書くのも面倒くさいし予定と違う場所があるとそこで終わってしまう。もう少し柔軟な方法を選んでみたい。
そこで、乱数とゴールまでの距離を使ったフローチャートを作ってみた。
それがコレ。
サイコロで歩く方向を決める
地図に沿ったフローチャートを書くのは大変だし不測の事態に対処出来なくなってしまうので、サイコロにゆだねる方法を取ってみた。まず、最初にサイコロを振って進む方向を決める。
1が北で、2が東、3が南、西は4だ。5か6が出たら振り直し。それぞれ10歩その方向へ進む。
進んだ先で、目的地までの距離を測って、近づいたかどうか判定する。進んだ方向が正しかったか距離で評価するのだ。近づいてなければ180度回転して、進んだのと倍の距離を進む。つまり、サイコロを振ったところから逆に10歩進んだのと同じになる。これで多分近づける。
もし距離が縮まっていたら、それは正しい方向なので更に進む。距離が0になるか(つまりゴールで終了)、逆に離れてしまうまでは同じ方向に進み続けられるわけだ。
距離が0になったらゴール。判ってみれば簡単なルールでしょう?問題は、サイコロでいい目が出るかどうかなんだけど。
歩く処理はこうなってます
10歩歩く部分が定義済み処理の図形になっていたので気になっている人もいるかと思うので、歩く部分のフローチャートも書いた。
1歩ごとに進めるか判断して、進めるなら1歩進んで決められた歩数に達していたらそこで終わり。
もし進めなかったら歩数分歩いてなくても終了。この、「進めるか?」をコンピュータに判断させると難しいのだけど、そこは僕は人間なので自分で判断してしまうという中途半端さだ。
基本的に、柵がある、車がビュンビュン走ってる、水、谷、建物、私有地などにぶつかったら止まる仕組みです。
地味な画像が続いてすみません
白黒画像が続くと、どうにも「新春☆」という雰囲気でなくなってしまうので写真など載せつつ記事を前に進めていきたい。
スタートはミニストップ。なぜミニストップかと言うとミニストップに住んでいるという訳ではなくて、流石にGPSのログを載せるので家からスタートは出来なかったという訳です。
さて、フローチャートを印刷して、サイコロやコンパス、iPhoneを準備した。なぜiPhoneを使うのかというと、ゴールまでの距離を測るのに使うのです。
ゴールまでの距離はiPhoneで計測
毎度の手前味噌だけど、拙作iPhoneアプリのDIY GPSは設定した目的地までの距離と方角を表示する機能がある。ついでに、「自作iPhoneアプリで楽々GPS地上絵」を書いた頃から大分バージョンアップして、GPSのログも取れるようになった。
やはり結果をGPSログで見てみたいし、目的地までの距離も判るし便利ということで自作アプリを使うことにした。
葛西の地図と座標を設定して、イトーヨーカドーに目的地マークを付けたら準備完了。
さぁ、サイコロを振ろう。
最初のサイコロは、3。つまり南へ進む
サイコロを振って出た目は3だった。3は南なので南へ10歩進んだ。しかし、ここで早速フローチャートに問題が見つかった。
10歩進んでも、距離の表示が変わらないのだ。
スタート地点からゴールまでの最初の距離が1.63km。10歩南に歩いても距離が全然変わらなかった。そうだった、残り距離が1km以上の場合はkm表示で小数点2位までだから、10m単位で距離が変わらないと表示上は見えないのだった。
これは困った。普通、コンピュータならここで終わりである。近づいていないので180度回転して20歩戻る。それでも多分距離は変わらないから、サイコロを振ってまた10歩歩いて距離が変わらない、というのを延々続けることになる。
表示が10m単位である以上、一度の移動で10mの単位で動けるように修正しなくては。
歩く歩数を3倍にした
10歩じゃ距離が変わらず無限ループな感じになってしまったので、歩数を3倍の30歩にした。これなら10mくらい歩けるので大丈夫だろう。
こうやって実際に動かしてみて(テスト)問題(バグ)が出たら直す(デバッグ)というのはプログラム開発ではよくある事だ。
通常客先や現場でのプログラム修正は推奨されませんが。
30歩進んだら距離が縮まった。距離が縮まった場合はそのままの方向で進み続けられるので、ひたすら南に進んだ。左の画像、左寄りにある紫色の線が移動した軌跡で、赤い矢印が現在地だ。
この調子で進み続けた結果、南に行き過ぎてしまった。
中左近橋の交差点を過ぎ、そのまま南へ進んだら今度は逆に距離が離れてしまったので180度回転して元に戻った。交差点のところで東の目である2が出れば結構一直線にイトーヨーカドーを目指せたのだけど、出た目は1。北だ。
どういう訳か戻る事になってしまった。サイコロめ・・・。
GPSの更新頻度の関係もあるのだろうが、存外に戻らされてしまった。渡った橋を戻ってそこでサイコロ。出た目は2、東だ!基本的にイトーヨーカドーは東方向にあるので、2が多く出ればそれだけ早く進めるし、早く撮影も終わる。
ぐずぐずしてたら日が暮れてしまうので、出来れば東にぐいぐい進んで終わらせたい。
川にぶつかり、進めない
しかし真東には進めなかった。中左近川という川があったのだ。中左近川は蛇行しながら葛西を東西に横切る川で、どうにも僕の進行方向と重なってしまったのだった。
進めなくなった場合は戻ってサイコロを振り直すルールだ。何度かサイコロを振ったり戻ったりしながら、ジワジワと中左近川のほとりを進んだ。
ジワジワ進む
北に進んだり南に戻ったり、東にちょっと進んで川にぶつかったりしながらジワジワと東に進んだ。この調子なら暗くなる前にイトーヨーカドーにたどり着けるかも知れない。
是非とも明るいうちに着きたい。じゃないと撮影が出来なくなってしまうし寒い。新年早々風邪引くのはゴメンだ。
何度サイコロを振り、何度同じところを戻り、何度無駄に歩いたか。それでも距離を見ながら判定していくと徐々に近づいていった。
北に行き戻り、南に進んで西に進んで東に進んで、とごちゃごちゃ迷走を続けていたらなんの奇跡か、イトーヨーカドーに向かう真っ直ぐな道に入ることが出来た。乱数は時に奇跡を生む。
東に進む。距離が縮まったらそのまま進んでいいルールなので、どんどん東へ進む。ゴールがすごい勢いで近づいてくる。
そう思いながら歩いていたらお腹が減ってきてしまいましてね。
次のページでは、自我を持ったコンピュータの反乱が起こるのであった。ターミネーターの世界で言う、「審判の日」だ。