Дизайн OO, откройтесь/закройте вопрос о принципе

REASON

Это происходит потому, что на данный момент они отправляют только 64-битную JRE с Android Studio для Windows , которая производит сбои в 32-битных системах.

SOLUTION

  • не используйте встроенный JDK: перейдите в раздел «Файл -> Структура проекта», снимите флажок «Использовать встроенный JDK» и выберите 32-разрядную JRE, которую вы установили отдельно в своей системе
  • уменьшает объем памяти для Gradle в gradle.properties (свойства проекта), например, для установки на -Xmx768m.

Подробнее: https: // код. google.com/p/android/issues/detail?id=219524

7
задан Ruben Bartelink 27 November 2009 в 08:38
поделиться

9 ответов

Я думаю, что Вы не должны позволять Игровому классу обработать IO. этот путь, (блокирующийся) метод TakeTurn скроет от игровой доски средства реализации. это может использовать другие объекты общаться с пользователем.

Весь Игровой класс должен интересоваться, состояние платы и поворота. игроки должны все реализовать одиночный интерфейс и скрыть всю реализацию от Игры.

7
ответ дан 6 December 2019 в 19:44
поделиться

Если Игра управляет игровым состоянием и делает ввод-вывод, Игра делает слишком много.

Вы хотите, чтобы Игра была сильно сосредоточена на просто правилах и поворотах и изменениях состояния. Игра не знает, каков плеер; это только знает, что имеет плееры.

Вы хотите, чтобы Плееры исследовали Игру, указывают и выполняют судебные иски во время их очередей.

Плееры - люди и Игра в целом оба совместно используют общий пакет ввода-вывода, который показывает игровое состояние и предлагает людям их вход.

Можно хорошо использовать Java Observable заставляя ввод-вывод упаковать Observer из Игры. Тем путем об Игровых изменениях состояния сообщают вводу-выводу для дисплея или входа или обоих.

2
ответ дан 6 December 2019 в 19:44
поделиться

Я думаю Game Класс не должен касаться ни о каких реализациях классов Плеера и также игнорировать Пользовательский интерфейс.

Любой ввод данных пользователем должен быть обработан HumanPlayer класс.

0
ответ дан 6 December 2019 в 19:44
поделиться

Интерфейс, который Плеер представляет Игре, является ортогональным к поведению полученных классов Плеера.

То, что реализация TakeTurn варьируется в зависимости от конкретного типа объекта Плеера, не должно быть поводом для беспокойства.

1
ответ дан 6 December 2019 в 19:44
поделиться

Я сказал бы, Игровой класс не должен заботиться, является ли это компьютерным плеером или плеером - человеком. Это должно всегда называть TakeTurn на следующем классе плеера. Если это - плеер - человек, это - ответственность класса Плеера, чтобы общаться с пользователем и спросить пользователя, что сделать. Это означает, что заблокируется, пока пользователь не решился. Поскольку обычно взаимодействие UI происходит в основном потоке приложения, только важно, чтобы блокирующийся TakeTurn не блокировал приложение в целом, иначе ввод данных пользователем не может быть обработан, в то время как Игра ожидает TakeTurn.

0
ответ дан 6 December 2019 в 19:44
поделиться

Вместо того, чтобы говорить игровой класс существует только когда-либо один человек, почему бы не позволить ему получить тот вход во время меню/инициализации игры? Если существует больше плееров, которые могут быть решены через некоторую форму входа (выберите плееры в меню), до игровой инициализации класса.

1
ответ дан 6 December 2019 в 19:44
поделиться

Вместо Игрового вызова класса TakeTurn на всех плеерах игроки должны назвать TakeTurn на Игровом классе, и Игровой класс должен проверить, если правильный плеер принимает свой оборот.

Это должно помочь решить Пользовательскую и Компьютерную проблему с плеером.

0
ответ дан 6 December 2019 в 19:44
поделиться

Я, не уверено, является ли это тем, что Вы хотите

public abstract class Player 
{
  int position;
  DecisionMaker decisionDependency;

  ...

  public void TakeTurn()
  {
    position += RollDice();
    GameOption option GetOptions(position);
    MakeDescion(option);
  }

  protected int RollDice()
  {
    //do something to get the movement
  }

  protected abstract void MakeDecision(GameOption option);

}

Public class ComputerPlayer : Player
{
  public ComputerPlayer()
  {
    decisionDependency = new AIDecisionMaker();
  }

  protected override void void MakeDecision(GameOption option)
  {
    decisionDependency.MakeDecision(option);
    //do stuff, probably delgate toan AI based dependency
  }
}

Public class HumanPlayer : Player
{
  public HumanPlayer()
  {
    decisionDependency = new UIDecisionMaker();
  }

  protected override void void MakeDecision(GameOption option)
  {
    decisionDependency.MakeDecision(option);
    //do stuff, probably interacting with the a UI or delgate to a dependency
  }
}
0
ответ дан 6 December 2019 в 19:44
поделиться

Вероятно, у меня не было бы двух классов HumanPlayer и ComputerPlayer , а только один класс Player , который настраивается во время создания с правильной стратегией ввода.

Способ получения игроком информации для решения своего хода в следующем ходу игры - это единственная вещь, которая отличается (по крайней мере, от исходного описания задачи), поэтому просто инкапсулируйте это в отдельной абстракции.

Какой бы высокоуровневый класс ни создавал игру, он должен также создать два набора игроков (один человек, другой смоделированный компьютером) с правильной стратегией ввода для каждого, а затем просто передать эти объекты игрока объекту игры. Тогда класс Game будет вызывать метод TakeTurn только для данного списка игроков для каждого нового хода.

2
ответ дан 6 December 2019 в 19:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: