2013-03-22 73 views
-1

我正在研究戰列艦,我正在使用二維數組並將數字放置在網格數組中的數字上(如圖所示);戰列艦數組界限檢查

/// Places the ships in a sequence on the grid 
/// </summary> 
/// <param name="ship"></param> 
public static void PlaceShips(Ship ship) 
{  
    Random rnd1 = new Random(); 
    Random rnd2 = new Random(); 

     if (ship.Orientation == "h") 
     { 
      //int r = rnd1.Next(_grid.GetLength(0)); 
      //int c = rnd2.Next(_grid.GetLength(1)); 

      int r = 0; 
      int c = 2; 
      for (int i = 0; i < ship.Values.Length; i++) 
      { 
       _grid[r++, c] = ship.Values[i]; 
      } 
     } 
     else if (ship.Orientation == "v") 
     { 
      //int r = rnd1.Next(_grid.GetLength(0)); 
      //int c = rnd2.Next(_grid.GetLength(1)); 

      int r = 3; 
      int c = 4; 
      for (int i = 0; i < ship.Values.Length; i++) 
      { 
       _grid[r, c++] = ship.Values[i]; 
      } 
     } 

我想用隨機方法來設置座標,但是我的數學是關閉的,當涉及到檢查數組邊界,並保持在陣列內的船隻。請任何人提供任何幫助?非常感激。我想我需要根據船的長度進行修改,然後檢查餘下部分是否大於船長,但我正在努力將其放入代碼中。

回答

1

您需要在生成時從適當的值中減去船的長度。

int c = rnd.Next(_grid.GetLength(1) - ship.Values.Length);爲水平的,並且

int r = rnd.Next(_grid.GetLength(0) - ship.Values.Length);垂直。

你也應該只使用一個Random實例。默認情況下,隨機播放系統時鐘,因此幾乎同時創建的實例將獲得相同的種子,從而生成相同的值序列。理想情況下,您應該創建一個隨機數的靜態實例,並將其用於所有隨機數生成。

-1

首先,做這樣的事情:

_grid[r, c++]

是非常糟糕的風格,因爲它迫使讀者停下來確認自己的++是一個後增或預增。顯式執行訪問以外的增量。其次,爲了確保船舶將保持在電網內,確保其起始位置> 0,並且其末端(其起始長度爲1)爲< grid.length。因此,對於長度爲L,網格長度爲G的船舶,起始位置可以是0到G - L之間的任意值。

+0

嗨,可以解釋downvote嗎?感謝:D – Patashu 2013-03-22 00:24:38

1

當我上一次編制戰艦遊戲時,這就是我所做的。

1)隨機選取一個點
2)確定它是否將被水平或垂直
3放置)用於循環檢查每個部分放置在船舶將佔據。例如...

invalid_placement = false; 
for (int i = 0; i < ship.Values.Length, i++) { 
    if (c+i < grid.boundary && _grid[r,c + i] != 0) { 
    invalid_placement = true; 
    } 
} 

驗證船舶將使用的所有空間都已打開。您必須確認您所放置的船舶沒有穿越其他船隻。檢查你正在看的地點是否沒有超出界限也很重要。

一旦所有檢查通過(在範圍& &區域內清除),您可以將該船放置在該位置。如果沒有,從步驟1開始

快速編輯...
我發現它更容易的是將船舶,當你總是以爲船開始在最左邊的位置並被放置在朝好的方向發展水平放置,並在頂部開始的時候和向下垂直放置。這個簡化的邏輯非常重要,因爲您不必擔心數組邊界之下的問題。