Игра Палач: застрял на случайном выборе игроков - PullRequest
0 голосов
/ 17 октября 2018

Для школьного экзамена мне нужно создать консольное приложение Hangman на Java, в котором игрок должен играть против другого игрока или компьютера (2 игрока).Игрок должен также иметь возможность играть против компьютера / AI.Кроме того, компьютеры должны иметь возможность играть против компьютера.

Учитывая вышеизложенное, я определил HashMaps с именами игроков в виде строковых индексов и соответствующих объектов в качестве значений, например:

private HashMap<String, PlayerHuman> humans = new HashMap<>(2);
private HashMap<String, PlayerComputer> computers = new HashMap<>(2);

Поскольку оба игрока и два компьютера могут играть друг против друга, оба HashMaps имеют емкость 2. Теперь при создании игроков должны быть введены настоящие имена (например, «Джон», «Мэри») илипростая буква «С», если игрок управляется компьютером.Затем я запускаю проверку, был ли введенный ввод «C» или нет, в результате чего был создан соответствующий класс для этого игрока, например:

    Scanner scanner = new Scanner(System.in);

    System.out.println("First create the players for the game!");

    //
    System.out.println("Type the name of player 1 (type C for computer): ");
    String playerName1 = scanner.nextLine();

    System.out.println("Type the nam of player 2 (type C for computer): ");
    String playerName2 = scanner.nextLine();

    if (playerName1.equals("C")) {

        PlayerComputer player1 = new PlayerComputer();
        player1.setPlayerName(playerName1);

        if (playerName2.equals("C")) {
            playerName1 = "C1";
            playerName2 = "C2";
            PlayerComputer player2 = new PlayerComputer();
            player1.setPlayerName(playerName1);
            player2.setPlayerName(playerName2);
            this.computers.put(playerName2, player2);

        } else {
            PlayerHuman player2 = new PlayerHuman();
            player2.setPlayerName(playerName2);
            this.humans.put(playerName2, player2);
        }

        this.computers.put(playerName1, player1);

    } else {
        PlayerHuman player1 = new PlayerHuman();
        player1.setPlayerName(playerName1);

        if (playerName2.equals("C")) {
            PlayerComputer player2 = new PlayerComputer();
            player2.setPlayerName(playerName2);
            this.computers.put(playerName2, player2);

        } else {
            PlayerHuman player2 = new PlayerHuman();
            player2.setPlayerName(playerName2);
            this.humans.put(playerName2, player2);
        }

        this.humans.put(playerName1, player1);

    }

    String startingPlayer = raffle(playerName1, playerName2);

Определенно, существует более простой способ сделать это,Я только что побежал полностью застрял и больше не вижу выхода.Затем я должен случайно выбрать одного из двух игроков, чтобы играть первым.Я делаю это в следующем методе «Лотерея».

private String raffle(String nameOne, String nameTwo) {
    Random random = new Random();
    String raffledName = random.nextBoolean() ? nameOne : nameTwo;

    System.out.println(raffledName + " may begin!");

    return raffledName;
}

После этого я бегу, застрял.Я получаю ожидаемый результат от метода "лотереи";одно из двух имен игроков, однако я заблудился о том, как заставить код знать, из какого массива извлечь возвращаемого игрока, поскольку компьютер может называться «C» или «C1» и «C2», когда оба игрокауправляются компьютером, чтобы знать, какой компьютер представляет какого игрока.Как мне сделать так, чтобы мой код учитывал это при извлечении соответствующего экземпляра игрока?

Любые предложения по созданию плееров также приветствуются, так как я чувствую, что написанный выше код грязен и слишком процедурный.

Заранее спасибо!

1 Ответ

0 голосов
/ 17 октября 2018

Я хотел бы предложить, чтобы вы определили суперкласс "Player", из которого происходят два типа ваших игроков.

abstract class Player {
    private String name;
    public void setPlayerName(String name) {
        this.name = name;
    }
    public String getPlayerName() { return name; }

    abstract public boolean isCPU();
    ...
}


class PlayerHuman extends Player {
    public boolean isCPU() { return false; }
    ...
}

class PlayerComputer extends Player {
    public boolean isCPU() { return true; }
    ...
}

HashMap<String, Player> players = ...

Или вы можете просто использовать массив для игроков:

Player[] players = new Player[2];

Тогда вам не нужно обращаться к игроку по имени, и вы можете перетасовать массив, чтобы решить, кто идет первым.

...