Почему условие в цикле while не выполняется?

386
07 апреля 2018, 22:59

Всем привет. Написал свою первую программу - "Камень, ножницы, бумага". Вроде всё работает, кроме одного НО: в цикле while не выполняется условие и программа не завершается. Помогите разобраться

public class Stone_scissors_paper {
public static int PersonCount;
public static int BotCount;
public static void main(String[] args) {
    Scanner scn = new Scanner(System.in);
    System.out.println("What's your name?");
    String name = scn.nextLine();
    System.out.println("Hello " + name + ". Let's play an interesting game? Say Yes or No?");
    String answer = scn.next();
    // Check the entered answer
    while (!answer.equalsIgnoreCase("Yes")){
        System.out.println("Your answer is incorrect, try once more)");
        answer = scn.next();
    }
    System.out.println("Okay, let's go. You first");
    String BotChoose;
    int round = 0;
    int[] game = new int[1];
    // Game till 3 wins
    while ((PersonCount != 3) || (BotCount != 3)) {
        round ++;
        System.out.println("Round " + round + " is:");
        String Mychoose = scn.next();
        if (Mychoose.equalsIgnoreCase("Stone"))
        {
            System.out.println("You pick " + Mychoose);
            BotChoose = Bot.ChooseBot();
            System.out.println("My pick is " + BotChoose);
            game = Compare.CompareGame(Mychoose, BotChoose);
        }
        else if (Mychoose.equalsIgnoreCase("Scissors"))
        {
            System.out.println("You pick " + Mychoose);
            BotChoose = Bot.ChooseBot();
            System.out.println("My pick is " + BotChoose);
            game = Compare.CompareGame(Mychoose, BotChoose);
        }
        else if (Mychoose.equalsIgnoreCase("Paper"))
        {
            System.out.println("You pick " + Mychoose);
            BotChoose = Bot.ChooseBot();
            System.out.println("My pick is " + BotChoose);
            game = Compare.CompareGame(Mychoose, BotChoose);
        }
        else {
            System.out.println("You input incorrect word, please try once more");
        }
        System.out.println("PersonCount = " + PersonCount + " BotCount = " + 
BotCount);
        System.out.println("Round " + round + " is over\n");
 // Программа корректно работает только с этим условием, хотя оно лишнее
        if(PersonCount == 3 || BotCount == 3)
            break;
    }
    if(game[0] == 3)
        System.out.println("Damn, you win!!!");
    else
        System.out.println("Ahaha, you lost!!!");
    }
}

Также прикладываю 2 метода, которые используются в программе. Может быть в них закралась какая-то ошибка, я не знаю. Метод CompareGame класса Compare:

public class Compare {
public static int[] CompareGame(String PersonChoose, String BotChoose){
    if (PersonChoose.equalsIgnoreCase("Stone")){
        if (BotChoose.equals("Stone")){
            System.out.println("Draw, please try once more");
        }
        if (BotChoose.equals("Scissors")){
            System.out.println("You win");
            Stone_scissors_paper.PersonCount += 1;
        }
        if (BotChoose.equals("Paper")){
            System.out.println("I win");
            Stone_scissors_paper.BotCount += 1;
        }
    }
    if (PersonChoose.equalsIgnoreCase("Scissors")){
        if (BotChoose.equals("Scissors")){
            System.out.println("Draw, please try once more");
        }
        if (BotChoose.equals("Paper")){
            System.out.println("You win");
            Stone_scissors_paper.PersonCount += 1;
        }
        if (BotChoose.equals("Stone")){
            System.out.println("I win");
            Stone_scissors_paper.BotCount += 1;
        }
    }
    if (PersonChoose.equalsIgnoreCase("Paper")) {
        if (BotChoose.equals("Paper")) {
            System.out.println("Draw, please try once more");
        }
        if (BotChoose.equals("Stone")) {
            System.out.println("You win");
            Stone_scissors_paper.PersonCount += 1;
        }
        if (BotChoose.equals("Scissors")) {
            System.out.println("I win");
            Stone_scissors_paper.BotCount += 1;
        }
    }
    return new int[] {Stone_scissors_paper.PersonCount, Stone_scissors_paper.BotCount};
    }
}

Метод ChooseBot класса Bot:

public class Bot {
private static String PickBot;
private static String[] BotPick = {"Stone", "Scissors", "Paper"};
private static Random RandNum = new Random();
public static String ChooseBot(){
    // Возвращает числа от 0 до 2
    int rnd = RandNum.nextInt(3);
    switch (rnd){
        case 0:
            PickBot = BotPick[0];
            return PickBot;
        case 1:
            PickBot = BotPick[1];
            return PickBot;
        case 2:
            PickBot = BotPick[2];
            return PickBot;
        default:
            System.out.println("Something went wrong");
            return "error";
        }
    }
}

