• ベストアンサー

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

Borland C++っていうので、プログラムを書いて、4*4マスの小さい迷路で走らせるんですが、C言語がまったくわからないので困っています。 Borlandでプログラムを作って、コマンドプロンプトを使ってネットにあった迷路のソフトを使って走らせるんですが、パソコン自体使い慣れていないのでどうしたらいいのかわかりません。左手拡張法と求心法とトレモー法のどれかを作って、掲載してもらえないでしょうか?非常に困っているのでお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • 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がエラーとでてうまくいきません。どうしたらいんでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

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

> このままコンパイルすると未定義のシンボルNavigatorがエラーとでてうまくいきません。 そうでしょうね。なにせ、『ソースコードの量がここで紹介するにはちょっと多すぎるので、考え方を示すためにソースコードの一部だけ紹介します。』という前提で公開したコードの一部なのですから。 機械的に数えてみたところ、私がシミュレーション用に書いたソースコードは(コメント文を差し引いた実行可能な)コード行数で1300行程度ありました。ここで公開できる大きさで無いことは分かっていただけると思います。 > どうしたらいんでしょうか? (単純な)左手法、拡張左手法がどのようなものか、ソースコードから読み取っていただけたことと思います。概念さえ分かってしまえば、それを実装できるかどうかは設計・実装する人の技量にかかってきます。 どうしても実装したコードを見たいということでしたら、(このサイトでは個人が特定できるような情報は載せるなと言うことになっているので)mixiのマイクロマウスコミュニティで相談してもらえれば、こっそりソースコード差し上げます。 ・・・と思ったら、今日マイクロマウスコミュニティでそういう質問している方すでにいらっしゃいますね。

sachinnexv
質問者

補足

親切にしてくださってありがとうございます。 実を言うとmixiのマイクロマウスコミュニティで質問しているのも私です(汗)mixiでソースコードをもらえないでしょうか? 大変迷惑をかけてすみません(汗)

全文を見る
すると、全ての回答が全文表示されます。
  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

丸投げっぽい質問の仕方すると、削除されちゃいますよ~ > 左手拡張法と求心法とトレモー法のどれかを作って こういう言い方をするのは大体マイクロマウス系の人なので まずはここの過去ログ見てください。 QNo.2633652 経路探索について   http://okwave.jp/qa2633652.html QNo.1553632 迷路を脱出する経路探索プログラムをC言語で作成するには?   http://okwave.jp/qa1553632.html > C言語がまったくわからないので困っています。 C言語そのものが分からないと、説明を受けても何のことだか理解できないですよね。教科書読むより作りながら実戦で覚えたほうがはるかに記憶に残りますが・・・ > ネットにあった迷路のソフトを使って走らせるんですが 具体的にどのソフトですか? URL出せますか? ちなみに私はマイクロマウス作ってます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

  #include <stdio.h> #define Y 20 #define X 16 typedef struct maze{ int map[Y][X]; int maxy, maxx; int starty, startx; int goaly, goalx; } MAZE; void Direction(MAZE *maze) { int y = maze->starty, x = maze->startx; while(y != maze->goaly || x != maze->goalx){ if(maze->map[y][x + 1] == 2) maze->map[y][x ++] += 1; else if(maze->map[y + 1][x] == 2) maze->map[y ++][x] += 2; else if(maze->map[y][x - 1] == 2) maze->map[y][x --] += 3; else if(maze->map[y - 1][x] == 2) maze->map[y --][x] += 4; else break; } return; } void Print(MAZE *maze) { char *marks[] = {"■", " ",}, *arrows[] = {"→", "↓", "←", "↑",}; int y, x, arrow; if(maze->map[maze->starty][maze->startx] == 2) Direction(maze); for(y = 0; y < maze->maxy; y ++){ for(x = 0; x < maze->maxx; x ++){ if(maze->map[y][x] == -1) maze->map[y][x] = 1; if((y == maze->starty && x == maze->startx) || (y == maze->goaly && x == maze->goalx)){ arrow = 2 * (y == maze->goaly); if(y == 0) arrow += 1; else if(x == maze->maxx - 1) arrow += 2; else if(y == maze->maxy - 1) arrow += 3; printf("%s", arrows[arrow & 3]); } else if(maze->map[y][x] > 2) printf("%s", arrows[maze->map[y][x] - 3]); else printf("%s", marks[maze->map[y][x]]); } putchar('\n'); } return; } void Route(MAZE *maze) { int y = maze->starty, x = maze->startx; while(!(y == maze->goaly && x == maze->goalx)){ if(maze->map[y][x + 1] == 1 && x + 1 < maze->maxx) maze->map[y][x ++] = 2; else if(maze->map[y + 1][x] == 1 && y + 1 < maze->maxy) maze->map[y ++][x] = 2; else if(maze->map[y][x - 1] == 1 && x - 1 >= 0) maze->map[y][x --] = 2; else if(maze->map[y - 1][x] == 1 && y - 1 >= 0) maze->map[y --][x] = 2; else if(maze->map[y][x + 1] == 2 && x + 1 < maze->maxx) maze->map[y][x ++] = -1; else if(maze->map[y + 1][x] == 2 && y + 1 < maze->maxy) maze->map[y ++][x] = -1; else if(maze->map[y][x - 1] == 2 && x - 1 >= 0) maze->map[y][x --] = -1; else if(maze->map[y - 1][x] == 2 && y - 1 >= 0) maze->map[y --][x] = -1; else return; } maze->map[y][x] = 2; return; } int main(void) { MAZE maze = {{ {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}, {0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,}, {0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,}, {0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0,}, {0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0,}, {0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0,}, {0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0,}, {0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0,}, {0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,}, {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}, {0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,}, {0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0,}, {0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0,}, {0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0,}, {0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0,}, {0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0,}, {0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,},}, Y, X, 0, 1, Y - 1, X - 2,}; Print(&maze); putchar('\n'); Route(&maze); Print(&maze); return 0; }  

