В поисках подходящего шаблона дизайна - PullRequest
2 голосов
/ 25 ноября 2011

У меня есть игра, которая отслеживает статистику пользователей после каждого матча, например, как далеко они прошли, сколько раз они атаковали, как далеко они упали и т. Д., И мои текущие реализации выглядят примерно так (упрощенная версия):

Class Player{
    int id;

public Player(){
    int id = Math.random()*100000;
    PlayerData.players.put(id,new PlayerData());
}

public void jump(){
    //Logic to make the user jump
    //...

    //call the playerManager
    PlayerManager.jump(this);
}

public void attack(Player target){
   //logic to attack the player
   //...

   //call the player manager
   PlayerManager.attack(this,target);
}

}

Class PlayerData{
    public static HashMap<int, PlayerData> players = new HashMap<int,PlayerData>();
    int id;
    int timesJumped;
    int timesAttacked;

}
public void incrementJumped(){
    timesJumped++;
}
public void incrementAttacked(){
    timesAttacked++;
}

}

Class PlayerManager{

public static void jump(Player player){
    players.get(player.getId()).incrementJumped();
}
public void incrementAttacked(Player player, Player target){
    players.get(player.getId()).incrementAttacked();
}

}

Итак, у меня есть класс PlayerData, который хранит всю статистику и выводит ее из класса player, потому что он не является частью логики игрока.Затем у меня есть PlayerManager, который будет находиться на сервере и который контролирует взаимодействие между игроками (большая часть логики исключает это, поэтому я мог бы сохранить это простым).Я помещаю вызовы в класс PlayerData в классе Manager, потому что иногда вам приходится делать определенные проверки между игроками, например, если атака действительно попадает, то вы увеличиваете "attackHits".

Основная проблема (на мой взгляд, поправьте меня, если я ошибаюсь) состоит в том, что это не очень расширяемо.Мне нужно будет дотронуться до класса PlayerData, если я хочу отслеживать новую статистику, добавляя методы и поля, а затем мне придется потенциально добавить больше методов в мой PlayerManager, чтобы он не был очень модулированным.

Если есть улучшение, которое вы бы порекомендовали, я был бы очень признателен.Спасибо.

Ответы [ 2 ]

4 голосов
/ 25 ноября 2011

Я совсем не эксперт по шаблонам проектирования. Но вот что я думаю может быть полезным:

Чтобы добавить действия игроку, вы можете взглянуть на шаблон стратегии . Просто Google для этого, и вы получите много примеров.

Вот моя попытка: enter image description here

Для обновления статистики игрока, я думаю, Шаблон наблюдателя будет полезен.

Шаблон наблюдателя определяет зависимость один-ко-многим между объектами, поэтому что когда один объект меняет состояние, все его иждивенцы уведомляются и обновляется автоматически.

Обеспечивает слабую связь, что облегчает будущие изменения.

(Вам нужно будет прочитать об Обозревателе, а также увидеть несколько примеров. Это не так просто, как Стратегия.)

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

В связи с тем, что вы сказали, что хотите иметь возможность добавлять новые характеристики и действия позже, я склонен создавать объект статистики, который не должен ничего знать об игре, которую он записывает.Преимущество состоит в том, что класс Stats никогда не нужно будет изменять при добавлении новых функций.

public interface Stats {
  void incrementStat(Object subject, String stat);
  int getStat(Object subject, String stat);
}

Вы Player реализация будет выглядеть примерно так:

public void jump() {
  // Logic to make the player jump...

  stats.incrementStat(this, "jump");
}

Конечно, чтовы торгуете за эту гибкость - статическая проверка типов для этих методов приращения.Но в подобных случаях я склонен думать, что простота того стоит.Помимо удаления тонн котельной плиты из классов PlayerData и PlayerManager, вы также получите многократно используемый компонент и избавитесь от циклической зависимости между PlayerManager и Player.

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