Буду благодарен за любую помощь. Спасибо.

Answer 1

Абсолютно бесполезная штука : int[] game = new int[1]

import java.util.Scanner;
public class Stone_scissors_paper {
public static int PersonCount;
public static int BotCount;
public static void main(String[] args) {
    Scanner scn = new Scanner(System.in);
    System.out.println("What's your name?");
    String name = scn.nextLine();
    System.out.println("Hello " + name + ". Let's play an interesting game? Say Yes or No?");
    String answer = scn.next();
    // Check the entered answer
    while (!answer.equalsIgnoreCase("Yes")) {
        System.out.println("Your answer is incorrect, try once more)");
        answer = scn.next();
    }
    System.out.println("Okay, let's go. You first");
    String BotChoose;
    int round = 0;
    // Game till 3 wins
    while (PersonCount < 3 || BotCount < 3) {
        round++;
        System.out.println("Round " + round + " is:");
        String Mychoose = scn.next();
        if (Mychoose.equalsIgnoreCase("Stone") 
                || Mychoose.equalsIgnoreCase("Scissors")
                || Mychoose.equalsIgnoreCase("Paper")) {
            System.out.println("You pick " + Mychoose);
            BotChoose = Bot.ChooseBot();
            System.out.println("My pick is " + BotChoose);
            Compare.CompareGame(Mychoose, BotChoose);
        } else {
            System.out.println("You input incorrect word, please try once more");
        }
        System.out.println("PersonCount = " + PersonCount + " BotCount = " + BotCount);
        System.out.println("Round " + round + " is over\n");
        if (PersonCount == 3) {
            System.out.println("Damn, you win!!!");
            break;
        } else if (BotCount == 3) {
            System.out.println("Ahaha, you lost!!!");
        }
    }
}
}

Переписать метод на

public static void CompareGame(String PersonChoose, String BotChoose)

он все равно меняет вашу глобальную переменную, не надо ему ничего возвращать типа вашего извращения :) Compare класс:

public class Compare {
public static void CompareGame(String PersonChoose, String BotChoose) {
    if (PersonChoose.equalsIgnoreCase("Stone")) {
        if (BotChoose.equals("Paper")) {
            System.out.println("I win");
            Stone_scissors_paper.BotCount += 1;
        } else if (BotChoose.equals("Scissors")) {
            System.out.println("You win");
            Stone_scissors_paper.PersonCount += 1;
        } else {
            System.out.println("Draw, please try once more");
        }
    }
    if (PersonChoose.equalsIgnoreCase("Scissors")) {
        if (BotChoose.equals("Paper")) {
            System.out.println("You win");
            Stone_scissors_paper.PersonCount += 1;
        } else if (BotChoose.equals("Stone")) {
            System.out.println("I win");
            Stone_scissors_paper.BotCount += 1;
        } else {
            System.out.println("Draw, please try once more");
        }
    }
    if (PersonChoose.equalsIgnoreCase("Paper")) {
        if (BotChoose.equals("Stone")) {
            System.out.println("You win");
            Stone_scissors_paper.PersonCount += 1;
        } else if (BotChoose.equals("Scissors")) {
            System.out.println("I win");
            Stone_scissors_paper.BotCount += 1;
        } else {
            System.out.println("Draw, please try once more");
        }
    }
}
}

Бот класс:

import java.util.Random;
public class Bot {
private static String[] BotPick = {"Stone", "Scissors", "Paper"};
private static Random RandNum = new Random();
public static String ChooseBot(){
// Возвращает числа от 0 до 2
int rnd = RandNum.nextInt(3);
switch (rnd){
    case 0:
        return BotPick[0];
    case 1:
        return BotPick[1];
    case 2:
        return BotPick[2];
    default:
        System.out.println("Something went wrong");
        return "error";
    }
}
}
READ ALSO
файловая структура

файловая структура

Создал классы для описания файловой структурыНо,не могу никак понять как сделать,чтобы каталоги представляли собой несвязанный список,а...

448
@Autowired возвращает null

@Autowired возвращает null

Хрустальный шар говорит мне, что вы не понимаете разницы между сервлетом и контроллером Spring MVCОбъект вашего сервлета создаётся web-контейнером,...

349
JAVA адресная книга с поиском [дубликат]

JAVA адресная книга с поиском [дубликат]

На данный вопрос уже ответили:

515