史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   老鼠走迷宮~ (http://forum.slime.com.tw/thread161971.html)

kinco 2005-11-29 12:14 PM

老鼠走迷宮~
 
我寫了一個~但是他跑不到終點~可以請大家一起來看看嗎~謝謝嚕~
11/30要交作業了 QQ :decfghi6:
語法:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <sys/types.h>
#include <sys/timeb.h>

// 0:未走過的路 1:牆 2:走過的路  5:起點 6:終點
#define xi 25
#define yj 25

int visit(int, int);

int maze[xi][yj];

int path[xi*yj]={0},p;

int si = rand()%xi, sj = rand()%yj; // 起點座標變數

int sii, sjj;

int ei = rand()%xi, ej = rand()%yj; // 終點座標變數

int eii, ejj;

int success = false;        //行走成功與否,初始值是否

////////////////////////////////我是分隔線//////////////////////////////////////////
int visit(int x, int y) //傳入的是起點座標
{
        p = 0;       
        while(!(x==eii && y==ejj)) /*檢查終點*/
        {
                if(maze[y][x-1]==0)  /*檢查左邊*/
                { 
                        maze[y][x]=2;  /*左邊有通路*/
                        path[p]=1; /*儲存走的方向*/
                        p++;
                        x--;
                }
                else  /*左邊沒通路*/
                {
                        if(maze[y+1][x]==0)  /*檢查下面*/
                        {
                                maze[y][x]=2;  /*下面有通路*/
                                path[p]=2;  /*儲存走的方向*/
                                p++;
                                y++;
                        }
                        else  /*下面沒通路*/
                        {
                                if(maze[y][x+1]==0)  /*檢查右邊*/
                                {
                                        maze[y][x]=2;  /*右邊有通路*/
                                        path[p]=3;  /*儲存走的方向*/
                                        p++;
                                        x++;
                                }
                                else  /*右邊沒通路*/
                                {
                                        if(maze[y-1][x]==0)  /*檢查上面*/
                                        {
                                                maze[y][x]=2;  /*上面有通路*/
                                                path[p]=4;  /*儲存走的方向*/
                                                p++;
                                                y--;
                                        }
                                        else  /*都沒有通路時*/
                                        {
                                                if(p)
                                                {
                                                        maze[y][x]=3;
                                                        switch(path[p-1])
                                                        {
                                                                case 1:
                                                                        x++;
                                                                        break;
                                                                case 2:
                                                                        y--;
                                                                        break;
                                                                case 3:
                                                                        x--;
                                                                        break;
                                                                case 4:
                                                                        y++;
                                                                        break;
                                                        }
                                                        p--;
                                                        path[p]=0;
                                                }
                                                else
                                                {
                                                        x=eii;
                                                        y=ejj;
                                                        success=1;
                                                }
                                        }
                                }
                        }
                }
        }
        return success;
}
////////////////////////////////我是分隔線//////////////////////////////////////////
void draw()
{
        int i,j;
        for(int k = 0; k < xi; k++)        //產生地圖外框
        {
                maze[k][0] = 1;
                maze[0][k] = 1;
                maze[xi-1][k] = 1;
                maze[k][xi-1] = 1;
        }
        for(i = 1; i < xi-1; i++) //隨機畫地圖,只有0跟1
        {
                for(j = 1; j < yj-1; j++)
                {
                        if(!(rand()%4))                //為了不要讓障礙出現的太頻繁
                        {                                        //所以用(!rand()%4)
                                maze[i][j] = 1; //就有四分之一的機會產生障礙了
                        }
                }
        }
        switch((rand()%4))        //隨機產生0,1,2,3//隨機選擇起點
        {
        case 0:
                if(sj != 0 && sj != 19)
                {
                        maze[sj][0] = 0;
                        sjj = sj;
                        sii = 0;
                }
                else if(sj == 0)
                {
                        maze[sj+1][0] = 0;
                        sjj = sj+1;
                        sii = 0;
                }
                else if(sj == 19)
                {
                        maze[sj-1][0] = 0;
                        sjj = sj-1;
                        sii = 0;
                }
                break;
        case 1:
                if(si != 0 && si != 19)
                {
                        maze[0][si] = 0;
                        sjj = 0;
                        sii = si;
                }
                else if(si == 0)
                {
                        maze[0][si+1] = 0;
                        sjj = 0;
                        sii = si+1;
                }
                else if(si == 19)
                {
                        maze[0][si-1] = 0;
                        sjj = 0;
                        sii = si-1;
                }
                break;
        case 2:
                if(si != 0 && si != 19)
                {
                        maze[yj-1][si] = 0;
                        sjj = yj-1;
                        sii = si;
                }
                else if(si == 0)
                {
                        maze[yj-1][si+1] = 0;
                        sjj = yj-1;
                        sii = si+1;
                }
                else if(si == 19)
                {
                        maze[yj-1][si-1] = 0;
                        sjj = yj-1;
                        sii = si-1;
                }
                break;
        case 3:
                if(sj != 0 && sj != 19)
                {
                        maze[sj][xi-1] = 0;
                        sjj = sj;
                        sii = xi-1;
                }
                else if(sj == 0)
                {
                        maze[sj+1][xi-1] = 0;
                        sjj = sj+1;
                        sii = xi-1;
                }
                else if(sj == 19)
                {
                        maze[sj-1][xi-1] = 0;
                        sjj = sj-1;
                        sii = xi-1;
                }
                break;
        }
        switch((rand()%4))        //隨機產生0,1,2,3//隨機選擇終點
        {
        case 0:
                if(ej != 0 && ej != 19)
                {
                        maze[ej][0] = 0;
                        ejj = ej;
                        eii = 0;
                }
                else if(ej == 0)
                {
                        maze[ej+1][0] = 0;
                        ejj = ej+1;
                        eii = 0;
                }
                else if(ej == 19)
                {
                        maze[ej-1][0] = 0;
                        ejj = ej-1;
                        eii = 0;
                }
                break;
        case 1:
                if(ei != 0 && ei != 19)
                {
                        maze[0][ei] = 0;
                        ejj = 0;
                        eii = ei;
                }
                else if(ei == 0)
                {
                        maze[0][ei+1] = 0;
                        ejj = 0;
                        eii = ei+1;
                }else if(ei == 19)
                {
                        maze[0][ei-1] = 0;
                        ejj = 0;
                        eii = ei-1;
                }
                break;
        case 2:
                if(ei != 0 && ei != 19)
                {
                        maze[yj-1][ei] = 0;
                        ejj = yj-1;
                        eii = ei;
                }
                else if(si == 0)
                {
                        maze[yj-1][ei+1] = 0;
                        ejj = yj-1;
                        eii = ei+1;
                }
                else if(si == 19)
                {
                        maze[yj-1][ei-1] = 0;
                        ejj = yj-1;
                        eii = ei-1;
                }
                break;
        case 3:
                if(ej != 0 && ej != 19)
                {
                        maze[ej][xi-1] = 0;
                        ejj = ej;
                        eii = xi-1;
                }
                else if(ej == 0)
                {
                        maze[ej+1][xi-1] = 0;
                        ejj = ej+1;
                        eii = xi-1;
                }
                else if(ej == 19)
                {
                        maze[ej-1][xi-1] = 0;
                        ejj = ej-1;
                        eii = xi-1;
                }
                break;
        }
               
        for(i = 0; i < xi; i++) //隨機畫通路
        {
                for(j = 0; j < yj; j++)
                {
                        printf("%d",maze[i][j]);
                //        select = rand()%4;                //    1
                //                                                        //  0  2
                //        maze[i][j] = select;    //    3
                //        if(maze[i][j] == 0)                maze[i][j] =
                //        if(maze[i][j] == 1)
                //        if(maze[i][j] == 2)
                //        if(maze[i][j] == 3)
                }
        }
}


kinco 2005-11-29 12:16 PM

接上面未完
 
語法:

////////////////////////////////我是分隔線//////////////////////////////////////////
int main(void)
{
        struct _timeb timebuffer;
        char *timeline;
       
        _ftime( &timebuffer );
        timeline = ctime( & ( timebuffer.time ) );

        printf( "The time is %.19s.%hu %s", timeline, timebuffer.millitm, &timeline[20] );

        srand( (unsigned)time( NULL ) );//用 srand 取亂數需要一個參數作為種子以產生新的亂數序列
                                //而這個參數通常使用目前的時間傳入,這時候就需要用
        draw();                        //time() (include <time.h>)來幫忙。
       
        int i, j;

        printf("顯示迷宮:\n");
        for(i = 0; i < xi; i++)
        {
                for(j = 0; j < yj; j++)
                        if(maze[i][j] == 1)
                                printf("█");
                        else if(i == sjj && j == sii)
                                printf("SS");
                        else if(i == ejj && j == eii)
                                printf("EE");
                        else
                                printf("  ");
                                printf("\n");               
        }
       
        clock_t start_time;                        //delay,使用CLOCK function
        start_time = clock();       
        while((clock() - start_time) < 1 * CLOCKS_PER_SEC){}

        if(!visit(sii, sjj))
        {
                printf("\n沒有找到出口!\n");
        }
        else if(visit(sii, sjj))
        {
                printf("\n顯示路徑:\n");
                for(i = 0; i < xi; i++)
                {
                        for(j = 0; j < yj; j++)
                        {
                                if(maze[i][j] == 1)
                                        printf("█");
                                else if(maze[i][j] == 2)
                                        printf("◇");
                                else if(i == sjj && j == sii)
                                        printf("SS");
                                else if(i == ejj && j == eii)
                                        printf("EE");
                                else
                                        printf("  ");
                        }
                        printf("\n");
                }
        }
        return 0;
}


mini 2005-11-29 04:17 PM

原因在於結束條件

int visit(int, int);
while(!(x==eii && y==ejj)) /*檢查終點*/
{
...
x=eii;
y=ejj;
success=1;
...
}

及主程式的
if(!visit(sii, sjj)){

}
else if(visit(sii, sjj)){

}
關係上

無法走到出路 與 走到出路 兩種情況
都會使
success=false;
而進入
if(!visit(sii, sjj)){

}

所以總言之
您的結束條件要再設計一下 或加些條件

kinco 2005-11-29 10:38 PM

引用:

作者: mini
原因在於結束條件

int visit(int, int);
while(!(x==eii && y==ejj)) /*檢查終點*/
{
...
x=eii;
y=ejj;
success=1;
...
}

及主程式的
if(!visit(sii, sjj)){

}
else if(visit(sii, sjj)){

}
關係上

無法走到出路 與 走到出路 兩種情況
都會使
success=false;
而進入
if(!visit(sii...

感謝大大指導~
剛回到家~ :sxde45fty
今天又要爆肝了... :decfghi6:
想睡... :defft67jn


所有時間均為台北時間。現在的時間是 02:01 PM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1