战列舰阵列边界检查
本文关键字:检查 边界 阵列 战列舰 | 更新日期: 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)为