Команда и игроки объекты Java трудности - PullRequest
2 голосов
/ 21 ноября 2011

В основном я пытаюсь разобраться с созданием Java-программы, которая управляет командами и игроками.

Из моего понимания у меня будет команда и класс игрока.В командном классе будут методы get и set, а также некоторая форма коллекции для правильного хранения игроков, например, список массивов?Затем в классе игрока соответствующие методы получения и установки.

Эта установка может быть из-за того, что в одной команде есть один-много игроков, верно?

У меня не было никаких проблем, пытаясь заставить это работать.Одна конкретная проблема, с которой я столкнулся, заключается в том, что каждый раз, когда я создаю объект команды и добавляю к нему объект игрока, затем создаю другой объект команды и другого игрока, но если я перечисляю игроков для этой новой команды, это показывает, что предыдущий игрок добавлен впервая команда, а также новый игрок.

Итак, я подумал, что он вернулся к чертежной доске, и подумал, может ли кто-нибудь дать общий совет о том, как они это структурируют?

Большое спасибо

import java.util.Iterator;

public class test {
public test() {
}

//Method to show the team and its players

public static void showTeamPlayers(Team aTeam) {
    Player players;
    System.out.println(aTeam.getTeamName());
    Iterator e = aTeam.getPlayerList().iterator();
    while (e.hasNext()) {
        players = (Player)e.next();
        System.out.println("\t" + players.getPlayerNumber() + " " + players.getPlayerName());
    }
    System.out.println("");
}

public static void main(String[] args) {
    int teamID;
    String teamName = "";

    //First create a divison/league
    League DivisionOne = new League("Division One");

    //Create a new team object
    Team team = new Team(teamName);

    //Asks the user to enter a team name and stores the input
    UserInput.print("Enter team name:");
    teamName = UserInput.readString();

    team.setTeamName(teamName);

    //Add the team
    DivisionOne.addTeam(new Team(teamName));

    Player player = new Player(0, "Dave");
    Player player1 = new Player(1, "Dennis");
    Player player2 = new Player(2, "Peter");

    //Add to team
    team.addPlayer(player);
    team.addPlayer(player1);
    team.addPlayer(player2);

    test.showTeamPlayers(team);

    //Asks the user to enter a team name and stores the input
    UserInput.print("Enter team name:");
    teamName = UserInput.readString();

    team.setTeamName(teamName);

    //Add the team
    DivisionOne.addTeam(new Team(teamName));

    Player player3 = new Player(3, "Creamer");
    Player player4 = new Player(4, "Matt");
    Player player5 = new Player(5, "John");

    //Add to team 1
    team.addPlayer(player3);
    team.addPlayer(player4);
    team.addPlayer(player5);

    test.showTeamPlayers(team);
}
}

Ответы [ 5 ]

2 голосов
/ 21 ноября 2011

Ну, об ошибках уже упоминается PaddyG. Вот сольн:

Заменить этот код:

teamName = UserInput.readString();

team.setTeamName(teamName);


//Add the team
DivisionOne.addTeam(new Team(teamName));

с:

teamName = UserInput.readString();

team = new Team(teamName);

//Add the team
DivisionOne.addTeam(team);

А также заменить:

teamName = UserInput.readString();

team.setTeamName(teamName);

//Add the team
DivisionOne.addTeam(new Team(teamName));


Player player3 = new Player(3, "Creamer");
Player player4 = new Player(4, "Matt");
Player player5 = new Player(5, "John");

с:

teamName = UserInput.readString();

team = new Team(teamName);

//Add the team
DivisionOne.addTeam(team);


Player player3 = new Player(3, "Creamer");
Player player4 = new Player(4, "Matt");
Player player5 = new Player(5, "John");

Как видно из приведенного выше кода, мы обновили переменную team новым экземпляром для новой команды. И этот новый экземпляр добавляется в DivisionOne. Когда вы делаете DivisionOne.addTeam(new Team(teamName));, вы создаете и добавляете новый экземпляр в DivisionOne, но экземпляр, к которому вы добавляете игроков, другой (содержится в переменной team). Таким образом, задача состоит в том, чтобы создать новый экземпляр и установить переменную team с этим вновь созданным экземпляром, а затем добавить в него игроков и добавить его в DivisionOne.

2 голосов
/ 21 ноября 2011

Таким образом, ваша структура должна быть полностью правильной (и, между прочим, «ассоциации один ко многим» описываются как «1: n» или «1: (1..n)»).

