Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and beginning April 20th, 2021 (Eastern Time) the Yahoo Answers website will be in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

C++老鼠走迷宮

以下是我自已寫的老鼠走迷宮

#include<iostream>

#include <fstream>

#include <cstdlib>

#include <conio.h>

#include <windows.h>

using namespace std;

int starti,startj,endi,endj,t;

int map[10][10];

void Map();

void gotoxy(int,int);

void mouse(int,int);

void max(int,int);

void mask(int,int);

int main()

{

int i,j;

ifstream in_stream;

in_stream.open("map.txt");

for (j = 0;j < 10;j++)

{

for (i = 0;i < 10;i++)

{

in_stream>>map[j][i];

}

}

Map();

cout<<"start line:";

cin>>startj>>starti;

cout<<"end line:";

cin>>endj>>endi;

mouse(startj,starti);

system("pause");

return 0;

}

void Map()

{

int i,j;

for (j = 0;j < 10;j++)

{

for (i = 0;i < 10;i++)

{

if (map[j][i] == 0)

{

cout<<map[10][10];

}

else

{

cout<<"1";

}

}

cout<<endl;

}

}

void gotoxy(int x,int y)

{

SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE),

(COORD) {x,y});

}

void mouse(int a,int b)

{

t=20;

gotoxy(a,b);

cout<<"@";

Sleep(t*100);

if(a==endj&&b==endi)

{

gotoxy(0,13);

return;

}

if(map[b][a+1]==1)

{

gotoxy(a,b);

cout<<"2";

mouse(a+1,b);

}

else if(map[b+1][a]==1)

{

gotoxy(a,b);

cout<<"2";

mouse(a,b+1);

}

else if(map[b][a-1]==1)

{

gotoxy(a,b);

cout<<"2";

mouse(a-1,b);

}

else if(map[b-1][a]==1)

{

gotoxy(a,b);

cout<<"2";

mouse(a,b-1);

}

}

Update:

我的問題是

1、我該如何在老鼠走過的路上做標記,防止老鼠往回走(我的老鼠一直在某一轉角來回走= =)

2、我該如何讓老鼠判斷死路,然後往回走,在走另一條路。

Update 2:

ps:starti,startj==>起點坐標

endi,endj==>終點坐標

map.txt:

0 0 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 1 0 0

0 1 0 1 1 1 0 1 0 0

0 1 1 1 0 1 0 1 0 0

0 0 0 0 0 1 0 1 0 0

0 0 0 0 1 1 0 1 1 0

0 0 0 0 1 0 0 0 1 0

0 0 0 0 1 1 1 1 1 0

0 0 1 1 1 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

1為路,0為牆

Update 3:

在此感謝大大的回答

以下我還有幾個疑問:

1、請大大再解釋一次您所寫的 notDone的用途,我有點看不太懂=.=

2、如果我要從死路往回走(要顯示路徑),走回原先的岔路,再走另一條路,我該如何寫呢?要再寫另一個function嗎?

Update 4:

if (notDone)

{ map[y][x] = 3;

gotoxy(x, y);

cout << '*';

if (x==begX && y==begY)

{ notDone = -1; // not necessary

return;

}

} else // if you want to trace back

{ gotoxy(x, y);

cout << '+';

}

}

這一部份我也看不太懂...

Update 5:

感謝大大的詳細回答,小弟我受益良多!!

我還有些問題想請教一下大大

現在老鼠已經沒問題了,但我想要控制老鼠的速度(也就是Sleep()內的大小),而且在老鼠走的時候改他

Update 6:

const int UP = 72; //按向上的鍵

const int DOWN = 80; //按向下的鍵

void action()

{

int key;

while(1)

{

if(kbhit())

{

key = getch();

switch(key)

{

Update 7:

case 224:

key = getch();

switch(key)

{

case UP:

t--;

break;

case DOWN:

t++;

break;

}

Update 8:

break;

default:

break;

}

}

}

}

不好意思,有點長...

