2013-07-25 3 views
8

Я создаю свою первую игру на Java. В игре есть монополия. Я борюсь с тем, как я должен разработать игру для моделирования своей пошаговой структуры (управляющий поворот игрока). Я хочу, чтобы в игре играли как один контролируемый человеком, так и один или несколько игроков, контролируемых AI.Пошаговый дизайн игры: управляемый событиями против игровой петли

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

Я понимаю, что мои варианты пытаемся осуществить то, что мне нужно либо:

  1. Реализовать программу полностью управляемые событий, которая не имеет такой игровой цикла, или
  2. Реализовать игру петли то, что долгое время работает в фоновом режиме и в основном никогда не заканчивается, пока игра запущена. Это будет более процедурный подход.

Когда я впервые начал пытаться решить эту проблему, у меня возникли проблемы с замораживанием моего пользовательского интерфейса, потому что мой игровой цикл никогда не заканчивался и полностью поглощал поток, на котором он работал (я просто сделал очень простой while, чтобы проиллюстрировать это). Поэтому я попытался создать SwingWorker, чтобы инкапсулировать цикл игры. Это решило проблему зависания UI, но все же оставило меня в недоумении, не пошел ли я по неверному пути.

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

Вот мои конкретные вопросы:

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

В настоящее время у меня есть код, организованный с использованием шаблона MVC. Мой контроллер там, где находится мой игровой цикл (фактическая строка SwingWorker). Это далеко не полный, но это помогает проиллюстрировать, как я управляю игроком, превращаясь в то, что я называю «игровым циклом».

SwingWorker код из контроллера:

swingWorker = new SwingWorker<Void, Model>() { 
@Override 
protected Void doInBackground() throws InterruptedException { 
gameLoopRunning = true; 
while (gameLoopRunning) { 

    //to do: use a timer instead of thread.sleep 
    Thread.sleep(1000); 

    //user turn prompt 
    if (model.getActivePlayer().isUserControlled()) { 

     boolean userRolled = false; 
     while(!userRolled) { 
      System.out.println("Roll the dice please..."); 
      Thread.sleep(3000); 
     } 

    } 
    //bot turn prompt 
    else { 
     //insert code for bot rolling dice here 
     model.rollDice(); 
    } 

    publish(model); 

    Thread.sleep(1000); 
    model.incrementPlayerTurn(); 
    publish(model); 

} 
return null; 
} 

@Override 
protected void process(List<Model> chunks) { 
Model gameModel = chunks.get(chunks.size() - 1); 
//hard-coded for 6 players 
for (int i = 0; i < 6; i++) { 
    view.getPlayerPanel(i).setTurn(gameModel.getPlayers().get(i).isTurn()); 
} 
view.getGamePanel().getDice().setDie1(model.getDie1()); 
view.getGamePanel().getDice().setDie2(model.getDie2()); 
} 

}; 
swingWorker.execute(); 
+0

Монополия ничем не отличается от шахмат, для меня более разумно позволить ей быть eventdriven, поскольку это позволит реализовать правила намного проще, например, в шахматы, потому что каждое событие пытается повлиять на какое-то состояние. – arynaq

+0

Независимо от того, как вы его реализуете, вы, вероятно, не хотите, чтобы ваши циклы циклов игрового процесса выполнялись в потоке пользовательского интерфейса. – Tim

+1

как использовать конечный автомат для представления изменений состояния игры? Я когда-то использовал грубую игру для разработки игры с шашками с кодом пользовательского интерфейса на основе событий. – SirDarius

ответ

9

Комментарий от SirDarius находится на месте.

Хотя, для чего-то такого же простого, как и продвигающийся игрок, вам не нужно беспокоиться о внедрении полноценного конечного автомата.

С точки зрения MVC, это то, что вы должны сделать для человека игроков:

  • Модель: Предоставлять методы для продвижения активного игрока к следующему игроку и для запуска через " (например, свертывание кости, перемещение маркера активного игрока и т. д.). Поскольку большая часть процесса поворота управляется событиями, эти вызовы методов будут выполняться из прослушивателей событий в контроллере.

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

  • Контроллер: Когда игрок заканчивает свою очередь, попросите модель перейти к следующему игроку и снова запустите «процесс поворота». Всякий раз, когда игрок предоставляет вход, будет запущено событие, которое подскажет модели перейти на следующий этап хода.

Для AI игроков, большинство из того же кода, можно использовать, но это не имеет смысла иметь прогрессия очередь быть обусловлен видом. Вместо этого модели понадобится другой метод «поворота», который будет специально для игроков AI. Единственное различие заключается в том, что код будет выполняться последовательно, не дожидаясь ввода из представления, а не быть рядом слушателей событий.

+0

Я не следую вашему комментарию о представлении. Я могу понять события сжигания вида, когда нажимают кнопки, но насколько они начинаются и заканчиваются в монополии, может не быть выделенной кнопки для начала или окончания поворота. В дополнение к этому, что относительно ботов ИИ, начиная и заканчивая их очереди? Очевидно, что они не взаимодействуют с точкой зрения на управление поворотами, не так ли? – nairware

+0

@nairware Поворот игрока в монополию следует естественному прогрессированию. Выполнять так много задач, и одна из них - последняя задача для любого поворота. В общем, игрок бросает кости, перемещает их кусок, совершает действие (покупает имущество, платит штраф, рисует карту и т. Д.), Покупает дома и (необязательно) совершает сделки. Процесс поворота изменяется, если игрок находится в тюрьме, но для игрока все еще есть окончательное действие. Когда игрок заканчивает свое окончательное действие (или, возможно, нажимает кнопку контекстного «поворота конца»), поворот может быть завершен. –

+0

Я следую. Конечно, событие для окончания поворота имеет смысл. Я просто не понял, почему мнение обязательно имеет какое-либо отношение к этому событию. Я думаю, вы предполагаете, что есть кнопка «поворот конца», и в этом случае ваше описание представления имеет смысл.Игрок, контролируемый AI, не будет нажимать на эту кнопку, поэтому вы также принимаете игроков, контролируемых человеком. То же самое событие конца поворота будет срабатывать для игроков, контролируемых AI, но не от щелчка кнопки или чего-либо, связанного с просмотром (по моей оценке в любом случае). – nairware

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