【发布时间】:2021-11-26 18:54:17
【问题描述】:
老实说,我想不出更好的标题,因为这是一个基于场景的问题:
我们有一个 Battleships 游戏,我们想要求玩家提供一对坐标,以便在网格上设置他们的一艘船(更具体地说,是船的起点和终点)。假设给定了正确的坐标并且船在网格平面的边界内,我们只需要检查船是否与当前在网格平面上的任何其他船发生碰撞。
上下文:Grid 有一个 Content 属性,它可以是 ShipContent 或 EmptyContent。
CollisionChecker() 方法循环遍历先前给定的坐标对之间的空间(请注意,这些坐标不能是对角线,这也被假定为事先检查过的)。
玩家想把他们的战舰放在 A1 和 A4 之间。由于字母相等,我们循环遍历 1 到 4,很简单。但是,玩家可以按照他们的顺序分别输入 A4 和 A1。这两种情况在逻辑上都可以正常工作,但如果不进行相应处理,它们可能会导致 OutOfBound 异常和/或不正确的循环。
最后一点上下文,CoordinateLetter 是一个枚举,其中包含整个英文字母表。
static bool CollisionChecker(Grid[][] gridPlane, CoordinateLetter coordinateLetter1, CoordinateLetter coordinateLetter2, int coordinateNumber1, int coordinateNumber2)
{
bool lettersEqual = coordinateLetter1 == coordinateLetter2;
bool cL1Bigger = coordinateLetter1 > coordinateLetter2;
bool cN1Bigger = coordinateNumber1 > coordinateNumber2;
if (lettersEqual && cN1Bigger)
for (int num = coordinateNumber2; num <= coordinateNumber1; num++)
{
// Assume that if it collides, it returns false
}
else if (lettersEqual && !cN1Bigger)
{
for (int num = coordinateNumber1; num <= coordinateNumber2; num++)
{
// Assume that if it collides, it returns false
}
}
else if (!lettersEqual && cL1Bigger)
{
for (int num = (int)coordinateLetter2; num <= (int)coordinateLetter1; num++)
{
// Assume that if it collides, it returns false
}
}
else
{
for (int num = (int)coordinateLetter1; num <= (int)coordinateLetter2; num++)
{
// Assume that if it collides, it returns false
}
}
return true;
}
这段代码让我脊背发凉。如果其他情况是这样的,我不喜欢链接。有什么更好的方法来实现这一点?
【问题讨论】:
-
上次我为战舰编码时,我使用
char[][]表示网格,将大写字符编码为未轰炸的舰船,将小写字符编码为被轰炸的舰船,空格表示海,x 表示被轰炸的海。 . 我有一种方法可以水平或垂直布局,如果它们与现有船或板边缘发生碰撞,则报告真假;通过具有不会修改游戏板但检查碰撞和报告的“假装”标志参数,它可以用于布局和测试游戏中的碰撞。 x 和 y 步长的两个参数和一个循环支持的船布局。我不会.. -
..麻烦有一个字母枚举,只需使用 char/int 等价:如果你有一个字符,例如
C和减去A,你会得到 2..string coord = "A1"; var x = coord[0] - 'A'; var y = int.Parse(coord.Substring(1)) -1; -
我写的大部分似乎不必要的东西都是为了灵活性,未来可能发生的任何变化,主要是为了让它看起来总体上很漂亮:) 最好让局外人查看我的代码和看到一个网格有一个“CoordinateLetter”和一个“CoordinateNumber”,还有一个“GridState”和“GridContent”。通过我的实现,我可以轻松地添加更多船只并更改它们的符号等等,但这不是重点。至于答案,我不太明白那部分。对不起。
-
我认为您需要决定:“布局是水平的还是垂直的”,然后是“开始大于结束?如果是这样交换它们”。根据方向进行布局
-
@Flydog57 这是解决解决方案的一种方法,也是一种可靠的方法。我觉得这会导致未来有更多的问题需要解决。就个人而言,我会坚持我的 x 和 y。不过感谢答案。