我正在用Java创建我的第一款游戏。游戏是垄断。我正在努力设计游戏来模拟其基于回合的结构(管理玩家轮流)。我想让一个人控制的和一个或多个AI控制的玩家玩这个游戏。回合制游戏设计:事件驱动vs.游戏循环
我的具体问题是我不知道是否实施游戏循环,意味着可以管理玩家和直接与大富翁游戏相关的变量的循环(想到诸如提示每个玩家轮到他们,增加轮到下一个玩家,或从每个玩家获得骰子 - 反过来)。我并不是指“游戏循环”这个术语的更底层含义,它更多地涉及屏幕上的绘制帧,更新物理或在特定时间更新AI。
我的理解是,我的努力来实现我所需要的选项要么:
- 实现一个完全由事件驱动的程序,有没有这样的游戏循环,或
- 实现游戏环 - 一些在后台长时间运行并且只要游戏运行就基本上不会结束的东西。这将是更程序化的方法。
当我第一次尝试解决这个问题时,遇到了我的UI冻结问题,因为我的游戏循环没有结束,并且完全消耗了它正在运行的线程(我只是做了一个非常简单的while循环来说明这一点)。所以我去努力创建一个SwingWorker
来封装我的游戏循环。这解决了UI冻结的问题,但仍然让我想知道我是否走错了路。
作为一般规则,我发现网上的大多数建议似乎都倾向于任何事件驱动的方法,因此我目前使用SwingWorker
的实现可能是朝着错误方向迈出的一步。但是我不能完全理解我将如何为这个特定任务实现一个完全由事件驱动的系统(意味着没有游戏循环)。在我看来,循环必须存在于管理玩家轮流的地方。
这里是我的具体问题:
- 是游戏圈(如我描述他们)适合的回合制游戏,如垄断,专为排队播放器将和提示轮到自己相应的播放器,一次一个玩家(排队组成一个回合的整个步骤/序列)?
- 如果要创建一个纯粹的事件驱动系统来管理玩家轮流,你如何迭代每个玩家以提示他们轮到他们并继续迭代直到游戏结束?
- 如果要使用游戏循环解决上述特定问题,是否必须在其自己的线程内运行(可能使用
SwingWorker
)以避免冻结UI?我的情况是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();
垄断是不是从棋太大的不同,对我来说更有意义,让它事件驱动,因为它可以让规则的实现要容易得多,就像国际象棋,因为每个事件试图影响一些国家。 – arynaq
不管你如何实现它,你可能不希望在UI线程上正在做您的游戏CPU周期。 – Tim
如何使用有限状态机来表示游戏状态更改?我曾经用过一个粗糙的游戏来开发一个跳棋游戏,并使用基于事件的UI代码。 – SirDarius