REASON
Это происходит потому, что на данный момент они отправляют только 64-битную JRE с Android Studio для Windows , которая производит сбои в 32-битных системах.
SOLUTION
Подробнее: https: // код. google.com/p/android/issues/detail?id=219524
Я думаю, что Вы не должны позволять Игровому классу обработать IO. этот путь, (блокирующийся) метод TakeTurn скроет от игровой доски средства реализации. это может использовать другие объекты общаться с пользователем.
Весь Игровой класс должен интересоваться, состояние платы и поворота. игроки должны все реализовать одиночный интерфейс и скрыть всю реализацию от Игры.
Если Игра управляет игровым состоянием и делает ввод-вывод, Игра делает слишком много.
Вы хотите, чтобы Игра была сильно сосредоточена на просто правилах и поворотах и изменениях состояния. Игра не знает, каков плеер; это только знает, что имеет плееры.
Вы хотите, чтобы Плееры исследовали Игру, указывают и выполняют судебные иски во время их очередей.
Плееры - люди и Игра в целом оба совместно используют общий пакет ввода-вывода, который показывает игровое состояние и предлагает людям их вход.
Можно хорошо использовать Java Observable
заставляя ввод-вывод упаковать Observer
из Игры. Тем путем об Игровых изменениях состояния сообщают вводу-выводу для дисплея или входа или обоих.
Я думаю Game
Класс не должен касаться ни о каких реализациях классов Плеера и также игнорировать Пользовательский интерфейс.
Любой ввод данных пользователем должен быть обработан HumanPlayer
класс.
Интерфейс, который Плеер представляет Игре, является ортогональным к поведению полученных классов Плеера.
То, что реализация TakeTurn варьируется в зависимости от конкретного типа объекта Плеера, не должно быть поводом для беспокойства.
Я сказал бы, Игровой класс не должен заботиться, является ли это компьютерным плеером или плеером - человеком. Это должно всегда называть TakeTurn на следующем классе плеера. Если это - плеер - человек, это - ответственность класса Плеера, чтобы общаться с пользователем и спросить пользователя, что сделать. Это означает, что заблокируется, пока пользователь не решился. Поскольку обычно взаимодействие UI происходит в основном потоке приложения, только важно, чтобы блокирующийся TakeTurn не блокировал приложение в целом, иначе ввод данных пользователем не может быть обработан, в то время как Игра ожидает TakeTurn.
Вместо того, чтобы говорить игровой класс существует только когда-либо один человек, почему бы не позволить ему получить тот вход во время меню/инициализации игры? Если существует больше плееров, которые могут быть решены через некоторую форму входа (выберите плееры в меню), до игровой инициализации класса.
Вместо Игрового вызова класса TakeTurn на всех плеерах игроки должны назвать TakeTurn на Игровом классе, и Игровой класс должен проверить, если правильный плеер принимает свой оборот.
Это должно помочь решить Пользовательскую и Компьютерную проблему с плеером.
Я, не уверено, является ли это тем, что Вы хотите
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
}
}
Вероятно, у меня не было бы двух классов HumanPlayer
и ComputerPlayer
, а только один класс Player
, который настраивается во время создания с правильной стратегией ввода.
Способ получения игроком информации для решения своего хода в следующем ходу игры - это единственная вещь, которая отличается (по крайней мере, от исходного описания задачи), поэтому просто инкапсулируйте это в отдельной абстракции.
Какой бы высокоуровневый класс ни создавал игру, он должен также создать два набора игроков (один человек, другой смоделированный компьютером) с правильной стратегией ввода для каждого, а затем просто передать эти объекты игрока объекту игры. Тогда класс Game будет вызывать метод TakeTurn
только для данного списка игроков для каждого нового хода.