Как убрать бесконечный вывод
Решил сделать что-то вроде игры «быки и коровы». Пользователю предлагается угадать вариант компьютера. Но в конце цикла у меня почему-то бесконечно выводится строка n быков, n коров. С чем это связано и как это исправить?
import java.util.Scanner;
import java.util.ArrayList;
public class NewClass {
public static void main (String [] args) {
ArrayList <String> number = new ArrayList<String> ();
int i = (int)(Math.random()*10);
String s = String.valueOf(i);
number.add(s);
while(number.size()<4){
if(!number.contains(s)){
number.add(s);
}
i = (int) (Math.random() * 10);
s = String.valueOf(i);
}
ArrayList <String> gNum = new ArrayList <String> ();
boolean isCon = true;
int bulls = 0;
int cows = 0;
do{
while (gNum.size()<4){
int guessi = scan.nextInt();
String guesss = String.valueOf(gi);//запрашиваем число у пользователя и преобразуем его в строку
if(!gNum.contains(gs)){
gNum.add(gs);
}
}
for (int g = 0; g <4; g++){
String tig = gNum.get(g);
if(number.contains(tig)){
if(number.indexOf(tig) == g){
bulls++;
} else {
cows++;
}
}
}
if (bulls == 4){
System.out.println("You win!");
isCon = false;
}
System.out.println(bulls + " "+ cows);
bulls = 0;
cows = 0;
}
}while(isCon == true);
}
}
Ответы (1 шт):
Вы не очищаете коллекцию, в которую записывается пользовательский ввод, таким образом, ее размер всегда равен 4, поскольку условия выигрыша не срабатывает, а условие пользовательского ввода зависит от размера коллекции (тоже не срабатывает), вы попадаете в бесконечный цикл.
Кроме того, на мой взгляд использовать списки в данном случае нерационально. Да, у вас есть индексы, но вы все равно не можете избежать итерации по списку (про бессмысленое преобразование цифр в строку и подобные вещи я вообще молчу). Может лучше так:
import java.util.Scanner;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
public class NewClass {
private static final Scanner SCANNER = new Scanner(System.in);
private static final int NUMBER = 4;
public static void main(String[] args) {
Set<Integer> hiddenNumber = new LinkedHashSet<>();
while (hiddenNumber.size() < NUMBER) hiddenNumber.add((int) (Math.random() * 10));
Set<Integer> userNumber = new LinkedHashSet<>();
int bulls = 0, cows = 0;
while (true) {
while (userNumber.size() < NUMBER) userNumber.add(SCANNER.nextInt());
Iterator<Integer> hiddenNumberIterator = hiddenNumber.iterator();
Iterator<Integer> userNumberIterator = userNumber.iterator();
for (int i = 0; i < NUMBER; i++) {
Integer numb = userNumberIterator.next();
if (hiddenNumberIterator.next().equals(numb)) bulls++;
else if (hiddenNumber.contains(numb)) cows++;
}
if (bulls == NUMBER) {
System.out.println("You win!");
break;
}
System.out.println("Bulls : " + bulls + "; cows : " + cows);
userNumber.clear();
bulls = 0;
cows = 0;
}
}
}