Как передать значения с помощью сеттера и геттера между тремя классами

Я практиковал проект, который является классической игрой Ним. То, что я достиг сейчас, это:

  1. Добавлять, удалять, редактировать, отображать, игроков. (Нимсис и Нимплейер)
  2. Выбор двух игроков для игры. (класс NimGame)

Каждый раз, когда игра заканчивается, мне нужно вернуть эти две вещи из NimGame в NimPlayer. Затем я могу использовать геттер в Nimsys:

  1. Если игрок выигрывает, его/ее счет +1.
  2. Каждый раз после игры номер игры +1 для игравшего игрока.

Что я уже пробовал, так это передать «score» и «gamePlayed» из NimPlayer в NimGame, поместив геттер, который сначала равен 0, в сеттер, чтобы установить число +1.

scores = NimPlayer.setScore(NimPlayer.getScore() + 1);

Тем не менее, я не знаю, как передать "счета" обратно в NimPlayer для использования. Я надеюсь передать результаты обратно в NimPlayer. Тогда я могу позвонить из Nimsys. Вот мой код.

import java.util.Scanner;

public class Nimsys {

public static String[] splitName(String inName) {
    String[] splittedLine = inName.split(",");
    String[] name = null;
    if (splittedLine.length==3) {
        String userName = splittedLine[0].trim();
        String familyName = splittedLine[1].trim();
        String givenName = splittedLine[2].trim();
        name = new String[3];
        name[0] = userName;
        name[1] = familyName;
        name[2] = givenName;
    }
    return name;
}

public static String [] splitData(String dataIn) {
    String[] splittedLine = dataIn.split(",");
    String[] data = null;
    if (splittedLine.length==4) {
        String initialStone = splittedLine[0];
        String stoneRemoval = splittedLine[1];
        String player1 = splittedLine[2].trim();
        String player2 = splittedLine[3].trim();
        data = new String[4];
        data[0] = initialStone;
        data[1] = stoneRemoval;
        data[2] = player1;
        data[3] = player2;
    }
    return data;
}

public static String playerChecker(String name) {
    String player = null;
    for (int i = 0; i < NimPlayer.getId(); i++) {
        player = NimPlayer.getPlayer()[i].getUserName();
        if (player.equals(name)) {
            break;
        }
    }
    return player;
} 
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    while (true) {
        System.out.print('$');
        String commandin = in.next();

        if (commandin.equals("addplayer")) { 
            String inName = in.nextLine();
            String[] name = splitName(inName);

            //Make sure the vadality of in name
            //Can use playerCheck to simplify the code
            if (name!=null && name.length==3) {
                for (int i = 0; i < NimPlayer.getId(); i ++) {
                    String userCheck = NimPlayer.getPlayer()[i].getUserName();
                    if (userCheck.contains(name[0])) {
                        System.out.println("The player already exist");//Test if player has been created
                    } 
            }
                NimPlayer.createPlayer(name[0], name[1], name[2], 0, 0);
                System.out.println("The player has been created.");
            } else {
                System.out.println("Not Valid! Please enter again!");
            }          
        }

        if (commandin.equals("removeplayer")) {
            //cannot loop through the entire null array, would be NullPointerException
            String removeUserName = in.nextLine().trim();


            /*System.out.println("Are you sure you want to remove all players? (y/n) \n");
            //System.out.print('$');
            commandin = in.next();
                if (commandin.equals("y")) {
                    for (int i = 0; i < NimPlayer.getId(); i++) {
                        NimPlayer.getPlayer()[i] = null;
                        System.out.println("Remove all the players");
                    }
                } else {
                    System.out.print('$');
                }*/
            //commandin = in.next();
            for (int i = 0; i < NimPlayer.getId(); i++) {
                String userName = NimPlayer.getPlayer()[i].getUserName().trim();
                if (removeUserName != null && userName.equals(removeUserName)) {
                    NimPlayer.getPlayer()[i] = null;
                    System.out.println("Remove successfully!");// A test to see if the code runs

                } else {
                    System.out.println("The player does not exist");   
                }
            } 
        }

        if (commandin.equals("editplayer")) {
            String inName = in.nextLine();

            String[] splittedLine = inName.split(",");
            if (splittedLine!=null && splittedLine.length==3) {
                String userName = splittedLine[0].trim();
                String familyName = splittedLine[1].trim();
                String givenName = splittedLine[2].trim();
                //System.out.println(userName+","+familyName+","+givenName);//Test if in name in the if loop
                for (int i = 0; i < NimPlayer.getId(); i++) {
                    String userCheck = NimPlayer.getPlayer()[i].getUserName().trim();
                    if (userName != null && userCheck.equals(userName)) {
                        NimPlayer.getPlayer()[i].setFamilyName(familyName);
                        NimPlayer.getPlayer()[i].setGivenName(givenName);

                        System.out.println("Edit successfully");

                    } else {
                        System.out.println("The player does not exist.");
                    }
                }            
            } else {
                System.out.println("Invalid in! Please enter again.");
            }      
        }

        if (commandin.equals("displayplayer")) {
            String user = in.nextLine().trim();
            for (int i = 0; i < NimPlayer.getId(); i++) {
                String userCheck = NimPlayer.getPlayer()[i].getUserName().trim();
                String userName = NimPlayer.getPlayer()[i].getUserName();
                String familyName = NimPlayer.getPlayer()[i].getfamilyName();
                String givenName = NimPlayer.getPlayer()[i].getGivenName();
                int score = NimPlayer.setScore(NimPlayer.getScore());
                int gamePlayed = NimPlayer.setGamePlayed(NimPlayer.getGamePlayed());

                if (user != null && userCheck.equals(user)) {
                    System.out.println(userName+","+familyName+","+givenName+","+gamePlayed+" games,"+score +" wins");
                }   
            }
        }

        if (commandin.equals("startgame")) {
            String dataIn = null, player1 = null, player2 = null;
            do {
                dataIn = in.nextLine();
                String [] data = splitData(dataIn);
                if (data != null && data.length==4) {
                    player1 = playerChecker(data[2]);
                    player2 = playerChecker(data[3]);

                    NimGame game = new NimGame(data[0].trim(), data[1], player1, player2);
                    game.playGame(data[0].trim(), data[1], player1, player2);
                }
            } while(player1 == null || player2 == null);
        }          
    }
}
}

