我们最近有点学习了面向对象编程,并且已经有了一个项目,因此我不太熟悉OOP。不过,我们被分配了一个创建战舰游戏的项目。战列舰卡在战斗板实施
我创造了一艘船,方形和战斗板类。我已经测试了所有三种测试,并且所有测试都通过了,除了在测试板上的一种测试方法。为了测试每个类,我使用了toString方法。这是我在战斗中板的toString方法:
for (int i = 0; i < squares.length; i++) {
我们最近有点学习了面向对象编程,并且已经有了一个项目,因此我不太熟悉OOP。不过,我们被分配了一个创建战舰游戏的项目。战列舰卡在战斗板实施
我创造了一艘船,方形和战斗板类。我已经测试了所有三种测试,并且所有测试都通过了,除了在测试板上的一种测试方法。为了测试每个类,我使用了toString方法。这是我在战斗中板的toString方法:
for (int i = 0; i < squares.length; i++) {
只是一对夫妇的,我发现问题,可以有更多的代码仍然是不完整的:
A.在
最开始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++;
}
}
}
那么这艘船被反复添加给不相关的板同一品牌的新广场。后来,那个广场不会被添加到任何地方,现在也无法使用。
我不知道如何解决这个问题,但可能所有的方块在调用此方法之前都应该已经初始化了,在这个方法中不应该创建方块;相反,你需要找到一个对应于当前迭代的正方形“”。
C.下面的代码
} 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()
会更合乎逻辑。
我建议您使用调试器来查看代码中发生了什么。
我很困惑你说C是什么意思?for循环不会照顾广场的位置吗?如果我添加square = squares [I] [j] – Levy
在C'square = new Square();'创建一个全新的对象,它不知道当前迭代的任何内容,'i'和'j'。在C上:可能'square'数组不会被初始化。我建议在创建电路板时初始化电路板上的所有方块。 –
我删除了所有'square = new Square();'并添加了正方形[I] [j] = new Square();初始化他们,但输出仍然是“1 1 1 1”而不是“ - - - - ”或“2 - - - ”而不是“2 2 - - ” – Levy
我是否正确理解在**循环迭代之后'square'被分配了'new Square()** **?在第一次迭代之前它有什么价值?另外,“船”变量是什么? –
平方和船是私人实例= null; 船舶返回其长度,撞击次数,开始列/行(左上角)和方向。 Square知道它是否有一艘船并且它是否被击中。 – Levy
我怀疑'ship'是'null',否则这个'ship.getLength()'会抛出异常;而是附加'“1”'输出。无论如何,代码是不完整的;你能否显示所有相关的代码? –