sachinnexv
質問者

補足

実際にコンパイルしてみて実行してみましたが、動作しませんでした(;_;)自分でもかなり考えてはいるんですが、よくわかりません・・・。一応、サンプルの一部みたいなのがあったんですが・・・。この意味もよくわからなくて(汗) #include <conio.h> #include <stdio.h> #include "mms.h" void main() { if(SimInit()==0) { //マイクロマウスシミュレーターを初期化する puts("先にマイクロマウスシミュレーターを実行してください。\n"); puts("-----------------何かキーを押してください。\n"); while(kbhit()==0) //何かキーが押されたら終了 ; return; //終了 } puts("Enterを押すとスタートします。\n"); while(getch()!=Enter) ; puts("--------------------------------------------------------"); puts("途中で止まってしまったり、同じところをループしている場合"); puts("何かキーを押すと終了します。\n"); MouseInit(); //マウスを初期化する(マウスをスタート位置に戻す) while(kbhit()==0) { //何かキーが押されたら終了 //前方、左側、右側は、マウスの進行方向に向かってみた場合 if(InputLW()==0) //左側に壁がなければ TurnLeft(90); //左90度回転 else if(InputFW()==0) //前方に壁がなければ ; //そのまま else if(InputRW()==0) //右側に壁がなければ TurnRight(90); //右90度回転 else Turn180(); //三方向に(左側,前方,右側)に壁が //あるので、Uターンする MoveBlock(1); //1ブロック進む if(InputGL()==1) { //ゴールエリアに到達したら puts("ゴール!\n"); puts("何かキーを押してください。\n"); while(kbhit()==0) //何かキーが押されるのを待つ ; break; //迷路探索終了 } } MouseInit(); //マウスを初期化する(マウスをスタート位置に戻す) } どうすればいいでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連する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画面動作なので限界はあるとは思いますが、それでももう少し華やかなものはないでしょうか? 出来れば完成品のソースコードなどがあるとベストです。 宜しくお願いいたします

このQ&Aのポイント
  • ブラザー製品のHL-L2375DWで印刷ができない際のトラブルについて、解決策をご紹介します。
  • Windows10環境で無線LAN接続している場合、スリープ状態から復帰すると印刷できないことがあります。
  • 解決策としては、Wi-Fiルーターの再起動やプリンターのドライバーアップデートを試してみてください。
回答を見る

専門家に質問してみよう