java做而困惑



我在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的规则,你可能会想看看这个答案。

相关内容

  • 没有找到相关文章

最新更新