2014-11-23 71 views
2

我創建了一個程序,我可以在2D陣列的邊界內隨機放置兩個隨機方向(水平或垂直)的船舶。C編程 - 戰列艦計劃 - 如何防止船舶重疊?

,我現在面臨試圖阻止船隻重疊......

這裏唯一的問題是從我的代碼片段:

for(rw = 0; rw < SIZ; rw++) 
    { 
      printf("%c | ", a++); 

      for(column = 0; column < SIZ; column++) 
      { 
        board[rw][column] = ' '; 

        for(i = 0; i < 4; i++) 
        { 
          if(battleship[i].column == column) 
          { 
            if(battleship[i].rw == rw) 
            { 
              board[rw][column] = 'B'; 
            } 
          } 
        } 





        for(i = 0; i < 5; i++) 
        { 
          if(carrier[i].column == column) 
          { 
            if(carrier[i].rw == rw) 
            { 
              board[rw][column] = 'A'; 
            } 
          } 
        } 

        printf("%c ", board[rw][column]); 

      } 

    printf("|\n"); 
} 

如何檢查,看是否有船是否已經存在,如果存在,請從頭重新啓動循環,清除現有值?

+0

建議當船舶被放置,設置相應的陣列位置指示船的存在,然後將另一艘船的時候,看看新的陣列位置以確保沒有任何東西存在,然後再實際修改新船的陣列 – user3629249 2014-11-23 10:58:05

+0

刪除您的整個代碼*不是'錯字修正',並且使答案無效。請不要這樣做。 – usr2564301 2014-11-23 17:34:26

回答

1

通過檢查棋盤上的每個點,然後檢查棋盤上的點是否對應於戰艦或運營商的4點或5點,可以降低代碼的效率。

爲什麼不只是用空白字符填充板' '。然後循環穿過你的戰鬥艦和艦載物體,並檢查船上的戰艦或艦載體將佔據的點是否都是空的空間' '或不。如果他們要佔用的空間都是空的,那麼它就會與任何東西碰撞,並且可以相應地將板點改爲'A''B'。如果確實碰撞,您可以隨機生成該位置並再次檢查。

0

難道最簡單的解決方案是創建一個函數來檢查當前位置以查看它是否爲空?也許bool isEmpty()你在哪裏檢查棋盤,以確定你輸入的空間實際上是空的還是有一個角色在那裏?其複雜性在於檢查董事會而不是相互之間的「船長」。

編輯:這是大衛皮薩尼完全一樣的答案。

0

這將是更好,如果你有不同的程序像

clear_board 
place_ships 
init_ships 

clear_board只會所有單元格設置爲空間

place_ships將通過戰艦陣列和放置學士學位。然後它將通過載體陣列並放置As。

你的問題是關於init_ships。它類似於洗牌算法。說你的網格永遠不會超過64K×64K。

int possible[SIZ * SIZ], ix, ship, empty; 
for (ix = 0; ix < SIZ * SIZ; ++ix) 
    possible[ix] = ix; 

// Allocate the battleships 
empty = SIZ * SIZ; 
for (ship = 0; ship < MAXBATTLESHIPS; ++ship) 
{ 
    ix = rand() % empty; // Not the best way - this is just an example 
    battleship[ship].column = possible[ix] % SIZ; 
    battleship[ship].rw = possible[ix]/SIZ; 
    if (ix != empty - 1) 
    { 
     possible[ix] = possible[empty - 1]; 
    } 
    --empty; 
} 

執行相同的運營商