Вышеупомянутый мой основной метод Nimsys. У меня проблема с вызовом этих значений с помощью команды displayplayer. Это должно быть так:

userName,familyName,givenName,gamePlayed "games",score "wins"

Ниже мой класс NimPlayer:

//username, given name, family name, number of game played, number of games won
public class NimPlayer {
private String userName;
private String familyName;
private String givenName;
private static int score;
private static int gamePlayed;
static int id;
static NimPlayer[] playerList = new NimPlayer[10]; // set an array here


//define NimPlayer data type
public NimPlayer(String userName, String surName, String givenName, int gamePlayed, int score) {
    this.userName = userName;
    this.familyName = surName;
    this.givenName = givenName;
    NimPlayer.score = score;
    NimPlayer.gamePlayed = gamePlayed;
}
// create new data using NimPlayer data type
public static void createPlayer(String userName, String familyName, String givenName, int gamePlayed, int score) {
    if (id<10) {
        playerList[id++] = new NimPlayer(userName, familyName, givenName, gamePlayed, score);
    } else {
        System.out.println("Cannot add more players.");
    }
}
public static int getId() {
    return id;
}
public static NimPlayer [] getPlayer() {
    return playerList;
}
public void setUserName(String userName) {
    this.userName = userName;
}
public void setFamilyName(String familyName) {
    this.familyName = familyName;
}
public void setGivenName(String givenName) {
    this.givenName = givenName;
}    
public String getUserName() {
    return userName;
}
public String getfamilyName() {
    return familyName;
}
public String getGivenName() {
    return givenName;
}
public static int setScore(int score) {
    return score;
}
public static int getScore() {
    return score;
}
public static int setGamePlayed (int gamePlayed) {
    return gamePlayed;
}
public static int getGamePlayed() {
    return gamePlayed;
}

}

