マイクロマウス マップエディタ+シミュレータ これは、マイクロマウスの迷路探索アルゴリズムのデバッグ用シミュレータです。 C言語でマウスの行動プログラムを記述して、迷路を走行させることができます。 §1. 動作環境について WildC++ インタプリタの動作する Windows および UNIX で稼働します。 Macintosh にも CINT や tcl/tk はあるので、WildC++ も作れるかもしれません。 WildC++ とは、CERN の CINT と tcl/tk を組み合わせたもので、CINT の一部 として公開されています。ただ、WildC++ の実行環境は、どうも最近コードが メンテナンスされていないのか、少なくとも Windows 版は普通にはコンパイ ルできないようです。CINT の解説ムックの CD-ROM に付属していたバイナリ を同梱しますので、これを使用して下さい。(どなたか最新のソースを最新の 処理系でコンパイルして公開して頂けるととてもありがたいのですが...) UNIX でも、新しい tcl/tk とはリンクできないような話を聞いています。 古いバージョンを探して頑張って下さい。 CINT を利用したおかげで、ユーザのプログラムはいちいちコンパイルするこ となく、本シミュレータにロードするだけで即実行できます。 そしてほぼ完全な C / C++ が使えます。 tcl/tk を利用したおかげで、安井さん作のマウスマップエディタを流用する ことができました。マップデータも当然互換です。 §1-1. Windows での準備 tcl/tk をインストールします。 インストール先は C:\tcl にしておいて下さい。 さらに wildc.tgz を C:\wildc に展開します。 mousesim.tk と mousesim.wc を適当なディレクトリに置き、 mousesim.tk をエクスプローラで開こうとすると何で開くか聞いてくるので、 C:\tcl\bin\wish41.exe で常に開く、と教えてあげます。 §2. 操作方法 tcl/tk では、メニューはすべてメニューバーから切り離すことができます。 よく使うメニューは切り離してボタンバーのように手許においておくと便利です。 データ変更後にセーブしていないから終了時に確認するとか、普通のアプリケー ションならやっているフラグ処理を手抜きしています。そのあたりは自分で気 をつけて下さい。 セーブファイルを指定するダイアログも手抜きしているので、重ね書きの確認 をしません。また、今のディレクトリがどこか表示されません。ロードファイ ルのダイアログではディレクトリ移動もできますが、移動はせず、mousesim.* の置いてあるディレクトリでそのまま作業することをお勧めします。 §2-1. マップエディタとしての使い方 赤い小さな丸が柱です。 柱と柱の間をクリックすることで壁が出たり消えたりします。 赤い "S" がスタート位置、緑の "G" がゴールです。 ・ファイルメニュー 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 で文字列に自分で変換して下さい。*/ §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 マップエディタの作者の安井さん このシミュレータの作者のおおくぼ