如何在战舰游戏中检查船只是否重叠?困惑于算法

时间:2013-04-07 00:10:29

标签: java algorithm

我不是一个优秀的程序员,所以我想知道是否有人可以帮助我。在我的战舰游戏中,我有从Rect类制造的船只,但我需要检查它们是否重叠。这是我到目前为止所做的。

编辑:究竟是什么问题:我有两艘船,一艘是2号和5号。所以说船1有(0,0)(0,1)坐标,船2有(0,1)到(5, 1)。它非常适合检查船舶在点(0,1)上的坐标,但就是这样。我希望这是有道理的。所以,如果我在(1,1)上检查(0,0)和(0,1),则表示没有错误

   public boolean contains(Ship ship) {
    int currentX = ship.getX();
    int currentY = ship.getY();
    int testX = xCoord;
    int testY = yCoord;

    if (rotated) {      //if ship is horizontal enter
        for (int j = 0; j < sizeOfShip; j++) {
            for (int k = 0; k < ship.getSize(); k++) {
                if (testX == currentX && testY == currentY) {
                    return false;
                }
                testX++;
            }
            if (ship.rotated)
                currentX++;
            else {
                currentY++;
            }
        }
    }
    //
    if (!rotated) {
        for (int j = 0; j < sizeOfShip; j++) {
            for (int k = 0; k < ship.getSize(); k++) {
                if (testX == currentX && testY == currentY) {
                    return false;
                }
                testY++;
            }
            if (ship.rotated)
                currentX++;
            else {
                currentY++;
            }           }
    }
    return true;

}

2 个答案:

答案 0 :(得分:3)

问题是,例如对于船舶(0,1)(5,1),您需要检查所有值(0,1)(1,1)(2,1)(3,1)(4,1)(5,1)反对所有其他船舶的类似价值,例如(0,0)(0,1)(不再是因为它是小船)。

您需要修改for循环才能为您执行此操作。我建议打印出那些currentX / currentY值,以确保它们正在执行此操作。特别是我不认为你想在每次迭代时增加currentX / Y,而是在一个for循环中使用currentX而在另一个中使用currentY。

干杯。

答案 1 :(得分:3)

我认为问题出在这里(对于其他if也是如此):

...
    testX++;
 }
 if (ship.rotated)
     currentX++;
 else {
     currentY++;
 }
 ...

我认为testX this的值为x。您正在内部循环中的每次迭代中递增testX,并在外部循环中递增输入参数值(currentX)。与此同时,您永远不会重置该值。让我们说this船的长度为5,输入参数的长度为2,两者都是水平的。在外循环testX的3次迭代之后增加了6。

我认为您希望在每次内部迭代后交换增量并重置currentX/Y值:

for (int j = 0; j < sizeOfShip; j++) {
    for (int k = 0; k < ship.getSize(); k++) {
        if (testX == currentX && testY == currentY) {
            return false;
        }
        if (ship.rotated)
            currentX++;
        else {
            currentY++;
        }
    }
    currentX = ship.getX();
    currentY = ship.getY();
    testX++;
}

这两个if都必须这样做。我不能尝试这个,所以试一试告诉我是否犯了错误。 :)


另一方面。你可以替换

}
//
if (!rotated) {
...

}
else {
...