-1

我正在研究战舰,我正在使用 2D 数组,并用网格数组中的数字放置船只(表示),如下所示;

/// 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];
            }
        }

我想使用随机方法来设置坐标,但是在检查数组边界并将船只保持在数组内时,我的数学是错误的。请问有人可以提供任何帮助吗?非常感激。我想我需要根据船的长度进行修改并检查剩余部分是否大于船的长度,但我正在努力将其放入代码中。

4

3 回答 3

1

生成时需要从适当的值中减去船的长度。

int c = rnd.Next(_grid.GetLength(1) - ship.Values.Length);对于水平,和

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

您还应该只使用一个 Random 实例。默认情况下,Random 使用系统时钟作为种子,因此几乎同时创建的实例将获得相同的种子,从而产生相同的值序列。理想情况下,您应该创建一个随机的静态实例并将其用于所有随机数生成。

于 2013-03-22T00:22:08.337 回答
1

当我上次编写战舰游戏时,我就是这样做的。

1)随机选择一个点
2)确定它是水平放置还是垂直放置
3)使用for循环检查放置时船将占据的每个部分。例如...

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 开始。

快速编辑...
我发现放置船只时更容易假设船只从最左边的位置开始,水平放置时向右放置,从顶部开始,垂直放置时向下放置。这大大简化了逻辑,因为您无需担心低于数组边界。

于 2013-03-22T00:24:47.093 回答
-1

首先,做这样的事情:

_grid[r, c++]

是非常糟糕的风格,因为它迫使读者停下来自己确认 ++ 是后增量还是前增量。明确地在访问之外进行增量。

其次,要确保船保持在网格内,请确保其起点 > 0 且终点(起点 + 长度 - 1)< grid.length。因此,对于长度为 L 且网格长度为 G 的船,起点可以是 0 到 G - L 之间的任何位置。

于 2013-03-22T00:23:03.200 回答