子手游戏:卡住随机选择的玩家

时间:2018-10-17 19:52:31

标签: java hashmap console-application

对于我的学校考试,我必须用Java制作一个Hangman控制台游戏,其中一个玩家应该可以与另一位玩家或一台计算机(2个玩家)对战。但是,玩家也应该能够与计算机/ AI对抗。最重要的是,计算机也应该能够与计算机对战。

鉴于上述情况,我已经定义了HashMaps,其播放器名称为String索引,而各个对象为值,如下所示:

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

由于2个播放器和2台计算机都可以互相对抗,因此两个HashMap的容量都为2。现在,在创建播放器时,应该输入真实姓名(例如“ John”,“ Mary”)或一个简单的名字如果播放器是计算机控制的,则为“ C”。然后,我检查输入的输入是否为“ 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);

绝对有一种更简单的方法可以做到这一点,我已经完全陷入困境,看不到任何出路。然后,我必须随机选择2个播放器中的一个作为第一个播放。我是通过以下方法“抽奖”来实现的。

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 :(得分:2)

我建议您定义两个类玩家派生的超类“玩家”。

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];

然后,您不必按名称来引用玩家,然后可以对数组进行混洗以确定谁先走。