Java (затмение) код для ножниц камень-бумага, выбор простого ввода и создание вывода камень-бумага или ножницы

avatar
M.J
7 апреля 2018 в 23:50
1905
2
0

Мне нужно создать программу, которая запрашивает у пользователя строковое значение и возвращает строковое значение «камень», «бумага» или «ножницы», если ввод был «r», «p» или «s». Если пользователь набрал что-то другое.

 package loopsGamesProject;

    import java.util.Scanner;
    public class LoopsGamesProject_RockPaperScissors {

public static void main(String[] args) {
    String in="-";
    Scanner input= new Scanner(System.in);
    System.out.print("Enter 'r' for rock, and 'p' for paper,'s' for scissors:");
    in=input.next();
    if(in=="r"||in=="p"||in=="s"){
        if(in=="r"){
            in="Rock";
        }
        if(in=="p"){
            in="Paper";
        }
        if(in=="s"){
            in="Scissors";
        }
    while(in!="r"||in!="p"||in!="s") {
    System.out.print("Enter 'r' for rock, and 'p' for paper,'s' for scissors:");
    in=input.next();
    if(in=="r"||in=="p"||in=="s"){
        if(in=="r"){
            in="Rock";
        }
        if(in=="p"){
            in="Paper";
        }
        if(in=="s"){
            in="Scissors";
        }
    }
    }
    input.close();
    System.out.print(in);



    }

}

}

Проблема в том, что он запросит переменную, но завершится сам. Я попытался добавить переменную "out". Когда я попытался сделать это с помощью цикла do while, он продолжал запрашивать ввод, но ничего не возвращал. Я не могу найти проблему.

Источник
Ken White
7 апреля 2018 в 23:54
1

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

M.J
8 апреля 2018 в 00:03
0

Я обнаружил, что скобка для первого оператора if была неуместна. Я исправил это, и отладчик не может найти проблем. Теперь он продолжает повторять вопрос вечно.

Ken White
8 апреля 2018 в 00:16
0

Отладчик позволяет выполнять код построчно по мере его выполнения. Это точно скажет вам, почему он продолжает повторять вопрос вечно. Попробуйте снова.

Ответы (2)

avatar
Raymo111
8 апреля 2018 в 00:02
1

При сравнении строк в java необходимо использовать метод .equals() вместо функции ==. Это правило применяется ко всем объектам в java, включая String. Например:

if (in.equals("r"))
    //Rock!

Вам также необходимо заменить != и добавить оператор break для выхода из цикла. Подойдет что-то вроде этого:

while (!(in.equals("r") || in.equals("p") || in.equals("s"))) {
    System.out.print("Enter 'r' for rock, and 'p' for paper,'s' for scissors:");
    in = input.next();
    if (in.equals("r") || in.equals("p") || in.equals("s")) {
        if (in.equals("r"))
            in = "Rock";
        else if (in.equals("p"))
            in = "Paper";
        else
            in = "Scissors";
                break;
    }
}

РЕДАКТИРОВАТЬ: Вышеприведенный запрос дважды. Это исправит:

public static void main(String[] args) {
    String in = "";
    Scanner input = new Scanner(System.in);
    while (!(in.equals("Rock") || in.equals("Paper") || in.equals("Scissors"))) {
        System.out.print("Enter 'r' for rock, and 'p' for paper,'s' for scissors:");
        in = input.next();
        if (in.equals("r") || in.equals("p") || in.equals("s")) {
            if (in.equals("r")) {
                in = "Rock";
            }
            if (in.equals("p")) {
                in = "Paper";
            }
            if (in.equals("s")) {
                in = "Scissors";
            }
            break;
        }
    }
    input.close();
    System.out.print(in);
}
Raymo111
8 апреля 2018 в 00:24
0

Должно. Вы не сможете делать сравнения в java строк с помощью функции ==.

Raymo111
8 апреля 2018 в 01:17
0

Без проблем. Не стесняйтесь отвечать в этой теме, если у вас есть дополнительные вопросы. Спасибо, что приняли мой ответ. Кроме того, убедитесь, что вы понимаете каждую часть используемого вами кода; только тогда ты научишься.

M.J
8 апреля 2018 в 01:20
0

Я добавил разрывы, но программа теперь спрашивает по крайней мере дважды, даже если первый ввод был r, s или p.

M.J
8 апреля 2018 в 01:34
0

Это мой первый вопрос, и моя репутация слишком низка, чтобы задать еще один вопрос до завтра. Можно ли объяснить проблему устно?

avatar
Zachary
8 апреля 2018 в 00:55
0

Как уже упоминалось, вам нужно сравнить равенство строк, используя String.equals(Object anObject) - в качестве альтернативы вы можете использовать другие методы (compareTo), но оператора == будет недостаточно (Посмотрите здесь, почему).

Кроме того, когда вы сопоставляете строку, вы перезаписываете строку полным словом - in = 'r'; -> in = 'Rock';. Но условие, которое вы используете для цикла, завершится только тогда, когда in будет конкретно r, p или s.

Кроме того, у вас есть дублирующийся код, который можно значительно сократить. Это не ошибка, но очень быстро с этим может стать очень трудно справиться.

Все учтено:

    while (true) {
        // Get the next input
        in = input.next();

        // Maps the word to the character
        // If a word was not mapped, try again.
        if (in.equals("r"))
            in = "Rock";
        else if (in.equals("p"))
            in = "Paper";
        else if (in.equals("s"))
            in = "Scissors";
        else
            continue;
        // Terminate the loop as you can infer a match was found.
        break;
    }