我正在研究战舰,我正在使用一个二维阵列,并将数字(如图所示)放置在网格数组中,如此;
/// 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];
}
}
我想使用随机方法来设置坐标,但是在检查数组边界和保持数组中的数据时我的数学是关闭的。请有人可以提供任何帮助吗?非常感激。我想我需要根据船的长度进行修改并检查剩余部分是否大于船长,但我很难将其编入代码。
答案 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之间的任何位置。