Не разрешать одному игроку быть обоими игроками в игре - PullRequest
0 голосов
/ 30 октября 2018

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

В классе игрока ..

публичный класс 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);

Ответы [ 2 ]

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

Несколько заметок:

  • joinGame () не должен входить в класс Player. Размещение этого метода не является расширяемым, однако, судя по тому, что в нем упоминается параметр nameGamePlaying, на который нет ссылки в Player, этот метод уже находится в Game.class или любом другом аналоге.
  • Если вы хотите сравнить, предназначены ли два экземпляра для представления одного и того же объекта, переопределите метод equals, поскольку многие методы в Java используют его для сравнения, поэтому это избавит вас от многих хлопот. Метод equals должен сравнивать, являются ли два экземпляра логически эквивалентными, поэтому в этом случае нам просто нужно сравнить playerId, однако другим классам могут потребоваться другие поля сравнения.
  • Не задавайте жесткие константы, такие как максимальное количество игроков. Ваш пример свидетельствует об этом, потому что вы на самом деле хотите максимум 2 игрока, но закодировали значение 3. Когда вы поймете эту ошибку, или если вы просто захотите увеличить количество максимальных игроков, вам придется отслеживать каждый появление 3 и заменить его. Вместо этого объявите константу MAX_PLAYERS на уровне класса и укажите ее, где это необходимо.
  • Вам нужно будет объявить получатели в Person.class для работы ниже.
  • Гнездо, если заявления, чтобы устранить повторение. Нет необходимости постоянно проверять максимальное количество игроков, как вы изначально делаете, если вы вкладываете свою последующую логику в оператор if, проверяющий максимальное количество игроков.

Код ниже, любые вопросы, пожалуйста, задавайте.


//In Game.class or equivalent
private final int MAX_PLAYERS = 2;
private List<Player> playerList; //Should be initialised with the main Game(?) class.
public String joinGame(Person player){
    if(playerList.size() < MAX_PLAYERS){
        if(!playerList.contains(player) && player.getPlayerAge() >= minAge){
            playerList.add(player)
            return (player.getPlayerName() + " has joined the game " + nameGamePlaying + ".");
        }else{
            return ("Sorry, " + player.getPlayerName()+ " is too young to play or is already playing " + nameGamePlaying);
        }
    } else {
        return ("Sorry, "+ player.getPlayerName()+ " cannot play " + nameGamePlaying + " as there are already two players.");
    }
}

//In Person.class
@Override
public boolean equals(Object obj){
    if(this == obj){
        return true;
    }
    if(obj == null){
        return false;
    }
    if(getClass() != obj.getClass()){
        return false;
    }
    Person toCompare = (Person) obj;

    if(this.playerId != toCompare.getPlayerId()){
        return false;
    }

    //Optional, depending on your construct.
    if(playerName == null){
        if(toCompare.getPlayerName != null){
            return false;
        }
    }else{
        if(!playerName.equals(toCompare.getPlayerName(){
            return false;
        }
    }

    //... More logical equality checks

    return true;
}
0 голосов
/ 30 октября 2018

Если вы думаете, что это должно быть структурировано концептуально, это не те ограничения, которые игрок должен сам применять. В реальной жизни игроку все равно, слишком ли они молоды, чтобы играть. В турнире за это отвечал какой-то администратор или, возможно, судья. Мы не должны моделировать это точно, но дело в том, что это должно быть вне контроля игрока. Я бы поместил эту логику в класс Game, к которому добавляется Player s.

Вы можете видеть, что это уже странно влияет на ваш код. Ваш игрок имеет поле numberOfPlayers. Имеет ли это смысл? Является ли numberOfPlayers собственностью человека? У вас есть эта информация в вашем паспорте или водительских правах?

Вот грубая структура (не полный код)

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...