java - 不允许同一玩家同时担任游戏中的两个玩家

标签 java oop

我正在制作一个 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/

相关文章:

java - Eclipse RCP : Open Split Screen Editor

java - LibGDX - JFrame 中的 Lwjgl Canvas 无法跨平台工作

java - 如何从变量设置数据库登录信息?

PHP 最佳设计实践

java - DDD 对于基于搜索的应用程序有好处吗?

java - Jetty:如何写入访问日志

java - JDBC Insert with Prepared Statement 说我有 SQL 语法错误

objective-c - 类对象的快速枚举

oop - 接口(interface)隔离原则——程序到接口(interface)

python 将方法从 classB 作为参数传递给 classA,然后从传递的 classB 方法调用 classA 中的方法