2016-05-06 72 views
1

在這個程序中,有一個使用2維數組構建的6×6地圖。這個程序的目的是通過障礙物導航一個物體。每個座標都包含一個值,每個值表示對象與目標之間的距離,如果它是對象的新座標。對象的初始座標是(0,5),其目標座標是(5,0)。價值50意味着障礙。該對象應該選擇包含最小值的下一個座標。目的地的座標值爲0 這是圖:我的代碼有什麼問題?多維數組? C編程

0 | 1 | 2 | 3 | 4 | 5 
0| 7 | 50| 3 | 2 | 1 | 0 
1| 6 | 5 | 4 | 3 | 2 | 1 
2| 7 | 6 | 5 | 50| 50| 50 
3| 8 | 7 | 6 | 7 | 8 | 9 
4| 50| 50| 50| 50| 50| 10 
5| 0 | 15| 14| 13| 12| 11 

該程序是假設輸出從(0,5)的一系列座標到(5,0)。

#include<stdio.h> 
#include<stdlib.h> 

//These are the functions to move the object through the map. 
void moveForward(int new_c[1][2]); 
void moveBackward(int new_c[1][2]); 
void moveLeft(int new_c[1][2]); 
void moveRight(int new_c[1][2]); 

int main() 
{ 
    int map[6][6]={{7,50,3,2,1,0}, 
        {6,5,4,3,2,1}, 
        {7,6,5,50,50,50}, 
        {8,7,6,7,8,9}, 
        {50,50,50,50,50,10}, 
        {0,15,14,13,12,11}}; 

    int coordinate[1][2]={{0,5}}; 
    int x = 0; 
    int y = 5; 

    printf("(%d,%d),",x,y); 

    while(x!=5&&y!=0) 
    {   
     if(map[y-1][x] < map[y+1][x] && //Forward < Backward 
      map[y-1][x] < map[y][x-1] && //Forward < Left 
      map[y-1][x] < map[y][x+1] && //Forward < Right 
      y - 1 >= 0 && 
      y + 1 <= 5 && 
      x - 1 >= 0 && 
      x + 1 <= 5) 
      { 
       moveForward(coordinate); 
       y = y - 1; 
      } 
      else 
      {  
       if(map[y+1][x] < map[y-1][x] && //Backward < Forward 
        map[y+1][x] < map[y][x-1] && //Backward < Left 
        map[y+1][x] < map[y][x+1] && //Backward < Right 
        y - 1 >= 0 && 
        y + 1 <= 5 && 
        x - 1 >= 0 && 
        x + 1 <= 5) 
        { 
         moveBackward(coordinate); 
         y = y + 1; 
        } 
        else 
        {  
         if(map[y][x-1] < map[y][x+1] && //Left < Right 
          map[y][x-1] < map[y+1][x] && //Left < Backward 
          map[y][x-1] < map[y-1][x] && //Left < Forward 
          y - 1 >= 0 && 
          y + 1 <= 5 && 
          x - 1 >= 0 && 
          x + 1 <= 5) 
          { 
           moveLeft(coordinate); 
           x = x + 1; 
          } 
          else 
          {  
           if(map[y][x+1] < map[y][x-1] && //Right < Left 
           map[y][x+1] < map[y+1][x] && //Right < B 
           map[y][x+1] < map[y-1][x] && //Right < F 
           y - 1 >= 0 && 
           y + 1 <= 5 && 
           x - 1 >= 0 && 
           x + 1 <= 5) 
           { 
            moveRight(coordinate); 
            x = x - 1; 
           } 
          } 
        } 
      } 
    } 
return 0; 
} 

void moveForward(int new_c[1][2]) 
{ //This modifies the y coordinate. 
    new_c[0][1] = new_c[0][1] - 1; 
    printf("(%d,%d),", new_c[0][0], new_c[0][1]); 
} 

void moveBackward(int new_c[1][2]) 
{ //This modifies the y coordinate. 
    new_c[0][1] = new_c[0][1] + 1; 
    printf("(%d,%d),", new_c[0][0], new_c[0][1]); 
} 

void moveLeft(int new_c[1][2]) 
{ //This modifies the x coordinate. 
    new_c[0][0] = new_c[0][0] - 1; 
    printf("(%d,%d),", new_c[0][0], new_c[0][1]); 
} 

void moveRight(int new_c[1][2]) 
{ //This modifies the x coordinate. 
    new_c[0][0] = new_c[0][0] + 1; 
    printf("(%d,%d),", new_c[0][0], new_c[0][1]); 
} 



Output: 
(0,5), 

然後光標就像往常一樣閃爍。 底部沒有聲明返回值或執行時間。

+0

'if(map [y] [x + 1] = 0 && y + 1 <=5&&x-1> = 0 && x + 1 <= 5)' 這對我來說看起來相當不對。你真的知道這行代碼應該做什麼嗎?我肯定不會,我會刪除它並重新開始。 –

+1

你是否嘗試用調試器單步執行代碼? – pm100

+0

您的循環在某處出現了無限循環 - 您可能未滿足if語句中的任何條件 - 嘗試使用調試器單步執行程序並查看出了什麼問題。 – Soren

回答

1

您的代碼訪問地圖之外的部分。例如,如果x爲0,則訪問map[y][x-1]。這是未定義的行爲,可能會導致您遇到的無限循環。

您有&& x - 1 >= 0在您的情況。所以如果x == 0,所有的條件將永遠是錯誤的,因此coordinate永遠不會改變。由於x0開頭,所以什麼也沒有發生。

另一編輯:雖然我在它,while(x!=5&&y!=0)也是錯誤的。只要您到達正確的列行,循環就會停止。你想要while(x != 5 || y != 0)

+0

我在if語句中強加的條件「&& x - 1> = 0」是什麼?這是錯的嗎?在語法或任何方面? – Hiew

+0

嗯,我沒有看到它,因爲你的代碼格式很好。但即使如此,你的代碼訪問它不應該存儲的區域,所以它仍然是未定義的行爲。 – flyx

+0

@Hiew:沒錯,但是你的代碼缺少格式化以提高可讀性。對於複雜的表達式,添加括號通常也是很好的,即使它們不是必需的。 – Olaf