Либо у вас есть определенная ошибка где-то в вашем коде (опубликуйте ее;)), например, статическое поле, либо вы дважды использовали идентификатор, либо вы можете столкнуться с проблемами с ArrayList здесь (попробуйте LinkedList для тестирования), но я не уверен в этом.

EDIT: Вы забыли опубликовать свою модель, мы только видим ее тест, но там у вас уже есть несколько ошибок:

Team team = new Team(teamName);
teamName = UserInput.readString();
team.setTeamName(teamName);

Пока все хорошо. За исключением того, что бессмысленно создавать экземпляр Team с пустым teamName, а затем сбрасывать его, но nvm ....

DivisionOne.addTeam(new Team(teamName));

Бабам, вы не добавляете созданный выше экземпляр Team в DivisionOne, нет, вы создаете новый. На самом деле, это ошибка № 1

team.addPlayer(player);
team.addPlayer(player1);
team.addPlayer(player2);

Но вы помещаете новых игроков в созданный вами экземпляр, они не попадают в команду, созданную для DivisionOne ... Если хотите, вы можете добавить ошибку №2 ... а затем

team.setTeamName(teamName);
DivisionOne.addTeam(new Team(teamName));
.
.
.
team.addPlayer(player3);
team.addPlayer(player4);
team.addPlayer(player5);

И снова, вы только устанавливаете новое имя teamName вашего первого экземпляра Team, а затем вы создаете новую Team для DivisionOne. Пока что ошибка № 3;) Но вы добавляете некоторых новых игроков в «старый» экземпляр команды, такой же, как указано выше.

В целом, ваш созданный "командный" экземпляр не имеет никакого отношения к вашему DivisionOne. Итак, вы создали экземпляр Team, собрав в него шесть игроков и дважды вызвав showTeamPlayers. В конце концов, неудивительно, что первые 3 игрока все еще там ...

Последняя точка:

League DivisionOne = new League("Division One");

должно быть

League divisionOne = new League("Division One");

Поскольку переменная никогда не начинается с заглавной буквы, "DivisionOne" также может быть статическим классом (поскольку классы всегда начинаются с прописных букв ...)

0 голосов
/ 21 ноября 2011

Я согласен с ответом @ Kaleb, но я дам вам альтернативу (если хотите) ...

public class Player {
    private String name;
    protected int speed;
    protected int health;

    public Player(String name, int speed, int health) {
        this.name = name;
        this.speed = speed;
        this.health = health;
    }
}

public class Main {
    public static void main(String[] args) {
        Map<Player> team1 = new HashMap<Player>();
        Map<Player> team2 = new HashMap<Player>();
        System.out.print("Enter the name of the player followed by its speed, health, and team number:");
        java.util.Scanner sc = new java.util.Scanner(System.in).useDelimiter(",");
        String name = sc.next();
        int speed = sc.nextInt();
        int health = sc.nextInt();
        if (sc.nextInt() == 1) {
            team1.put(new Player(name, speed, health));
        } else {
            team2.put(new Player(name, speed, health));
        }
    }
}
0 голосов
/ 21 ноября 2011

Было бы полезно увидеть ваш код, но, учитывая ваше описание, я хотел бы начать с примера, подобного этому:

// Team.java
public class Team {
   private String name;
   private List<Player> players;

   public Team(String name) {
      this.name = name;
      this.players = new ArrayList<Player>();
   }

   public String getName() {
       return name;
   }

   public List<Player> getPlayers() {
       return players;
   }
}

// Player.java
public class Player {
   private String name;

   public Player(String name) {
      this.name = name;
   }

   public String getName() {
      return name;
   }
}

// Main.java
public class Main {
   public static void main(String[] args) {
      Team team1 = new Team("Team #1");
      Team team2 = new Team("Team #2");
      team1.getPlayers().add(new Player("Bob"));
      team2.getPlayers().add(new Player("Joe"));
   }
}
0 голосов
/ 21 ноября 2011

У меня не было никаких проблем, пытаясь заставить это работать.Одна конкретная проблема, с которой я столкнулся, заключается в том, что каждый раз, когда я создаю объект команды и добавляю к нему объект игрока, затем создаю другой объект команды и другого игрока, но если я перечисляю игроков для этой новой команды, это показывает, что предыдущий игрок добавленпервая команда, а также новый игрок.

Убедитесь, что объекты команды не имеют общих полей.Может быть, вы использовали «статическое» поле для списка игроков?Если вы объявите поле статическим, оно будет доступно всем экземплярам команды, что, вероятно, не то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...