战列舰阵列边界检查

本文关键字:检查 边界 阵列 战列舰 | 更新日期: 2023-09-27 18:05:26

我正在制作战列舰,我使用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];
            }
        }

我想使用随机方法来设置坐标,但是当涉及到检查数组边界和保持数组内的船只时,我的数学是关闭的。请问有人能提供帮助吗?感谢。我认为我需要对船的长度进行建模,并检查剩余部分是否大于船的长度,但我正在努力将其放入代码中。

战列舰阵列边界检查

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

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

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

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

我上次编写《战舰》游戏时就是这么做的。

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


快速编辑……我发现在放置船只时,你总是假设船只从最左边的位置开始,当水平时向右放置,从顶部开始,垂直放置时向下放置。这极大地简化了逻辑,因为您不需要担心超出数组边界。

首先,像这样做:

_grid[r, c++]

是非常糟糕的样式,因为它迫使读者暂停并自己确认该++是后增量还是前增量。在访问之外显式执行自增操作。

其次,为了确保一艘船将保持在网格内,确保它的起始值> 0,其结束值(即start + length - 1)为