Дизайн пошаговых игр: событийный или игровой цикл

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

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

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

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

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

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

person nairware    schedule 25.07.2013    source источник
comment
Монополия мало чем отличается от шахмат, для меня более разумно, чтобы она была управляемой событиями, поскольку это позволит упростить реализацию правил, как в шахматах, потому что каждое событие пытается повлиять на какое-то состояние.   -  person arynaq    schedule 26.07.2013
comment
Независимо от того, как вы это реализуете, вы, вероятно, не хотите, чтобы циклы вашего игрового процессора выполнялись в потоке пользовательского интерфейса.   -  person Tim    schedule 26.07.2013
comment
как насчет использования конечного автомата для представления изменений состояния игры? Однажды я использовал грубый вариант для разработки игры в шашки с кодом пользовательского интерфейса, основанным на событиях.   -  person SirDarius    schedule 26.07.2013


Ответы (1)


Комментарий от SirDarius является точным.

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

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

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

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

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

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

person Luke    schedule 25.07.2013
comment
Я не слежу за вашим комментарием по поводу вида. Я могу понять события запуска просмотра при нажатии кнопок, но что касается начала и окончания поворотов в «Монополии», может не быть специальной кнопки для начала или окончания хода. В дополнение к этому, как насчет того, чтобы боты ИИ начинали и заканчивали свой ход? Очевидно, что они не взаимодействуют с представлением для управления поворотами, не так ли? - person nairware; 26.07.2013
comment
@nairware Ход игрока в монополии следует естественному прогрессу. Есть только несколько задач, которые нужно выполнить, и одна из них является последней задачей для каждого данного хода. Как правило, игрок бросает кости, перемещает свою фишку, выполняет действие (покупает собственность, платит штраф, берет карту и т. д.), покупает дома и (необязательно) совершает сделки. Процесс хода меняется, если игрок находится в тюрьме, но игроку все еще остается последнее действие. Когда игрок завершает свое последнее действие (или, возможно, нажимает контекстную кнопку завершения хода), ход может быть завершен. - person Luke; 26.07.2013
comment
Я следую. Безусловно, событие для завершения хода имеет смысл. Мне просто было неясно, почему представление обязательно имело какое-либо отношение к этому событию. Я думаю, вы предполагаете, что есть кнопка завершения поворота, и в этом случае ваше описание вида имеет смысл. Однако игрок, управляемый ИИ, не нажмет такую ​​кнопку, поэтому вы также предполагаете только игроков, управляемых человеком. То же самое событие конца хода сработает для игроков, управляемых ИИ, но не из-за нажатия кнопки или чего-либо, связанного с просмотром (во всяком случае, по моей оценке). - person nairware; 26.07.2013
comment
Я согласен. Для игрока-человека имеет смысл, что ход хода будет управляться пользовательским интерфейсом, но игрок ИИ будет управляться контроллером. Я обновлю свой ответ, чтобы указать задачи для поворотов ИИ. - person Luke; 26.07.2013