![]() |
|
|||||||
| 論壇說明 |
|
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
![]() |
|
|
主題工具 | 顯示模式 |
|
|
#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,
|
|
|
#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,
|
|
|
#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)){ } 所以總言之 您的結束條件要再設計一下 或加些條件 |
|
|
送花文章: 2057,
|
|
|
#4 (permalink) | |
|
註冊會員
|
引用:
剛回到家~ 今天又要爆肝了... 想睡... |
|
|
|
送花文章: 23,
|