2015-07-17 3 views
1

Я делаю маленькую карточную игру. В этой игре новый игрок является экземпляром класса, AIPlayer или HumanPlayer, который расширяет общий класс игрока.Java создает экземпляры классов на лету

В настоящее время для создания игроков я имею следующий код:

private List<Player> players; 

HumanPlayer playerA = new HumanPlayer("playerA"); 
playerA.addObserver(gameModelObserver); 
players.add(playerA); 

AIPlayer playerB = new AIPlayer("playerB"); 
playerB.addObserver(gameModelObserver); 
players.add(playerB); 

AIPlayer playerC = new AIPlayer("playerC"); 
playerC.addObserver(gameModelObserver); 
players.add(playerC); 

HumanPlayer playerD = new HumanPlayer("playerD"); 
playerD.addObserver(gameModelObserver); 
players.add(playerD); 

Можно ли динамически генерировать эти классы? Могу ли я сделать что-то вроде итерации по всем элементам связанного списка с именем игрока и логическим, чтобы указать, являются ли они AI или Human и затем генерирует для них экземпляр класса. Если да, то как?

Edit: чтобы сделать его более ясным, я смотрю, если что-то, как это возможно:

for(int i=0; i<x; i++){ 
player i = new Player("i"); 
i.addObserver(gameModelObserver); 
players.add(i); } 
+0

Что вы подразумеваете под * динамическим генерированием этих классов *? Вы можете проверить фактические объекты в вашем 'List ' через 'instanceof' и соответственно реагировать, но это (по крайней мере, с моей точки зрения) нечеткое решение. Почему вам нужно знать, является ли «Player» «AIPlayer» или «HumanPlayer»? Возможно, ваш дизайн испорчен. – Turing85

+0

Создайте метод 'addPlayer (String name)'. –

+0

AIPlayer и HumanPlayer имеют разные функции. Я также считаю, что это что-то странное, но я подумал, возможно ли это. –

ответ

1

Вероятно, что-то вроде этого:

class Player { 

    String name; 
    Type type; 

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

Player[] playersList = { new Player("playerA", Type.HUMAN), new Player("playerB", Type.AI)}; 
for (Player player: playersList) { 
    if (player.type == Type.AI) { 
      AIPlayer aiPlayer = AIPlayer.class.getConstructor(String.class).newInstance(player.name); 
      aiPlayer.addObserver(gameModelObserver); 
      players.add(aiPlayer);         } 
    else { 
      HumanPlayer humanPlayer = HumanPlayer.class.getConstructor(String.class).newInstance(player.name); 
      humanPlayer.addObserver(gameModelObserver); 
      players.add(humanPlayer); 
    } 

} 
+0

Зачем вам когда-либо использовать массив вместо 'List', если вы уже вызвали свой атрибут' playerList'? Furhtermore, в OP больше двух игроков. – Turing85

+0

Спасибо за ваше решение. Как бы я, в коде, который вы предлагаете, добавить Observer к вновь созданному игроку? Это главная проблема, с которой я столкнулся. –

+0

Просто введите 'addObserver' метод ниже' if' в цикле. – Soana

5

Это не ответ на ваш вопрос, но, может быть, решить вашу проблему:

private List<Player> players; 

public void createPlayerByName(String name, Class type) { 
    Player player = type.equals(HumanPlayer) ? new HumanPlayer(name) : new IAPlayer(name); 
    player.addObserver(gameModelObserver); 
    players.add(player); 
} 

public void createHumanPlayerByName(String name) { 
    createPlayerByName(name, HumanPlayer.class); 
} 

public void createIAPlayerByName(String name) { 
    createPlayerByName(name, AIPlayer.class); 
} 

Так со списком вы просто должны это сделать:

for (String name : humanNameList) { 
    createHumanPlayerByName(name); 
} 

for (String name : aiNameList) { 
    createAIPlayerByName(name); 
} 
+0

Спасибо. Это может решить мою проблему таким образом. Мне все еще интересно, что то, о чем я спрашиваю, возможно. :) –

+0

Я отредактировал, чтобы можно было создавать IAPlayers тоже. – Sertage

+0

Возможно, но не рекомендуется создавать «Player player = AIPlayer.class.newInstance();», потому что он не будет вызывать конструктор, просто сгенерируйте Object. – Sertage

Смежные вопросы