Метод Random () постоянно меняет финальную строку в Java

1

Я пытаюсь создать игру с ножницами из каменной бумаги и больше научиться тому, как работают подпрограммы на Java. Чтобы проверить, правильна ли логика, я написал в двух частях программы, где проверяется текущая позиция игрока противоположного игрока. Тем не менее, он отличается каждый раз, даже если я назначил его окончательной строке в отдельном методе.

import java.util.Scanner;

public class RockPaperScissors {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        String choice = "start";

        System.out.println("Welcome to a friendly game of Rock, Paper, Scissors!");
        System.out.println("Type in 'start' , 'continue' or 'yes' to play the game, and 'quit' or 'no' to quit the game");

        choice = input.nextLine();

        try {
            while (choice.equalsIgnoreCase("start") || choice.equalsIgnoreCase("continue") || choice.equalsIgnoreCase("yes")) {

                System.out.println("Rock, Paper or Scissors?");

                String answer = input.nextLine();

                System.out.println("Enemy player chose " + set()); // checks current position
                comparison(answer);
                System.out.println("Would you like to continue?");
                choice = input.next();

            }
            System.out.println("Thank you for playing!");
            System.out.println("Have a wonderful day!");
            System.exit(1);
        } catch (Exception e) {
            System.out.println("Invalid player input.");
        }
    }

    static String random() {
        int random = (int) (Math.random() * 3);
        String current = null;
        switch (random) {
        case 0:
            current = "Rock";
            break;
        case 1:
            current = "Paper";
            break;
        case 2:
            current = "Scissors";
            break;
        }
        return current;
    }

    static String set() {
        final String a = random();
        return a;
    }

    static void comparison(String filler) {
        String answer = null;
        System.out.println(set()); // checks current position

        if (filler.equalsIgnoreCase(random())) {
            System.out.println("Draw!");
            System.out.println();
            System.out.printf("You both chose %s ", random());
            System.out.println();
        } else if (filler.equalsIgnoreCase("Rock")) {
            if (set().equals("Scissors"))
                System.out.println("Rock beats Scissors, you win!");
            else
                System.out.println("Paper beats Rock, you lose...");
        } else if (filler.equalsIgnoreCase("Paper")) {
            if (set().equalsIgnoreCase("Rock"))
                System.out.println("Paper beats Rock, you win!");
            else
                System.out.println("Scissors beat Paper, you lose...");
        } else if (filler.equalsIgnoreCase("Scissors")) {

            if (set().equalsIgnoreCase("Paper"))
                System.out.println("Scissors beat paper, you lose...");
            else
                System.out.println("Rock beats scissors, you lose...");
        } else
            System.out.println("Unknown player input.");

    }

}
  • 0
    Вы можете использовать только метод random (), который имеет тот же эффект, что и set (), возвращая случайное строковое значение: камень, бумага или ножницы.
Теги:
methods
function
subroutine

4 ответа

1
Лучший ответ

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

//...
String enemy = random();
System.out.println("Enemy player chose " + enemy); //checks current position
comparison(answer, enemy);
//...
static void comparison(String answer, String enemy) {
     //do not call random() or set() in here
     //just use the answer and enemy parameters
}
  • 0
    Я готовил тот же ответ, твой, наверное, самый близкий к решению проблемы.
  • 0
    Спасибо, в итоге просто добавили дополнительный параметр и удалили метод set ().
1

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

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

Это работает лучше, если вы не станете все static. Но чтобы ваш текущий код работал, вы можете:

private static String choice;

static String set()
{
    if (choice == null) {
        choice = random();
    }
    return choice;
}
1

Проблема в

static String set()
{
    final String a = random();

    return a;
}

каждый раз вы вызываете эту функцию, создается НОВАЯ конечная String a. Переменная a создается только локально и отправляется, когда метод выполняется, хотя система не помнит, что она была окончательной

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

public static void main(String args[]){
.
.
final String pick=set();
try
0

Ваш метод set() неверен. он использует внутреннюю переменную "a", которая стирается (создается новая в стеке) каждый раз, когда вызывается метод. Вам нужно изменить переменную a в переменную класса. В любом случае окончательный вариант здесь просто не работает, вам нужно проверить, является ли переменная a нулевой и только затем назначить значение.

  • 1
    Также метод set() в любом случае бессмысленен ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню