回合制游戏设计:事件驱动与游戏循环

我正在用Java创建我的第一个游戏。游戏是大富翁。我在如何设计游戏以模拟其基于回合的结构(管理玩家回合)方面感到困惑。我想允许一个人控制和一个或多个AI控制的玩家玩游戏。

我的具体问题是,我不知道是否实施游戏循环,即可以管理玩家和与大富翁游戏直接相关的变量的循环(例如,提示每个玩家轮到他们,增加回合到下一个玩家的回合,或依次让每个玩家掷骰子)。我指的不是“游戏循环”这个词的更底层含义,它更多地涉及在屏幕上绘制框架,更新物理原理或在特定时间更新AI。

我的理解是,我尝试实现我所需要的选择是:

  1. 实施没有事件循环的完全事件驱动的程序,或者
  2. 实现游戏循环-在后台长时间运行的东西,只要游戏正在运行,它就永远不会结束。这将是更具程序性的方法。

刚开始尝试解决此问题时,我遇到了UI冻结的问题,因为我的游戏循环永无休止,并且完全消耗了运行该循环的线程(我做了一个非常简单的while循环来说明这一点)

。因此,我努力创建一个SwingWorker封装我的游戏循环的工具。这解决了UI冻结的问题,但仍然让我想知道我是否走错了路。

作为一般规则,我发现网上的大多数建议通常似乎都倾向于采用事件驱动的任何方法,因此,我当前使用a的实现SwingWorker可能是朝错误方向迈出的一步。但是我无法完全掌握如何针对此特定任务实施完全由事件驱动的系统(意味着不存在游戏循环)。在我看来,必须存在一个循环来管理玩家的转弯。

这是我的具体问题:

  1. 游戏循环(如我所描述的)是否适合于基于回合的游戏,例如“大富翁”(Monopoly),专门用于排队玩家的回合并提示合适的玩家进行其回合,一次一次(并排队整个/顺序的过程)包括转弯的步骤)?
  2. 如果要创建一个纯粹的事件驱动系统来管理玩家的回合,那么您如何遍历每个玩家以提示他们的回合并保持迭代直到游戏结束?
  3. 如果要使用游戏循环来解决上述特定问题,是否必须在自己的线程中运行(可能使用SwingWorker),以避免冻结UI?我的情况是特定于Java的,但是我想我也会对非Java特定情况的答案感兴趣。

目前,我已使用MVC模式组织代码。我的控制器是我的游戏循环(实际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();

回答:

SirDarius的评论是当场的。

但是,对于像进阶玩家这样简单的事情,您实际上并不需要费心实现完整的有限状态机。

就MVC而言,这是您应该为 玩家做的事情:

  • 提供一些方法,用于使活动玩家前进到下一个玩家并进行“转弯过程”(即掷骰子,移动活动玩家的代币等)。由于转弯过程的大部分是事件驱动的,因此这些方法调用将由控制器中的事件侦听器进行。

  • 在活动玩家结束回合后引发事件,并在其他各种输入上引发事件。

  • 每当一个玩家完成回合时,告诉模型前进到下一个玩家,然后再次开始“回合过程”。每当玩家提供输入时,都会触发一个事件,告诉模型前进到下一个回合阶段。

对于

玩家,可以使用大多数相同的代码,但是由视图驱动转弯进度没有意义。取而代之的是,模型需要具有另一种专门针对AI玩家的“转弯过程”方法。唯一的区别是代码将连续执行而无需等待视图的输入,而不是一系列事件侦听器。

以上是 回合制游戏设计:事件驱动与游戏循环 的全部内容, 来源链接: utcz.com/qa/423402.html

回到顶部