Пошаговый игровой дизайн: Event-Driven vs. Game Loop

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

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

Насколько я понимаю, мои варианты реализации того, что мне нужно, заключаются в следующем:

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

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

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

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

Являются ли игровые циклы (как я их описываю) подходящими для пошаговых игр, таких как Монополия, - в частности, для постановки в очередь ходов игрока и подсказки соответствующему игроку для своего хода, по одному игроку за раз (и постановки в очередь всей процедуры / последовательности шаги, которые составляют поворот)?Если для управления ходами игроков должна быть создана чисто управляемая событиями система, как вы будете проходить через каждого игрока, чтобы запросить у них свой ход и продолжать итерацию до конца игры?Если игровой цикл должен был использоваться для решения конкретной проблемы, описанной выше, должен ли он выполняться в своем собственном потоке (возможно, с использованием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();

Ответы на вопрос(1)

Ваш ответ на вопрос