然後將他放入我的mouse(0內,卻不會動,我該如何修改他呢??

謝謝

2 Answers

Rating
  • 1 decade ago
    Favorite Answer

    #include <iostream>

    #include <fstream>

    #include <cstdlib>

    #include <windows.h>

    using namespace std;

    int begX, begY,

    endX, endY,

    t, notDone;

    int map[10][10];

    void Map();

    void gotoxy(int, int);

    void mousePas(int, int);

    void mouse(int, int);

    int main()

    { int i, j;

    ifstream in_stream;

    in_stream.open("map.txt");

    for (j = 0;j < 10;j++)

    for (i = 0;i < 10;i++)

    in_stream>>map[j][i];

    Map();

    cout << "start line:";

    cin >> begX >> begY;

    cout << "end line:";

    cin >> endY >> endX;

    notDone = 1;

    t = 2;

    mouse(begX, begY);

    gotoxy(0, 12);

    if (notDone)

    cout << "No exit found!\n";

    system("pause");

    return 0;

    }

    void Map()

    { int i, j;

    for (j = 0;j < 10;j++)

    { for (i = 0;i < 10;i++)

    { if (map[j][i])

    cout << ' ';

    else

    cout << 'X';

    }

    cout<<endl;

    } }

    void gotoxy(int x, int y)

    { COORD co = { (short) x, (short) y };

    SetConsoleCursorPosition(GetStdHandle STD_OUTPUT_HANDLE, co);

    }

    void mousePas(int x, int y)

    { gotoxy(x, y);

    cout << '.';

    map[y][x] = 2;

    }

    void mouse(int x, int y)

    { gotoxy(x, y);

    cout << '@';

    Sleep(t*10);

    if (x==endX && y==endY)

    notDone = 0;

    if (notDone && map[y][x+1]==1)

    { mousePas(x, y); mouse(x+1, y); }

    if (notDone && map[y+1][x]==1)

    { mousePas(x, y); mouse(x, y+1); }

    if (notDone && map[y][x-1]==1)

    { mousePas(x, y); mouse(x-1, y); }

    if (notDone && map[y-1][x]==1)

    { mousePas(x, y); mouse(x, y-1); }

    if (notDone)

    { map[y][x] = 3;

    gotoxy(x, y);

    cout << '*';

    if (x==begX && y==begY)

    { notDone = -1; // not necessary

    return;

    }

    } else // if you want to trace back

    { gotoxy(x, y);

    cout << '+';

    }

    }

    基本上是照你的程式去改的。

    你的問題在你沒把走過的路設成不同值!

    所以,老鼠就一直在走走過的路。

    解藥:map[y][x] = 2;

    你每個都用 else if,萬一這條路後來發現走不通,

    鼠輩就不會試另一條路了!

    解藥:把 else 去掉!

    我加上:notDone,這樣,程式很容易知道解決了沒!

    不用notDone的做法,可找出所有解!

    (如回它不是一解迷宮!)

    我加上:mousePas( );

    這樣,只改一處,四個方向的走法都可以改。

    (如加上 ... = 2,加上顯示走過 (印出 . )

    最後的 else 是印出一個 trace back。

    如果你不要那樣,就把 else { ... } 去掉。

    你把 t = 20; 放在 mouse( ); 裡,不建議!

    所以我把它搬去 main。

    你都用單一字元來印出,不建議用 " ",建議用 ' '。

    有努力過又不匿名的,我一定盡力幫!

    哪不懂請再問! ^_^

    2008-12-21 17:20:53 補充:

    那個 map[y][x] = 3; 是標示:死路

    notDone 卻能 return,表示沒路(前面 check 已回到出發點!)

    所以,設 notDone = -1; 其實是多餘的!

    main 檢查 notDone 的值,可知道:沒出口。

    這個做法有個 bug!

    要是入口處本身有不只一條路(如:有右也有下)

    而唯一出路是在右,不在下!

    老鼠要是先向下試路,當然沒找到,

    於是就一直回到原出口!

    這時,牠因為回到原出口,就認定:沒出路!

    要不,改結構

    再不,改成找出所有解

    不然,設計迷宮時,入口處不可有兩條路(之後分岐沒關係)

    看你囉!

    2008-12-21 17:26:05 補充:

    你本來的 Sleep(t*100) 被我改成 *10。

    * 10 在絕大多數的現代個人電腦是錯的!

    建議至少要用 16。

    請把它改回較大的值。

    2008-12-21 18:00:25 補充:

    要是覺得 trace back (不管是 + 還是 *)太快,看不到,

    可以在最後的 } 前加個 Sleep(t*20);

    就會看得到了。

    2008-12-23 20:43:22 補充:

    notDone 字面的意思就是:還沒完成。

    所以,

    它 = 1就是還沒完成;

    它 = 0 就是完成了。

    所以,main 在

     呼叫mouse前,設成 1

     呼叫mouse後,檢查它的值。

    理論上,完成了才會 return。

    但要是沒找到出口,mouse也會 return!

    這時,當然是 not done!所以,notDone 會不等於 0。

    main 檢查 notDone,就會知道是找到出口了沒有。

    Trace Back 就是你後面問的東西!

    沒看清楚,就像我前面補充的一樣,

    在 } 最後的 } 前加個 Sleep(t*20);

    就會看得到了。

    你再補問看不懂的部份,就是 Trace back。

    再試試看,不懂我再寫。

    2008-12-25 20:16:19 補充:

    在你的 mouse 裡的 gotoxy 前,或 第一個 Sleep後,加上

    if (kbhit())

    { char c = getch();

    if (c<1) c = getch();

    if (c==72 && t > 2) t--;

    else if (c==80 && t < 50) t++;

    }

    最前面加上

    #include <conio.h> // <>請改成半型

    就可以了

  • Anonymous
    7 years ago

    誠心服務!會員溫馨!永久服務!

    第一:全程直播遊戲的公平與公正性【亞洲唯一直屬會員代理】

    第二:點數儲值和託售皆在十分鐘之內完成【全台娛樂城速度最快24小時不分周末】

    第三:二十四小時專業客服務線上服務全年無休【大大小小問題都可以馬上做詳細解答喔】

    電子機台.真人遊戲和你一同玩樂

    麻將 百家樂 5PK 德州撲克 水果盤 賓果

    輪盤 21點 10點半 骰盅 牌九 鬥地主 13支

    全年網站優惠活動不間斷!

    快去註冊會員!免費:官方網站 http://a5555.net/

Still have questions? Get your answers by asking now.