• ベストアンサー

迷路探索プログラムを作るにはどうしたらいいですか??><;

Interestの回答

  • ベストアンサー
  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

ANo.2=Interestです。 コードを見てピンと来ました。それ持ってます。谷口さんという方が書かれたマイクロマウスシミュレータ(シェアウエア)ですよね。私もそのシミュレータを使ってマイクロマウスの迷路探索アルゴリズムの動作検証をしています。 昨年そのシミュレータで、左手法、拡張左手法、ポテンシャル法の3通りのアルゴリズムを実装して、3通りとも正しく動作することを確認しました。ソースコードの量がここで紹介するにはちょっと多すぎるので、考え方を示すためにソースコードの一部だけ紹介します。 // ---------------------------------------------------------------------------- // << private >> // 関数 simpleLeftHandMethod // 概要 単純な左手法で迷路解くためのマウスの動作を作る。 // // 引数 *this ナビゲータのオブジェクト // *cart 台車オブジェクトへのポインタ // 戻り値 なし // // [ 左手法の簡単な説明 ] // 左、前、右、後ろの順に優先順位をつけて壁をチェックして移動する。 // ---------------------------------------------------------------------------- void simpleLeftHandMethod(Navigator *this, Cart *cart){ CartCommand command; CartCommand command2; //前方、左側、右側は、マウスの進行方向に向かってみた場合 if( FALSE == Cart_getLeftWall() ){ // 左側に壁がなければ左を向く。 command.action = CART_TURN_LEFT; command.volume = 90; Cart_setCommand( cart, command ); Navigator_updateDir( this, 90 ); } else if( FALSE == Cart_getFrontWall() ){ // 前方に壁がなければそのまま。 } else if( FALSE == Cart_getRightWall() ){ // 右側に壁がなければ右を向く。 command.action = CART_TURN_RIGHT; command.volume = 90; Cart_setCommand( cart, command ); Navigator_updateDir( this, -90); } else{ // 三方向に(左側,前方,右側)に壁があるのでUターンする。 command.action = CART_TURN_180; command.volume = 0; Cart_setCommand( cart, command ); Navigator_updateDir( this, 180 ); } // 何はともあれ、前に進む。 command2.action = CART_MOVE_BLOCK; command2.volume = 1; Cart_setCommand( cart, command2 ); Navigator_updatePos( this, command2.volume ); } // ---------------------------------------------------------------------------- // << private >> // 関数 extendLeftHandMethod // 概要 拡張左手法で迷路解くためのマウスの動作を作る。 // // 引数 *this ナビゲータのオブジェクト // *cart 台車オブジェクトへのポインタ // 戻り値 なし // // [ 拡張左手法の簡単な説明 ] // 基本的な考え方は単純左手法と同じだが、初めてきた区画の周囲に来たことが // ある区画がある場合は”仮想壁”を設ける。 // // ---------------------------------------------------------------------------- void extendLeftHandMethod(Navigator *this, Cart *cart){ uchar x, y; MouseDir dir; uchar wallData; CartCommand command; CartCommand command2; x = Navigator_getPosX(this); y = Navigator_getPosY(this); dir = Navigator_getDir(this); wallData = 0; Navigator_updateVirtualWall( this, cart); // 仮想壁を記録する。 // 以降の処理は仮想壁を利用して単純左手法と同じアルゴリズムでよい。 wallData = Map_getVirtualWall(this->map, x, y); // 左側に壁がなければ左を向く。 if( ((NORTH == dir) && !(WEST_WALL_MASK & wallData)) || ((EAST == dir) && !(NORTH_WALL_MASK & wallData)) || ((SOUTH == dir) && !(EAST_WALL_MASK & wallData)) || ((WEST == dir) && !(SOUTH_WALL_MASK & wallData)) ){ command.action = CART_TURN_LEFT; command.volume = 90; Cart_setCommand( cart, command ); Navigator_updateDir( this, 90 ); } else if( // 前方に壁がなければそのまま。 ((NORTH == dir) && !(NORTH_WALL_MASK & wallData)) || ((EAST == dir) && !(EAST_WALL_MASK & wallData)) || ((SOUTH == dir) && !(SOUTH_WALL_MASK & wallData)) || ((WEST == dir) && !(WEST_WALL_MASK & wallData)) ){ } else if( // 右側に壁がなければ右を向く。 ((NORTH == dir) && !(EAST_WALL_MASK & wallData)) || ((EAST == dir) && !(SOUTH_WALL_MASK & wallData)) || ((SOUTH == dir) && !(WEST_WALL_MASK & wallData)) || ((WEST == dir) && !(NORTH_WALL_MASK & wallData)) ){ command.action = CART_TURN_RIGHT; command.volume = 90; Cart_setCommand( cart, command ); Navigator_updateDir( this, -90); } else{ // 三方向に(左側,前方,右側)に壁があるのでUターンする。 command.action = CART_TURN_180; command.volume = 0; Cart_setCommand( cart, command ); Navigator_updateDir( this, 180 ); } // 何はともあれ、前に進む。 command2.action = CART_MOVE_BLOCK; command2.volume = 1; Cart_setCommand( cart, command2 ); Navigator_updatePos( this, command2.volume ); } 設計はオブジェクト指向ですが、実装はCです。 Navigatorの責務  迷路の壁情報と通過回数を保持・更新します。  迷路内でのマウスの位置、方向を保持・更新します。 Cartの責務  前進、ターンなど与えられた走行コマンドを実行します。

