战舰阵列边界检查

时间:2013-03-22 00:18:38

标签: c#

我正在研究战舰,我正在使用一个二维阵列,并将数字(如图所示)放置在网格数组中,如此;

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

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

3 个答案:

答案 0 :(得分:1)

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

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

垂直

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

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

答案 1 :(得分: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开始。

快速编辑...
我发现放置船只时你总是假设船只从最左边的位置开始,并且在水平方向上向右移动并从顶部开始向下放置以垂直放置。这个简化的逻辑很大,因为你不必担心低于数组边界。

答案 2 :(得分:-1)

首先,做这样的事情:

_grid[r, c++]

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

其次,为了确保船舶保持在网格内,确保其开始是> 0和它的结束(它是start + length - 1)是&lt; grid.length。因此,对于长度为L且网格长度为G的船舶,起点可以是介于0和G-L之间的任何位置。