И, наконец, часть NimGame:

import java.util.Scanner;
//playing process
//current stone count
//upper bound on stone removal
//two players


public class NimGame {

private static int gamePlayed;
private static int scores;
String player1;
String player2;
String playOrNot;
String initialStoneInput;
String dataRemoval;

int stars;
int stoneBalance;
int initialStone;
int upperBound;

public int initializeStone(int startStones) {
    stoneBalance = startStones;
    return stoneBalance;
}

public void removeStones(int stonesTaken) {
    int updatedBalance = stoneBalance - stonesTaken;
    stoneBalance = updatedBalance;
}

public void printStar(int star) {
    stars = star;
    stars = stoneBalance;
    for (int stars = 1; stars <= star; stars++) {
        System.out.print(" *");
    }
    System.out.println();
}

public static int earnPoint(String player) {
    for (int i = 0; i < NimPlayer.getId(); i++) {
        String playerCheck = NimPlayer.getPlayer()[i].getUserName();
        if (playerCheck.equals(player)) {
            scores = NimPlayer.setScore(NimPlayer.getScore() + 1);
        }
    }
    return scores;
}

public static int gamePlayed(String player) {
    for (int i = 0; i < NimPlayer.getId(); i++) {
        String playerCheck = NimPlayer.getPlayer()[i].getUserName();
        if (playerCheck.equals(player)) {
            gamePlayed = NimPlayer.setGamePlayed(NimPlayer.getGamePlayed() + 1);
        }
    }
    return gamePlayed + 1;
}

public int getGameScore() {
    return scores;
}

public int getNumberGamePlayed() {
    return gamePlayed;
}

    public NimGame (String initialStone ,String dataRemoval,String player1, String player2) {
    this.initialStoneInput = initialStone;
    this.dataRemoval = dataRemoval;
    this.player1 = player1;
    this.player2 = player2;
}

    Scanner in = new Scanner(System.in);
    public void playGame (String initialStone ,String dataRemoval,String player1, String player2) {
    //Convert user input string into integer
    int initialStoneInt = Integer.parseInt(initialStoneInput);
    initializeStone(initialStoneInt);
    int upperBound = Integer.parseInt(dataRemoval);

    System.out.println("Initial stone count: "+initialStoneInt);
    System.out.println("Maximum stone removal: "+dataRemoval);
    System.out.println("Player 1: "+player1);
    System.out.println("Player 2: "+player2);
    do {
        // while stoneBalance > 0, two players keep playing the game
        while (stoneBalance > 0) {
            // player1's turn and remove the stones; decision of winning
            System.out.println(player1 + "'s turn - remove how many?\n");
            int takeStone = in.nextInt();
            while (takeStone > upperBound || takeStone <= 0) {
                System.out.println(
                        "Invalid, you need to remove stones under upper "+ 
                        "bound limit or above 0. \n Please enter again.");
                takeStone = in.nextInt();
            }
            removeStones(takeStone); //remove the stone

            if (stoneBalance > 0) {
                //show the remaining stones
                System.out.print(stoneBalance + " stones left:"); 
                printStar(stoneBalance);
            } else if (stoneBalance <= 0) {
                System.out.println("Game Over\n" + player2 + " wins!\n");
                earnPoint(player2);
                break;
            }

            // player2's turn and remove the stones; decision of winning
            System.out.println(player2 + "'s turn - remove how many?\n");
            takeStone = in.nextInt();
            while (takeStone > upperBound || takeStone <= 0) {
                System.out.println(
                        "Invalid, you need to remove stones under upper " + 
                        "bound limit or above 0. \n Please enter again.");
                takeStone = in.nextInt();
            }

            removeStones(takeStone);
            if (stoneBalance > 0) {
                System.out.print(stoneBalance + " stones left:");
                printStar(stoneBalance);
            } else if (stoneBalance <= 0) {
                System.out.println("Game Over\n" + player1 + " wins!\n");
                earnPoint(player1);
                break;
            }
        }
        // ask players to play again
        //in.nextLine();
        System.out.println("Do you want to play again (Y/N):");
        playOrNot = in.nextLine();

        gamePlayed(player1);
        gamePlayed(player2);
    } while (playOrNot.equals("Y"));

}
}