sachinnexv
質問者

補足

お返事がおそくなってすみません(汗) 書いてあるプログラムがなんなのか調べてみました。書いてある意味はわかったのですが、このままコンパイルすると未定義のシンボルNavigatorがエラーとでてうまくいきません。どうしたらいんでしょうか?

関連するQ&A

  • ”Java”か”Javascrip”を使用して迷路探索・・・

    JavaまたはJavascriptを使い迷路探査するようなソフトウェアロボット?(意味が違うかもしれません・・・)を作成したいのですが、JavaとJavascriptではどちらがこのようなプログラムを作るときに向いてますでしょうか?ちなみに自分はホームページ作成とC言語をほんの少し学んだ程度なので、いったいどうやったらよいのか・・・本当に困っています。 プログラム内容としては  (1)画面上に(5×5)マスの迷路を作成  (2)ロボット?を画面上で動かすとして前後左右に動  き自ら判断して進んでいく  (3)出口で停止する  (4)迷路のパターンを変えても作動していく 上記の内容なのですがどなたかおわかりなりますでしょうか?

  • チンプンカンプンT_T

    昨日からプログミングをやろうと思い立ち、いろいろ調べてみたのですが、どうも上手くいきません・・・ OSはWINのMe 言語はC++でBorland C++をインストールしました! これだけでできるのですか? 特にコマンドプロンプト(MS-DOSプロンプト)がわかりません。 C:>windows とでてきて・・・ 教えてください・・・

  • C言語を始めて5日目なのですがプログラムを見るとどれがどういう風に動い

    C言語を始めて5日目なのですがプログラムを見るとどれがどういう風に動いてるのかわかるのですが 自分でプログラムを組むとなると何も出来ません。 自分でプログラムを組むにはどういうやり方をすれば自分でプログラムを書けるようになるんでしょうか? 経験者の皆様ご協力お願いします。 ちなみに使っているソフトは「Borland5.5」です。

  • プログラムの初心者です。コンパイルできません。

    こんにちは。プログラムの勉強を始めたんですけど、コマンドプロンプトをつかってコンパイルしようとしたら、 エラー E2209 list0101.c 5: インクルードファイル'stdio.h'をオープンできない 警告W8065 list0101.c 9:プロトタイプ宣言のない関数'printf'の呼び出し(関数main) とかいうエラーメッセージがでます。本の通りにプログラムを書いたつもりですが、これはいったいなんなんでしょうか?今使ってるのはBorland C++です。これがC++専用なんてことがあったりするんでしょうか?何がなんだかさっぱりわかりません。 よろしくお願いします。

  • 家のPCでもプログラムを作りたいのですが・・

    スクールで現在c言語を勉強中です。 しかし、そのスクールも一週間正月休みになります。 そこで、家でプログラムを書いたりしたいのですが、コマンドプロンプトでのコンパイルが出来ません。よって、実行も出来ません。 なぜでしょうか? 説明が足りないかも知れませんが、よろしくお願いします。

  • 楽なコンパイラを探しています

    こんにちは。 プログラムに関して、初歩的な質問をさせて頂きます。 現在、C言語でゲームの開発をしようと励んでおります。 その第一歩としてBorland C++ Compilerをインストールしたのですが、 毎回コマンドプロンプトからコンパイルするのが面倒です。 visual C++のような開発環境で開発を進めるのが良いと読んだのですが、 初心者に優しいオススメの開発環境はありませんか?

  • Borland C++ Compiler

    学校のC言語の授業で使用するので、Borland C++ Compilerをインストールしました。 今までに作ったプログラムや、教科書に載っていたサンプルプログラムをコンパイルして軽い勉強をしていたのですが、コンパイルの際にエラーが出るようになりました。 コマンドプロンプトでbcc32と打つと、パラメータのリストのようなものが出てくるので、-nなど適当にパラメータをつけて実行したら以下のようなエラーが出るようになりました。 Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland test.c: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照) objとtdsファイルは出力されるのですが、exeが出力されません。 どうやったらなおるか、教えてください。

  • コンパイル~リンクを行いたいのですが

    freecommandlinetools2というものをインストールしたのですが、それを使用する際 C:\borland\Project\1 にcのソースファイル1_4.cがあるとして 以下のコマンドでコンパイル~リンクまで行う --コマンド-------------------- cd C:\borland\Project\1<enter> set path=C:\borland\bcc55\Bin<enter> bcc32 -I"C:\borland\bcc55\Include" -L"C:\borland\bcc55\Lib" 1_4.c<enter> ---------------------------- コンパイルエラー、リンク時のエラーがなければ C:\borland\Project\1フォルダに2_4.exe が作成されており、 コマンドプロンプトから実行する。 と、書かれていました。 コマンドプロンプトの使用フォルダをCドライブに変更したので、cdはいらないと思い、borland\Project\1でエンターキーを押したのですが、『内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません』としかなりません。そもそも<enter>というのは、エンターキーのことで良いのでしょうか? 右も左も判らない状態で、どう調べればいいのかも判らず困っています。 無知で恥ずかしいのですが、どなたかお教え頂けないでしょうか。

  • 太田研究室に書いてあることを行う意味

    太田研究室に書いてあることを行う意味は何ですか? C言語をしていたものです。 プログラミングとは文字を表示させる以外に、 「●」を左に動かせ! と命令すると動いたり。 というものだと思っていました。 もちろん文字を表示するのもプログラミングと知っています。 しかし、どのサイトを見ても、 Cはとても大切な言語です。 や、 Cは簡単なので初心者にはうってつけです。 などと書かれています。 ここまでは分かるのですが、 Cのどのサイトを見ても、 コマンドプロンプトに文字を表示させることしか書いてありません。 例えば皆が一番わかりやすい! といっている太田研究室です。 http://cvwww.ee.ous.ac.jp/vc10prog.html ここでもコマンドプロンプトに文字を表示させることしか書いてありません。 コマンドプロンプトに文字を出せたからって何があるのでしょうか? だって実際に、今までパソコンをしてきて何かをクリックしたらコマンドプロンプトに文字が出た。 なんてことは一度もありませんでした。 以前もこのような質問をさせていただいたのですが、 基礎も知らないくせに応用をする必要がない。 といわれました。 なので、ネット上で調べつくしたのですが、 どんなに複雑なプログラムでも、やっぱりコマンドプロンプトに文字を表示させるプログラムしかありませんでした。 ではオンラインゲームとかはなんなのでしょうか? コマンドプロンプトは全くでできませんし、 左に動け!と思って←キーを押すと左に動きますし。 C以外でもどの言語を見てみても、とても難しいプログラムでもやっぱりコマンドプロンプトに文字を表示させるものしかありませんでした。 近くの町の店で、参考書をみても、コマンドプロンプトに文字を表示させるものしかありません。 そこで一つ疑問に思ったのですが、 この今の僕の考えでいくと プログラムを書くことを仕事にしている人たちは、 一日中コマンドプロンプトに文字を表示させてるだけになりますよね? そう考えると、コマンドプロンプトに文字を表示させるプログラム以外にも 沢山あると思うのです。 コマンドプロンプトに文字を表示させる以外のプログラムはありませんでしょうか? また、コマンドプロンプトに文字を表示させる意味は何ですか? 僕自身、プログラムを書く=コマンドプロンプトに文字を表示させることしかできない。 と思い込んでいてしまい、楽しみがなく挫折してしまいました。 どなたか詳しく教えて下さい。

  • 見た目が華やかなプログラム

    変数、制御文、関数、構造体くらいまでの基礎を一通り終えたC言語初心者です このレベルの内容を使ってある程度見た目が華やかなプログラムを作りたいと思います。 以前、左上からスタート、右下がゴール、0なら進めて1のマスは進めないという迷路を作って、脱出するまでの最短距離を求めるプログラムを作ってみました。 しかし、入力に時間がかかる上に出力結果が「最短距離は=>X」と出るだけで地味です DOS画面動作なので限界はあるとは思いますが、それでももう少し華やかなものはないでしょうか? 出来れば完成品のソースコードなどがあるとベストです。 宜しくお願いいたします