我们最近有点学习面向对象编程,并且很快就会有一个项目,所以我对OOP不太熟悉。但是,我们被分配了一个创建战舰游戏的项目。
我创建了一个船,广场和战斗板类。我测试了所有这三个,除了在Battleboard类上的一个方法之外,所有测试都已通过。为了测试每个类,我使用了toString方法。这是我的战斗板toString方法:
for (int i = 0; i < squares.length; i++) {
答案 0 :(得分:0)
我发现了几个问题,因为代码仍然不完整可能会有更多问题:
一个。在
的最开始public boolean addShip(int length, boolean isHorizontal, int startRow, int startCol) {
有
square = new Square();
检查船只是否存在于您添加它的广场上似乎合乎逻辑,而是检查它是否存在于全新的广场中。我们没有Square
代码,但我认为它最初没有发货。
B中。在同一方法中,有以下代码:
if (isHorizontal == true) {
ship = new Ship(length, isHorizontal, startRow, startCol);
for (int i = 0; i < ship.getLength(); i++) {
if (startCol > numberOfColumns) {
return false;
} else {
square.addShip(ship);
startCol++;
}
}
}
因此,船舶被重复添加到与董事会无关的同一个全新广场。之后,该广场不会被添加到任何地方,现在无论如何都会被使用。
我不知道如何解决这个问题,但可能在调用此方法之前,所有方块都应该被初始化,在此方法中不应该创建方块;相反,你需要找到一个对应于当前迭代的方块。
℃。以下代码
} else if (!square.hasBeenHit() && square.hasShip()) {
//Returns length of ship if there is a ship that hasn't been hit
if (ship.getLength() == 1) {
toString += "1 ";
} else if (ship.getLength() == 2) {
toString += "2 ";
} else if (ship.getLength() == 3) {
toString += "3 ";
} else if (ship.getLength() == 4) {
toString += "4 ";
}
}
在所有迭代中使用相同的ship
,因此它在所有迭代中的行为方式相同(追加1
)。 正确的做法是找到属于当前广场(i,j)的船只,如果它存在,并使用它。
d。每个循环都会创建一个全新的正方形,尽管你正在迭代正方形! 写square = squares[i][j]
而不是square = new Square()
更合乎逻辑。
我建议您使用调试器来查看代码中发生的情况。