person Woden    schedule 20.04.2020    source источник
comment
Я постараюсь помочь больше позже, но мне нужно больше времени для понимания. Если вы можете мне помочь... почему вы используете так много статических методов?   -  person Piotr Korlaga    schedule 20.04.2020
comment
Слишком много статических переменных и методов, на мой вкус. Почему playerList не является переменной экземпляра, например, в NimGame? Попробуйте удалить static из всех переменных и вместо этого убедитесь, что они существуют в правильном классе в зависимости от их использования. Может показаться, что это все усложняет, но я думаю, что в конце концов вы обнаружите, что это действительно облегчит понимание вашего кода и расширит его за счет большей функциональности.   -  person Joakim Danielson    schedule 20.04.2020
comment
@PiotrKorlaga Помимо самой игры. Мне нужно сохранить данные игрока, которые находятся в playerList в NimPlayer. Меня учили хранить данные в NimPlayer вместо инициализации экземпляров в Nimsys. Вот почему я использую статические методы.   -  person Woden    schedule 20.04.2020
comment
ИМХО это немного перебор статики. Обычно вам понадобится что-то вроде объекта NimSys — его будет легче понять другим программистам.   -  person Piotr Korlaga    schedule 20.04.2020
comment
@JoakimDanielson Понятно. Несколько дней назад программист научил меня хранить данные таким образом, вместо того, чтобы создавать экземпляры... Я усовершенствую следующее упражнение. Но на самом деле он отлично работает для создания этих объектов и сохранения для игры.   -  person Woden    schedule 20.04.2020
comment
статические данные означают глобальные данные, к которым легче получить доступ, но гораздо сложнее поддерживать и тестировать. ООП во многом касается создания и обработки небольших автономных компонентов. Не имеет отношения, но обратите внимание, что метод set должен устанавливать переменную и возвращать void.   -  person Joakim Danielson    schedule 20.04.2020


Ответы (2)


В вашем коде должны быть учтены следующие вещи:

  1. Поскольку вы создаете NimPlayer с помощью createPlayer, создайте следующий конструктор private, а также создайте закрытый конструктор без аргументов, чтобы не было другого способа, кроме как использовать createPlayer для создания NimPlayer.

Измените его на:

private NimPlayer(String userName, String surName, String givenName) {
    this.userName = userName;
    this.familyName = surName;
    this.givenName = givenName;
}
  1. Удалите параметры int gamePlayed и int score из createPlayer, потому что при создании NimPlayer у игрока нет данных для gamePlayed и score. Эти вещи будут установлены в ходе игры.

Измените его на:

public static void createPlayer(String userName, String familyName, String givenName) {
    if (id<10) {
        playerList[id++] = new NimPlayer(userName, familyName, givenName);
    } else {
        System.out.println("Cannot add more players.");
    }
}
  1. Поскольку score и gamePlayed принадлежат отдельным игрокам, то есть каждый отдельный игрок будет иметь свои score и gamePlayed, независимые от других игроков, эти атрибуты должны быть нестатическими. Вы должны создавать переменную static только тогда, когда значение переменной должно быть одинаковым для всех экземпляров, например. NimPlayer[] playerList или id. Обратите внимание, что ранее я просил вас использовать имя counter вместо id, потому что оно должно быть счетчиком номера. игроков и, следовательно, имя id сбивает с толку. Если вы хотите создать поле id для отдельных игроков, используйте функцию Replace All вашей IDE, чтобы заменить все вхождения id на counter, все вхождения Id на Counter (для замены геттеров и сеттеров), а затем создайте нестатический private int id; как firstName, familyName и т. д. внутри NimPlayer.

Объявите score и gamePlayed следующим образом:

private int score;
private int gamePlayed;
//public getters and setters of score and gamePlayed
  1. score и gamePlayed должны быть доступны так же, как вы обращаетесь к именам
if (commandin.equals("displayplayer")) {
    String user = in.nextLine().trim();
    NimPlayer [] players = NimPlayer.getPlayer();
    for (int i = 0; i < NimPlayer.getId(); i++) {
        String userCheck = players[i].getUserName().trim();
        String userName = players[i].getUserName();
        String familyName = players[i].getFamilyName();
        String givenName = players[i].getGivenName();
        int score = players[i].getScore();
        int gamePlayed = players[i].getGamePlayed();

        if (user != null && userCheck.equals(user)) {
            System.out.println(userName + "," + familyName + "," + givenName + "," + gamePlayed + " games,"
                    + score + " wins");
        }
    }
}

  1. Значение score должно быть установлено как
public static int earnPoint(String player) {
   int i = 0;
   for (i = 0; i < NimPlayer.getCounter(); i++) {
       String playerCheck = NimPlayer.getPlayer()[i].getUserName();
       if (playerCheck.equals(player)) {
           NimPlayer.getPlayer()[i].setScore(NimPlayer.getPlayer()[i].getScore() + 1);
           break;
       }
   }
   return NimPlayer.getPlayer()[i].getScore();
}
person Arvind Kumar Avinash    schedule 20.04.2020
comment
Сэр, мне интересно, проще ли использовать конструктор только для создания объекта игрока. До сих пор в Nimsys и NimGame мне приходилось каждый раз зацикливаться на поиске каждого игрока. - person Woden; 21.04.2020
comment
Кроме того, я получил Unresolved compilation problem i can not be resolved to a variable. Еще раз спасибо, сэр. Я благодарен, что вы готовы помочь мне. - person Woden; 21.04.2020
comment
Unresolved compilation problem i can not be resolved to a variable. должно было произойти в методе earnPoint. Это произошло потому, что i был доступен в операторе return, но его область действия была ограничена циклом for. Я переместил объявление i выше цикла, что решит эту проблему. - person Arvind Kumar Avinash; 21.04.2020
comment
I am wondering if it is easier to use the constructor only to create the player object. - ИМХО, лучше создать плеер с помощью createPlayer с учетом того, что я предложил. Метод createPlayer похож на фабричный метод, и это ваши первые шаги в изучении еще несколько шаблонов проектирования. - person Arvind Kumar Avinash; 21.04.2020
comment
So far, in Nimsys and NimGame, I have to loop to search each player every time. - Вместо того, чтобы каждый раз писать код на месте для поиска игрока, вы должны написать соответствующие функции, чтобы сделать ваш код модульным. Дайте мне знать, если вам нужна помощь в написании таких функций. - person Arvind Kumar Avinash; 21.04.2020
comment
Хорошего дня, сэр! Я нахожусь в часовом поясе GMT ​​+10, Австралия. Я хочу задать, наверное, последний вопрос об этом проекте. Не могли бы вы просмотреть мой код, пожалуйста? stackoverflow.com/questions/61402212/ Вот он. @Арвинд - person Woden; 24.04.2020

Я полностью переработал код вашей модели, что сделало остальную часть кода проще. Создание хорошей модели приложения значительно упрощает создание остальной части приложения.

Вот ваш переработанный NimPlayer класс. Все поля, составляющие этот класс, связаны с игровым игроком.

Класс состоит исключительно из геттеров и сеттеров. Два сеттера добавляют вместо замены. В этом классе нет статических полей.

public class NimPlayer {
    private final int id;

    private final String userName;
    private String familyName;
    private String givenName;

    private int gamesPlayed;
    private int gamesWon;

    public NimPlayer(int id, String userName, String familyName, 
            String givenName) {
        this.id = id;
        this.userName = userName;
        this.familyName = familyName;
        this.givenName = givenName;
        this.gamesPlayed = 0;
        this.gamesWon = 0;
    }

    public int getId() {
        return id;
    }

    public String getUserName() {
        return userName;
    }

