マイクロマウス マップエディタ+シミュレータ これは、マイクロマウスの迷路探索アルゴリズムのデバッグ用シミュレータです。 C言語でマウスの行動プログラムを記述して、迷路を走行させることができます。 §1. 動作環境について tcl/tk 8.3 とリンクした WildC++ インタプリタが必要です。 WildC++ とは、CERN の CINT と tcl/tk を組み合わせたもので、CINT の一部 として公開されています。CINT 作者の後藤さんにお願いして、最新の tcl/tk 8.3 対応版の Windows バイナリを作っていただきました。 この場を借りてお礼申し上げます。 UNIX では、新しい tcl/tk とのリンクできないような話を聞いています。 がんばってください。 Macintosh にも CINT や tcl/tk はあるので、WildC++ も作れるかもしれません。 CINT を利用したおかげで、ユーザのプログラムはいちいちコンパイルするこ となく、本シミュレータにロードするだけで即実行できます。 そしてほぼ完全な C / C++ が使えます。 tcl/tk を利用したおかげで、安井さん作のマウスマップエディタを流用する ことができました。マップデータも当然互換です。 §1-1. Windows での準備 tcl/tk をインストールします。ActiveState のでもそうでないのでも結構です。 インストール先はデフォルトの C:\Program Files\tcl にしておいて下さい。 CERN から cint のソースを持ってきて C:\cint に展開します。 さらに、cint のバイナリも持ってきて C:\cint に展開します。 さらに、wildc のバイナリパッケージを展開します。 §2. 操作方法 mousesim.tcl を開くと起動します。 tcl/tk では、メニューはすべてメニューバーから切り離すことができます。 よく使うメニューは切り離してボタンバーのように手許においておくと便利です。 データ変更後にセーブしていないから終了時に確認するとか、普通のアプリケー ションならやっているフラグ処理を手抜きしています。そのあたりは自分で気 をつけて下さい。 §2-1. マップエディタとしての使い方 赤い小さな丸が柱です。 柱と柱の間をクリックすることで壁が出たり消えたりします。 赤い "S" がスタート位置、緑の "GOAL" がゴールです。 ・ファイルメニュー New Map : マップの内容を立ち上げ時のようにまっさらにします。 Load Map File : .map のマップファイルを読み込みます。 Save Map File : 現在のマップの内容をファイルにセーブします。 Name Map : 右上に表示される、マップのタイトルを指定します。 タイトルもマップファイルに保存されます。 Export As Text : アスキーアートでマップの形状をファイルに書き出します。 この形式は読み込めませんので注意して下さい。 Quit : シミュレータを終了します。 ファイル選択ダイアログをダブルクリックで抜けると、なぜか二つめのクリックが もう一度認識されてマップを汚すことがあるので注意して下さい。 §2-2. マウスのプログラムを記述する マウスのプログラムは C, C++ で記述できます。 そのまま実機で使えるプログラムのシミュレートができるように考えています。 一つの .c ファイルで、以下の関数を定義して下さい。static 変数も使えます。 void MouseInit(); /* シミュレーションのリセット時に呼ばれます。 マップデータの初期化などをここで行って下さい。 */ Action MousedoAction(); /* 行動判断の本体です。関数の返り値として、 enum Action { Step, TurnLeft, TurnRight, TurnBack, End }; で今からの行動を指示します。 main 関数は入れられないので、「ターンして前進」のような 複数の行動も、一つずつ順番にシミュレータ側に渡すように 工夫する必要があります。 */ void MouseBring2Start(); /* 探索完了時にその場で停止するタイプのマウスを、 スタート地点に戻す操作をしたときにこの関数が呼ばれます。 現在位置のリセットなどを行って下さい。 */ void MouseUserCmd(int cmd); /* デバッグ情報の出力や内部モードの切り替えなど、 ユーザが自由に定義できるコマンドの入り口です。 cmd には 1〜5 が入ります。 */ マウスプログラムからは、次の関数が利用できます。 int senseForward(); int senseLeft(); int senseRight(); /* それぞれの方向の壁のあるなしをセンスします。 壁があると 1, 無ければ 0 を返します。 */ void MousePuts(char *message); /* デバッグ情報などをログウィンドウに出力します。 ユーザコマンドと組み合わせるといろいろ使えるでしょう。 数値を出力するには sprintf で文字列に自分で変換して下さい。*/ 動作ログに混ぜなくてよいデバッグ情報なら、普通の printf を使って コンソールに出力させることもできます。こちらの方が使いやすいでしょう。 §2-3. マウスシミュレータとしての使い方 ・Simulation メニュー Load Program : マウスプログラムをロードします。 Reload Program : 先にロードした同じプログラムをロードしなおします。 デバッグのときに重宝するでしょう。 Reset Simulation : シミュレーションの状態を初期化します。 MouseInit() を呼びます。 Bring to Start : マウスをスタート位置に連れ戻します。 MouseBring2Start() を呼びます。 マップ中の青い三角がマウスの現在位置です。 Step ボタンを押すたびに MousedoAction() が呼ばれて、マウスが動作します。 Run/Stop ボタンで、連続実行/停止ができます。 動作のログとマウスからのメッセージが右下のログウィンドウに表示されます。 また、歩数などのカウントが右中のステータスウィンドウに表示されます。 シミュレーションの最中でもマップの書き換えはできてしまうので注意して下さい。 ・UserCmd メニュー このメニューで、ユーザコマンドを呼び出すことができます。 マウスのモードを探索と最短距離走行に切り替えたり、 内部状態をログウィンドウに表示したりという操作はここに定義します。 ・Log メニュー Save Log : ログウィンドウの内容をファイルに書き出します。 Clear Log : ログウィンドウの内容を消去します。 §3. TO DO とか 動作が遅いです。特にプログラムの立ち上がりが。CINT は、インタプリタで 実行するだけでなく、コンパイルしたコードを取り込むこともできるので、 tcl/tk の呼び出しも含めてネイティブコード化することで格段にスピードアッ プするはずです。 某シミュレータのような1マス未満の移動や90度未満の旋回も、今後サポート するべきでしょうか。ソースで公開するので適当にやってもらって構わないの ですが、プログラミング言語に相当の造詣がないと、WildC++ のコードを触る のは危険でしょう。理不尽なバグがてんこもりです。 # 斜め前の壁のセンスとか、前方80cmまで見渡せるPSDを装備したマウスのアル # ゴリズムなど、考えればきりがありませんね... §4. 配布条件 GPL に沿って扱って下さい。 作者へのメールや jwiki への書き込みでフィードバックを頂けると幸いです。 §5. 関連サイトへのリンク CINT とか ROOT とか tcl/tk マップエディタの作者の安井さん このシミュレータの作者のおおくぼ