break 导致无限循环?

break resulting in an infinite for loop?

我正在为在线课程制作一个项目。我不希望计算机生成的坐标(xOfCompShips、yOfCompShips)重复或与用户输入的坐标(xOfPlayerShips、yOfPlayerShips)相同。因此,如果生成相同的坐标,则 if 语句将减小 i 的值并再次进行循环 运行,替换重复的坐标。通过打印用于调试的行,我发现 break 语句似乎用 k 打破了 for 循环,并且控制返回到带有 i 的 for 循环并且没有任何新值被分配给 xOfCompShips,yOfCompShips(或者可能相同的值被重新分配给他们),控制权返回到 k 的 for 循环,然后再次回到 i 的 for 循环,并且它一直来回。

我尝试删除 break 语句,但如果第一个随机坐标是重复的对,则访问数组的索引 = -1。

for(int i = 0; i < xOfCompShips.length; i++) {
    xOfCompShips[i] = (int)Math.floor(Math.random() * 10);
    yOfCompShips[i] = (int)Math.floor(Math.random() * 10);
    for(int k = 0; k < xOfPlayersShips.length; k++) {
        if((xOfCompShips[i] == xOfCompShips[k] && yOfCompShips[i] == yOfCompShips[k]) 
                || (xOfCompShips[i] == xOfPlayersShips[k] && yOfCompShips[i] == yOfPlayersShips[k])){
            i--;
            break;
        }
    }
}

我希望在每次执行 if 语句时将新的随机值分配给 xOfCompShips 和 yOfCompShips。

  1. (int) Math.floor(Math.random() * C) 是错误的方法,这不会让你得到非常统一的输出,而且它也是不必要的复杂。创建一个 java.util.Random 的实例(不要一直重新创建它;创建一个实例一次,然后重新使用它),然后调用 rnd.nextInt(10)

  2. 你从 0 到 xOfPlayersShips 循环 k,然后使用 k 作为 xOfCompShips 的索引。我怀疑这是对的。

  3. 作为循环的一部分,您说:if (xOfCompShips[i] == xOfCompShips[k] && yOfCompShips[i] == yOfCompShips[k]) 重新启动循环。如果 i 和 k 相同,显然是这样。 i 从 0 开始,k 从 0 开始.. 0 == 0.

带有调试器的 运行 会很快向您展示这一点。

你有没有试过也跳出外循环(即 k--;),如果我理解正确(我不认为我理解),你会一遍又一遍地改变 i 但 k 总是同样触发循环改变我更多。

    for(int i = 0; i < xOfCompShips.length; i++) {
  xOfCompShips[i] = (int)Math.floor(Math.random() * 10);
  yOfCompShips[i] = (int)Math.floor(Math.random() * 10);
  for(int k = 0; k < xOfPlayersShips.length; k++) {
    if((xOfCompShips[i] == xOfCompShips[k] && yOfCompShips[i] == yOfCompShips[k]) ||
    (xOfCompShips[i] == xOfPlayersShips[k] && yOfCompShips[i] == yOfPlayersShips[k])){
      i--;
      **k--;**
      break;
    }
  }
}