我试图在网格上移动对象并计算战斗次数(当它们接触时),但是每当我进行一次互动时,它们都会对其计数两次。我知道为什么,但是想不出办法。
代码:
// Move all the objects
for(int i = 0; i < objectArray.length; i++) {
objectArray[i].move();
}
// Check to see if any of the objectsare touching
for(int i = 0; i < objectArray.length; i++) {
for(int j = 0; j < objectArray.length; j++) {
if(objectArray[i] != objectArray[j]) {
if(objectArray[i].getX() == objectArray[j].getX() && objectArray[i].getY() == objectArray[j].getY()) {
System.out.println("FIGHT");
System.out.println("There is a fight between " + objectArray[i].getName() + " and " + objectArray[j].getName() + "." );
fights++;
}
}
}
}
}
答案 0 :(得分:1)
您要遍历整个列表,对于列表中的每个元素,您...要遍历整个列表。再次。
不要这样做-如果您希望列表中的每个项目与列表中的其他项目“相遇”,那么,请考虑一下第一个循环:第一个“战斗机”将在您的循环中相遇本身(j = 0),然后遇到所有其他战斗机。您可以使用if(第一个if)消除“满足自己”选项。
然后,下一架战斗机(i = 1)将再次从头开始:它将遇到第一架战斗机(j = 0),重复我们已经看到的战斗,然后相遇,然后再与场上的其他人相遇。
解决方案是不从“ 0”开始内循环,而是从自己之后的下一个战斗机开始:第二个战斗机应该首先遇到第三个战斗机(并跳过第一个战斗机和它自己)。因此,您只需要int j = i + 1
,而不是int j = 0
。然后,您还可以完全消除“不要与自己打架”的问题,因为现在不可能发生这种情况。
答案 1 :(得分:-1)
您可以设置循环属性,可能不是最好的答案,但可以确保不比较数组中相同的两个对象。
代码: //循环属性 字符串lastFightObejectOne =“”,lastFightObjectTwo =“”;
// Move all the objects
for(int i = 0; i < objectArray.length; i++) {
objectArray[i].move();
}
// Check to see if any of the objects are touching
for(int i = 0; i < objectArray.length; i++) {
for(int j = 0; j < objectArray.length; j++) {
if(objectArray[i] != objectArray[j]) {
if(objectArray[i].getX() == objectArray[j].getX() && objectArray[i].getY() == objectArray[j].getY()) {
if(!lastFightObejectOne.equal(objectArray[i].getName()) && (!lastFightObejectTwo.equal(objectArray[j].getName())) {
System.out.println("FIGHT");
System.out.println("There is a fight between " + objectArray[i].getName() + " and " + objectArray[j].getName() + "." );
lastFightObjectOne = objectArray[i].getName();
lastFightObectTwo = objectArray[j].getName();
fights++;
}
}
}
}
}
}