我正在制作一个 OOP 模型,玩家可以在游戏平台中加入游戏。标准之一是不允许同一个人同时玩游戏,现在我陷入了如何扩展这一点的问题,因为有任意数量的最大玩家
在玩家类中..
公共(public)类 GameExt2{
private final int minAge;
private final PlayerExt2[] players;
private String gameName;
private int gameId;
private double fee;
private double amountOwed;
private double totalFeesOwed;
private int numberOfPlayersPlaying;
private String playerNames;
private int oweLimit;
private int maxNumberPlayers;
public GameExt2( String gameName, int gameId, int minAge, double fee, int oweLimit, int maxNumberPlayers){
this.gameId=gameId;
this.gameName=gameName;
this.minAge=minAge;
this.fee=fee;
this.oweLimit=oweLimit;
this.players=new PlayerExt2[maxNumberPlayers];
public String matchId(PlayerExt2 player){
return("Sorry " + player.getName()+ ", you cannot be both players");
}
public String isTooYoung(PlayerExt2 player){
return("Sorry " + player.getName()+ ", you are too young to play" +gameName);
}
public String maxPlayersReached(PlayerExt2 player){
return("Sorry " + player.getName()+ ", there are already "+maxNumberPlayers+ " playing");
}
private void playerJoined(PlayerExt2 player){
System.out.println(player.getName() + " has joined the game " + gameName);
}
public void addPlayer(PlayerExt2 player) {
int nextFreeSlot = getNextFreeSlot();
if (nextFreeSlot > 0) {
if (isEligible(player)) {
if (!isAlreadyPlaying(player)) {
players[nextFreeSlot] = player;
playerJoined(player);
player.addGameJoined();
player.addFeeOwed(fee);
player.setNameGamePlaying(gameName); //necessary for printing details of the player
}
else {
matchId(player);
// Already playing
}
}
else {
isTooYoung(player);
//player inelligible to play
}
}
else {
maxPlayersReached(player);
// game already full
}
}
private boolean isAlreadyPlaying(PlayerExt2 newPlayer) {
for (PlayerExt2 player : players) {
if (player.getId() == newPlayer.getId()) return true;
}
return false;
}
private int getNextFreeSlot() {
for (int i = 0; i < players.length; i++) {
if (players[i] == null) return i;
}
return -1; // negative indicates there's no free slot
}
private boolean isEligible(PlayerExt2 player) {
return player.getAge() > minAge;
}
Player class...
public String addFeeOwed(double fee){
amountOwed=amountOwed+fee;
return("For playing this game of "+nameGamePlaying+ ", "+playerName+"'s balance now stands at £"+amountOwed);
}
public void addGameJoined(){
gamesJoined++;
}
主要部分...
GameExt2 snakesAndLadders=new GameExt2("SnakesAndLadders",4564345,8,3,10,4);
PlayerExt2 marina= new PlayerExt2(123, "Marina", 15, 4,1999,0);
marina.calculateAge();
System.out.println(marina.printDetails());
snakesAndLadders.addPlayer(marina);
PlayerExt2 erin=new PlayerExt2(163,"Erin",3,6,2010,0);
erin.calculateAge();
System.out.println(erin.printDetails());
snakesAndLadders.addPlayer(erin);
PlayerExt2 matthew=new PlayerExt2(312,"Matthew",27,5,2002,12);
matthew.calculateAge();
System.out.println(matthew.printDetails());
snakesAndLadders.addPlayer(matthew);
最佳答案
如果您认为这应该在概念上进行构建,那么这些并不是玩家应该自己强制执行的约束。在现实生活中,球员并不关心自己是否太年轻而不能参加比赛。在锦标赛中,这将是某些管理员或裁判的责任。我们不必对此进行精确建模,但重点是它应该超出玩家的控制范围。我会将此逻辑放入 Game
类中,将 Player
添加到该类中。
您可以看到这已经对您的代码产生了奇怪的影响。您的玩家有一个 numberOfPlayers
字段。这有道理吗? numberOfPlayers
是一个人的属性(property)吗?您的护照或驾照上有这些信息吗?
这是一个粗略的结构(不是完整的代码)
class Game
{
private final int minAge;
private final Player[] players;
public Game(int numberOfPlayers, int minAge) {
//create array of the correct size, it will be filled with nulls
this.players = new Player[numberOfPlayers];
this.minAge = minAge;
}
void addPlayer(Player player) {
int nextFreeSlot = getNextFreeSlot();
if (nextFreeSlot > 0) {
if (isEligible(player)) {
if (!isAlreadyPlaying(player)) {
players[nextFreeSlot] = player;
}
else {
// Already playing
}
}
else {
// Ineligible
}
}
else {
// Full
}
}
private boolean isAlreadyPlaying(Player newPlayer) {
for (Player player : players) {
if (player.getId() == newPlayer.getId()) return true;
}
return false;
}
private int getNextFreeSlot() {
for (int i = 0; i < players.length; i++) {
if (players[i] == null) return i;
}
return -1; // negative indicates there's no free slot
}
private boolean isEligible(Player player) {
return player.getAge() > minAge;
}
}
关于java - 不允许同一玩家同时担任游戏中的两个玩家,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53061417/