перерыв, приводящий к бесконечному циклу? - PullRequest
0 голосов
/ 15 февраля 2019

Я делаю проект для онлайн-курса.Я не хочу, чтобы сгенерированные компьютером координаты (xOfCompShips, yOfCompShips) повторялись или были такими же, как введенные пользователем (xOfPlayerShips, yOfPlayerShips).Таким образом, в случае, если сгенерированы те же координаты, оператор if уменьшит значение i и заставит цикл запуститься еще раз, заменив дублированные координаты.Распечатав строки для отладки, я обнаружил, что оператор break, по-видимому, разрывает цикл for с помощью k, и элемент управления возвращается к циклу for с i и без каких-либо новых значений, назначаемых xOfCompShips, yOfCompShips (или, возможно, таким же значениям, переназначаемым вих), элемент управления возвращается к циклу for с k и снова обратно к циклу for с i, и он продолжает идти вперед и назад.

Я пытался удалить оператор 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;
        }
    }
}

Я ожидаю, что новые случайные значения будут назначены для xOfCompShips и yOfCompShips для каждого оператора if.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Вы пытались также вырваться из внешнего цикла (то есть k--;), если я правильно понимаю (что я не думаю, что я понимаю), вы меняете я снова и снова, но 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;
    }
  }
}
0 голосов
/ 15 февраля 2019
  1. (int) Math.floor (Math.random () * C) - неправильный способ сделать это, это не даст вам достаточно равномерный вывод, и это также излишне сложно.Создайте экземпляр java.util.Random (и не продолжайте его воссоздавать; создайте один экземпляр один раз и используйте его повторно), и на этом вызовите rnd.nextInt(10).От 0 до xOfPlayersShips, а затем используйте k в качестве индекса для xOfCompShips.Я сомневаюсь, что это правильно.

  2. как часть вашего цикла, вы говорите: if (xOfCompShips [i] == xOfCompShips [k] && yOfCompShips [i] == yOfCompShips [k]) перезапустить цикл .если i и k одинаковы, очевидно, что это правда.я начинаю с 0, k начинается с 0 .. 0 == 0.

Запуск с отладчиком показал бы это довольно быстро.

...