DATE: 2017/09/19(火)   CATEGORY: 未分類
秘伝のタレからの脱却~探索用歩数マップ~Part3

Part2の続きです。
今回で①について説明が終わるかと思います。


前回の記事で書いた通り
ゴール座標は全区画の組み合わせを網羅できるように定義しておくべき
ことはわかったと思います。

プログラムは自己流で書くのでよりいい書き方があれば自分で直してください。


全区画をゴール座標にできるようにするということで
ゴール座標の定義はこうなりますね。

ゴールデータ宣言


一列32マスなので,配列の各bitがx,何番目の配列かyとすることで
全ての区画にゴールフラグを設けます。


このゴール座標配列を用いるために必要な関数は2つです。

配列初期化関数ゴール座標代入関数です。

それぞれ以下のように書けますね。ついでに座標クリア関数もあると便利ですね。

各関数


これで最小限必要な準備は整いました。
次は、秘伝のタレの中身との整合性を合わせていきましょう。

基本的に秘伝のタレの歩数マップでは以下の手順を踏んでいます。

秘伝のタレ初期化部分


以降queueを用いて展開の順番を保存して歩数マップを展開していく流れです。
簡単な展開の順番の様子はこちらの記事の画像を参照してください。


さて,ゴール座標を複数置く場合どこを変更すればよいかというと
ゴール座標をqueue配列に代入するところです。

自分が書き換えるならこんな感じ。

シン・ウムオ初期化部分


これでゴール座標に0を代入し、queue配列への代入が完了しました。
あとは同様に展開するだけですね。

これだけで複数個の任意ゴールを持った歩数マップを扱えるようになると思います。



このように全区画に任意の個数のゴール座標を扱える歩数マップがあると何かと便利です。
例えば4、9マスゴールに対応させたいとなったときどうするかです。

引数に(基点となる座標、1辺の区画数)として、
基点から順にゴール座標代入関数をする関数
を作ってみましょう。

これだけで4、9マスゴールに対応させた歩数マップが完成です。
ゴール区画に入ったのにキュピキュピっと動くような
かわいらしい(笑)動きはしなくできますね。

4マス歩数マップ


また、全面探索で自分の位置から一番近い未知区画を目指したいときは
全面をスキャンして未知区画全てにゴール座標を代入、
既知区画になった座標はクリアしていくというだけで簡単に行えます。

僕はマイクロマウスの中で全面探索という考え方が
死ぬほど嫌いなので実装しませんが興味があればどうぞ。


このように、全区画をゴール座標にできるようにすることだけで
汎用性の高い仕様の歩数マップが完成したと思います。




次回では② 計算時間短縮のため自分の現在位置に到達で展開を中止
の影響について更新しようと思います。



スポンサーサイト

コメントの投稿

 管理者にだけ表示を許可する
Copyright © うむ夫の歩み. all rights reserved.