Я создаю свою первую игру на Java. В игре есть монополия. Я борюсь с тем, как я должен разработать игру для моделирования своей пошаговой структуры (управляющий поворот игрока). Я хочу, чтобы в игре играли как один контролируемый человеком, так и один или несколько игроков, контролируемых AI.Пошаговый дизайн игры: управляемый событиями против игровой петли
Моя особая проблема заключается в том, что я не знаю, следует ли реализовать игровой цикл или нет, что означает цикл, который может управлять игроками и переменными, напрямую связанными с игрой монополии (подумайте о таких вещах, как подсказка каждому игроку в свою очередь, увеличивая ход до следующего игрока или получая броски кубиков от каждого игрока - в свою очередь). Я не имею в виду более низкий уровень термина «игровой цикл», который больше связан с рисованием кадров на экране, обновлением физики или обновлением AI с определенной скоростью.
Я понимаю, что мои варианты пытаемся осуществить то, что мне нужно либо:
- Реализовать программу полностью управляемые событий, которая не имеет такой игровой цикла, или
- Реализовать игру петли то, что долгое время работает в фоновом режиме и в основном никогда не заканчивается, пока игра запущена. Это будет более процедурный подход.
Когда я впервые начал пытаться решить эту проблему, у меня возникли проблемы с замораживанием моего пользовательского интерфейса, потому что мой игровой цикл никогда не заканчивался и полностью поглощал поток, на котором он работал (я просто сделал очень простой while, чтобы проиллюстрировать это). Поэтому я попытался создать SwingWorker
, чтобы инкапсулировать цикл игры. Это решило проблему зависания UI, но все же оставило меня в недоумении, не пошел ли я по неверному пути.
Как правило, я обнаружил, что большинство рекомендаций в Интернете, как правило, благоприятствует любому подходу, управляемому событиями, и поэтому моя текущая реализация с использованием 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();
Монополия ничем не отличается от шахмат, для меня более разумно позволить ей быть eventdriven, поскольку это позволит реализовать правила намного проще, например, в шахматы, потому что каждое событие пытается повлиять на какое-то состояние. – arynaq
Независимо от того, как вы его реализуете, вы, вероятно, не хотите, чтобы ваши циклы циклов игрового процесса выполнялись в потоке пользовательского интерфейса. – Tim
как использовать конечный автомат для представления изменений состояния игры? Я когда-то использовал грубую игру для разработки игры с шашками с кодом пользовательского интерфейса на основе событий. – SirDarius