2013-03-22 63 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开始

快速编辑...
我发现它更容易的是将船舶,当你总是以为船开始在最左边的位置并被放置在朝好的方向发展水平放置,并在顶部开始的时候和向下垂直放置。这个简化的逻辑非常重要,因为您不必担心数组边界之下的问题。