    public String getFamilyName() {
        return familyName;
    }

    public void setFamilyName(String familyName) {
        this.familyName = familyName;
    }

    public String getGivenName() {
        return givenName;
    }

    public void setGivenName(String givenName) {
        this.givenName = givenName;
    }

    public int getGamesPlayed() {
        return gamesPlayed;
    }

    public void addGamePlayed() {
        this.gamesPlayed++;
    }

    public int getGamesWon() {
        return gamesWon;
    }

    public void addGamesWon() {
        this.gamesWon++;
    }

}

Я создал новый класс NimModel для хранения состояния игры. В этом классе находится playerList и весь код, связанный с playerList.

Преобразование playerList в List упростило бы код, но я оставил playerList в виде массива, чтобы показать вам код, связанный с добавлением и удалением игроков из массива.

public class NimModel {

    private int numberOfPlayers;
    private int limit;

    private NimPlayer[] playerList;

    public NimModel() {
        this.numberOfPlayers = 0;
        this.limit = 10;
        this.playerList = new NimPlayer[limit];
    }

    public boolean createPlayer(String userName, String familyName, 
            String givenName) {
        if (numberOfPlayers < limit) {
            int id = getFirstPlayerSlot();
            if (id >= 0) {
                playerList[id] = new NimPlayer(id, 
                        userName, familyName, givenName);
                numberOfPlayers++;
            }
            return true;
        } else {
            return false;
        }
    }

    private int getFirstPlayerSlot() {
        for (int i = 0; i < limit; i++) {
            if (playerList == null) {
                return i;
            }
        }
        return -1;
    }

    public NimPlayer getPlayer(int id) {
        return playerList[id];
    }

    public NimPlayer getPlayer(String userName) {
        for (int i = 0; i < limit; i++) {
            if (playerList[i] != null) {
                if (userName.equals(playerList[i].getUserName())) {
                    return playerList[i];
                }
            }
        }
        return null;
    }

    public NimPlayer removePlayer(String userName) {
        for (int i = 0; i < limit; i++) {
            NimPlayer player = playerList[i];
            if (player != null) {
                if (userName.equals(player.getUserName())) {
                    this.playerList[i] = null;
                    numberOfPlayers--;
                    return player;
                }
            }
        }
        return null;
    }

    public int getNumberOfPlayers() {
        return numberOfPlayers;
    }

}

Наконец, вот ваши переработанные классы Nimsys и NimGame. Опять же, мы удалили все статические ссылки.

Если вы кодируете методы в том порядке, в котором они вызываются, становится легче читать и понимать код. Другими словами, сначала излагайте основные моменты, а затем детали.

import java.util.Scanner;

public class Nimsys {

    private NimModel nimModel;

    public static void main(String[] args) {
        Nimsys nimsys = new Nimsys();
        nimsys.processCommands();
    }

    private void processCommands() {
        this.nimModel = new NimModel();
        Scanner in = new Scanner(System.in);

        while (true) {
            System.out.print('$');
            String commandin = in.nextLine().trim();

            if (commandin.equalsIgnoreCase("addplayer")) {
                addPlayer(in);
            }
            if (commandin.equalsIgnoreCase("removeplayer")) {
                removePlayer(in);
            }
            if (commandin.equalsIgnoreCase("editplayer")) {
                editPlayer(in);
            }
            if (commandin.equalsIgnoreCase("displayplayer")) {
                displayPlayer(in);
            }
            if (commandin.equalsIgnoreCase("startgame")) {
                startGame(in);
            }
        }
    }

    private void addPlayer(Scanner in) {
        String inName = in.nextLine().trim();
        String[] name = splitName(inName);

        if (name != null && name.length == 3) {
            NimPlayer player = nimModel.getPlayer(name[0]);
            if (player == null) {
                nimModel.createPlayer(name[0], name[1], name[2]);
                System.out.println("The player has been created.");
            } else {
                System.out.println("The player is already in "
                        + "the list.");
            }
        } else {
            System.out.println("Not Valid! Please enter again!");
        }
    }

