|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2005-11-29, 12:14 PM | #1 |
註冊會員
|
老鼠走迷宮~
我寫了一個~但是他跑不到終點~可以請大家一起來看看嗎~謝謝嚕~
11/30要交作業了 QQ 語法:
#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) } } } |
送花文章: 23,
|
2005-11-29, 12:16 PM | #2 (permalink) |
註冊會員
|
接上面未完
語法:
////////////////////////////////我是分隔線////////////////////////////////////////// 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; } |
送花文章: 23,
|
2005-11-29, 04:17 PM | #3 (permalink) |
管理版主
|
原因在於結束條件
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)){ } 所以總言之 您的結束條件要再設計一下 或加些條件 |
送花文章: 2027,
|
2005-11-29, 10:38 PM | #4 (permalink) | |
註冊會員
|
引用:
剛回到家~ 今天又要爆肝了... 想睡... |
|
送花文章: 23,
|