中断会导致无限循环?

时间:2019-02-15 17:43:36

标签: java for-loop break

我正在为在线课程设计一个项目。我不希望计算机生成的坐标(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。

2 个答案:

答案 0 :(得分:0)

  1. (int)Math.floor(Math.random()* C)是错误的处理方式,它并不能使您获得统一的输出,并且它也不必要地复杂。制作一个java.util.Random的实例(不要再重新创建它;只创建一个实例,然后重用它),然后在其上调用rnd.nextInt(10)

  2. ,您将k从0循环到xOfPlayersShips,然后将k用作xOfCompShips的索引。我怀疑那是正确的。

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

使用调试器运行会很快向您显示。

答案 1 :(得分: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;
    }
  }
}