    private String[] splitName(String inName) {
        String[] splittedLine = inName.split(",");
        String[] name = null;
        if (splittedLine.length == 3) {
            String userName = splittedLine[0].trim();
            String familyName = splittedLine[1].trim();
            String givenName = splittedLine[2].trim();
            name = new String[3];
            name[0] = userName;
            name[1] = familyName;
            name[2] = givenName;
        }
        return name;
    }

    private void removePlayer(Scanner in) {
        String removeUserName = in.nextLine().trim();
        NimPlayer player = nimModel.removePlayer(removeUserName);
        if (player == null) {
            System.out.println("The player does not exist");
        } else {
            System.out.println("Player " + player.getUserName() + 
                    " removed successfully!");
        }
    }

    private void editPlayer(Scanner in) {
        String inName = in.nextLine().trim();
        String[] splittedLine = inName.split(",");
        if (splittedLine != null && splittedLine.length == 3) {
            String userName = splittedLine[0].trim();
            String familyName = splittedLine[1].trim();
            String givenName = splittedLine[2].trim();
            NimPlayer player = nimModel.getPlayer(userName);

            if (player == null) {
                System.out.println("The player does "
                        + "not exist.");
            } else {
                player.setFamilyName(familyName);
                player.setGivenName(givenName);
                System.out.println("Edited successfully");
            }
        } else {
            System.out.println("Invalid user name! Please "
                    + "enter again.");
        }
    }

    private void displayPlayer(Scanner in) {
        String userName = in.nextLine().trim();
        NimPlayer player = nimModel.getPlayer(userName);
        String familyName = player.getFamilyName();
        String givenName = player.getGivenName();
        int gamesWon = player.getGamesWon();
        int gamesPlayed = player.getGamesPlayed();
        System.out.println(userName + "," + familyName + 
                "," + givenName + "," + gamesPlayed + 
                " games," + gamesWon + " wins");
    }

    private void startGame(Scanner in) {
        NimPlayer player1 = null, player2 = null;
        do {
            String dataIn = in.nextLine().trim();
            String[] data = splitData(dataIn);
            if (data != null && data.length == 4) {
                player1 = nimModel.getPlayer(data[2]);
                player2 = nimModel.getPlayer(data[3]);
                NimGame game = new NimGame(nimModel, data[0], 
                        data[1], player1, player2);
                game.playGame();
            }
        } while (player1 == null || player2 == null);
    }

    private String[] splitData(String dataIn) {
        String[] splittedLine = dataIn.split(",");
        String[] data = null;
        if (splittedLine.length == 4) {
            String initialStone = splittedLine[0];
            String stoneRemoval = splittedLine[1];
            String player1 = splittedLine[2].trim();
            String player2 = splittedLine[3].trim();
            data = new String[4];
            data[0] = initialStone;
            data[1] = stoneRemoval;
            data[2] = player1;
            data[3] = player2;
        }
        return data;
    }

}

Класс NimGame

import java.util.Scanner;

public class NimGame {

    NimPlayer player1;
    NimPlayer player2;

    String playOrNot;
    String initialStoneInput;
    String dataRemoval;

    int stars;
    int stoneBalance;
    int initialStone;
    int upperBound;

    public NimGame(NimModel nimModel, String initialStoneInput, 
            String dataRemoval, 
            NimPlayer player1, NimPlayer player2) {
        this.initialStoneInput = initialStoneInput;
        this.dataRemoval = dataRemoval;
        this.player1 = player1;
        this.player2 = player2;
    }

    Scanner in = new Scanner(System.in);

