我在StackOverflow上看过其他问题,但我找不到解决我问题的方法。我有在do{
外部初始化的变量,并且它们正在内部使用,但是当变量达到一定值时,while方法不会跳出来。
我有:
int aiShotHit = 0;
int shotHit = 0;
do{
showBoard(board);
bAi.showAi(ai);
shoot(shoot,ships);
bAi.aiHit(aiShoot);
attempts++;
if(hit(shoot,ships)){
hint(shoot,ships,aiShips,attempts);
shotHit++;
System.out.println("nShips Left on the Board: " + shotHit);
}
else
hint(shoot,ships,aiShips,attempts);
changeboard(shoot,ships,board);
if(bAi.aiHit(aiShoot,aiShips)){
hint(shoot,ships,aiShips,attempts);
aiShotHit++;
}
else
System.out.print("");
bAi.changeAi(aiShoot,aiShips,ai);
}while(shotHit !=3 || aiShotHit !=3);
if (shotHit == 3){
System.out.println("nnnBattleship Java game finished! You Beat the Computer");
}
System.out.print("You lost! The Ai beat you");
一开始你可能会说,我想让这个循环直到shotHit为3或者直到aiHShotHit为3。那就是
while (!(shotHit == 3 || aiShotHit == 3));
这是"循环,而不是情况下,无论是shotHit或aishhothit包含值3",但它是一种丑陋的,所以你想应用负运算符到每个子表达式,并摆脱一些父。错误的想法是,你可以移动负运算符,而不改变其他任何东西,以获得
while (shotHit != 3 || aiShotHit != 3);
只有在shotHit为3的同时,aiShotHit为3的情况下才退出循环。这不是你想要的。
正确的转换是while (shotHit != 3 && aiShotHit != 3);
这些都在评论中提到了。如何安全地转换这种表达式的准则是De Morgan规则,它描述了如何根据彼此来转换连词和析词。遵循这些规则,您就可以在不改变表达式含义的情况下移动反运算符和更改括号:
"not (A or B)" is the same as "(not A) and (not B)"
"not (A and B)" is the same as "(not A) or (not B)"
需要重新组织表达式以使其更具可读性在编程中出现了很多,这是一个你需要的工具,以便安全地完成它。如果你想了解更多关于De Morgan的规则,你可能会想看看这个答案。