Java: цикл Do-while с несколькими условиями

Я пытаюсь создать игру «ножницы-бумага-камень» на Java с циклом do-while. Компьютер случайным образом выберет 1, и пользователь сделает свой выбор. Условие выхода: пользователь выигрывает дважды (userWin) или компьютер выигрывает дважды (compWin). Если есть ничья, ни один счетчик не увеличивается.

// Scissors, paper, stone game. Best of 3.
// scissors = 0; paper = 1; stone = 2;
import java.util.Scanner;
public class Optional2 {

    public static void main(String[] args) {

            int userWin = 0;
            int compWin = 0;

            do {
                //comp choice
                int comp = 1;       //TEST CASE
            //  int comp = (int) (Math.random() * (2 - 0 + 1) + 0);

                //user choice
                System.out.println("0 for scissors, 1 for paper, 2 for stone");
                Scanner sc = new Scanner(System.in);
                int user = sc.nextInt();

                    //Draw
                    if (comp == user) {
                        System.out.println("Draw");
                    //Win =)
                    } else if (comp == 0 && user == 2 || comp == 1 && user == 0 || 
                                comp == 2 && user == 1) {
                        System.out.println("WIN!");
                        userWin++;
                    //Lose =(
                    } else {
                        System.out.println("Lose =(");
                        compWin++;
                    }
            } while (compWin < 2 || userWin < 2);

            System.out.println("You won " + userWin + " times!");   
    }
}

Для int comp оно должно быть случайным, но я устанавливаю его на 1 (бумага) для удобства тестирования.

Однако в настоящее время из цикла выйдет только 1-е условие, если оно станет истинным. Я ожидаю, что 2-е условие также выйдет из цикла, если оно станет истинным с оператором ||, но цикл просто продолжает зацикливаться, даже если оно выполняется.

т.е. если я поставлю while (userWin < 2 || compWin < 2), он выйдет, если пользователь выиграет дважды, но не если компьютер выиграет дважды. Если я поставлю while (compWin ‹ 2 || userWin ‹ 2), он завершится, если компьютер выиграет дважды, но не если пользователь выиграет дважды.

Я тоже пытался изменить его на while ((userWin < 2) || (compWin < 2)), но это не сработало.


person Zheng    schedule 03.03.2016    source источник
comment
замените ||, что означает или, на &&, что означает и   -  person Alex Salauyou    schedule 03.03.2016
comment
В то время как условия не должны контролировать выход из цикла, а контролировать пребывание в цикле. Трудно рационализировать, если вы не видите их такими, какие они есть. Вы остаетесь в курсе, пока у компьютера или пользователя меньше двух побед, поэтому, если кто-то из них получит две победы, все.   -  person apokryfos    schedule 03.03.2016
comment
Вы понимаете, что вы закодировали условие для остановки цикла while только тогда, когда ОБА compWin и userWin равны 2 или больше?   -  person Alderath    schedule 03.03.2016
comment
не могли бы вы просто обработать условия внутри цикла с помощью операторов if и переключить логическую переменную в качестве условия выхода?   -  person user3479671    schedule 03.03.2016


Ответы (3)


но петля просто продолжает зацикливаться, даже если она сбывается

Циклы while продолжают выполняться, пока условие остается true.

Я думаю, проблема в том, что вы должны переписать условие на:

while ((userWin < 2) && (compWin < 2))

с && вместо ||. Действительно: теперь цикл while выглядит примерно так: «Продолжайте цикл до тех пор, пока пользователь не выиграет два или более раз, а компьютер не выиграет два или более раз.».

person Willem Van Onsem    schedule 03.03.2016

Вместо этого вы должны использовать &&:

while (userWin < 2 && compWin < 2);

Это потому, что вы хотите быть в курсе, до тех пор, пока ни один из пользователей или участников не получит 2 победы подряд

Это переводится на

userWin < 2 && (=AND) compWin < 2

Это означает: пока оба пользователь И компания имеют менее 2 последовательных побед, остается в цикле.

Или, другими словами, как вы это сформулировали: если какой-либо пользователь или компаньон получает два последовательных выигрыша, выходит из цикла.

person Ian    schedule 03.03.2016

Попробуйте заменить на &&. Вам нужно меньше 2, чтобы цикл продолжался

person Filippo Fratoni    schedule 03.03.2016