    public void playGame() {
        // Convert user input string into integer
        int initialStoneInt = Integer.parseInt(initialStoneInput);
        initializeStone(initialStoneInt);
        int upperBound = Integer.parseInt(dataRemoval);

        System.out.println("Initial stone count: " + 
                initialStoneInt);
        System.out.println("Maximum stone removal: " + 
                dataRemoval);
        System.out.println("Player 1: " + player1.getUserName());
        System.out.println("Player 2: " + player2.getUserName());
        do {
            // while stoneBalance > 0, two players 
            // keep playing the game
            while (stoneBalance > 0) {
                // player1's turn and remove the stones; 
                // decision of winning
                System.out.println(player1.getUserName() + "'s "
                        + "turn - remove how many?\n");
                int takeStone = in.nextInt();
                while (takeStone > upperBound || 
                        takeStone <= 0) {
                    System.out.println("Invalid, you need "
                            + "to remove stones under upper "
                            + "bound limit or above 0. \n"
                            + "Please enter again.");
                    takeStone = in.nextInt();
                }
                removeStones(takeStone); // remove the stone

                if (stoneBalance > 0) {
                    // show the remaining stones
                    System.out.print(stoneBalance + 
                            " stones left:");
                    printStar(stoneBalance);
                } else if (stoneBalance <= 0) {
                    System.out.println("Game Over\n" + 
                            player2.getUserName() + " wins!\n");
                    earnPoint(player2);
                    break;
                }

                // player2's turn and remove the stones; 
                // decision of winning
                System.out.println(player2.getUserName() + "'s "
                        + "turn - remove how many?\n");
                takeStone = in.nextInt();
                while (takeStone > upperBound || 
                        takeStone <= 0) {
                    System.out.println("Invalid, you need "
                            + "to remove stones under upper "
                            + "bound limit or above 0. \n"
                            + "Please enter again.");
                    takeStone = in.nextInt();
                }

                removeStones(takeStone);
                if (stoneBalance > 0) {
                    System.out.print(stoneBalance + " "
                            + "stones left:");
                    printStar(stoneBalance);
                } else if (stoneBalance <= 0) {
                    System.out.println("Game Over\n" + 
                            player1.getUserName() + " wins!\n");
                    earnPoint(player1);
                    break;
                }
            }
            player1.addGamePlayed();
            player2.addGamePlayed();;

            // ask players to play again
            // in.nextLine();
            System.out.println("Do you want to play "
                    + "again (Y/N):");
            playOrNot = in.nextLine().trim();
        } while (playOrNot.equalsIgnoreCase("Y"));
    }

    public int initializeStone(int startStones) {
        stoneBalance = startStones;
        return stoneBalance;
    }

    public void removeStones(int stonesTaken) {
        int updatedBalance = stoneBalance - stonesTaken;
        stoneBalance = updatedBalance;
    }

    private void printStar(int star) {
        stars = star;
        stars = stoneBalance;
        for (int stars = 1; stars <= star; stars++) {
            System.out.print(" *");
        }
        System.out.println();
    }

    private int earnPoint(NimPlayer player) {
        player.addGamesWon();
        return player.getGamesWon();
    }
}
person Gilbert Le Blanc    schedule 24.04.2020
comment
Сэр, спасибо, что потратили время и усилия на доработку этого проекта. В Nimsys так просто читать основной метод, а NimModel имеет дело с деталями команд без статических ссылок! Хорошего дня, сэр. Буду переделывать эту модель снова. @Гилберт - person Woden; 25.04.2020
comment
@Woden: Пожалуйста. Когда я вижу кого-то, кто приложил усилия, я хочу показать ему, как писать код проще и эффективнее. - person Gilbert Le Blanc; 25.04.2020
comment
Хорошего дня, сэр. Я научился преобразовывать исходный код в диаграмму UML. Таким образом, благодаря вашей работе легче усвоить больше концепций. Но, напротив, каждый раз, когда мне нужно написать такую ​​систему с несколькими классами, нужно ли мне сначала разрабатывать UML? @Гилберт - person Woden; 01.05.2020
comment
@Woden: Нет, вам не нужно создавать UML. Можно, если это полезно. Что я делаю, так это строю то, что знаю, тестирую это, затем добавляю понемногу, улучшая свою модель и тестируя по мере продвижения. Моя исходная модель приложения редко бывает похожа на мою окончательную модель. - person Gilbert Le Blanc; 01.05.2020
comment
Я понимаю. Спасибо, сэр. Хорошего дня =) - person Woden; 01.05.2020