对于我的学校考试,我必须用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”时,计算机是计算机控制的,要知道哪个计算机代表哪个播放器。检索玩家各自的实例时,如何使我的代码考虑到这一点?
任何有关创建播放器的建议也将受到欢迎,因为我认为上述编写的代码很脏而且程序太简单。
谢谢!
答案 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];
然后,您不必按名称来引用玩家,然后可以对数组进行混洗以确定谁先走。