当前位置: 首页 > 面试题库 >

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

谭兴学
2023-03-14
问题内容

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

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

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

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

刚开始尝试解决此问题时,我遇到了UI冻结的问题,因为我的游戏循环永无休止,并且完全消耗了运行该循环的线程(我做了一个非常简单的while循环来说明这一点)
。因此,我努力创建一个SwingWorker封装我的游戏循环的工具。这解决了UI冻结的问题,但仍然让我想知道我是否走错了路。

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

这是我的具体问题:

  1. 游戏循环(如我所描述的)是否适合于基于回合的游戏,例如“大富翁”(Monopoly),专门用于排队玩家的回合并提示合适的玩家进行其回合,一次一次(并排队整个/顺序的过程)包括转弯的步骤)?
  2. 如果要创建一个纯粹的事件驱动系统来管理玩家的回合,那么您如何遍历每个玩家以提示他们的回合并保持迭代直到游戏结束?
  3. 如果要使用游戏循环来解决上述特定问题,是否必须在自己的线程中运行(可能使用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();

问题答案:

SirDarius的评论是当场的。

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

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

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

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

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

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



 类似资料:
  • 我正在用Java创建我的第一个游戏。游戏是大富翁。我在纠结如何设计游戏,使其基于回合的结构模型(管理玩家回合)。我想允许一个单一的人控制和一个或多个人工智能控制的玩家玩游戏。 我的具体问题是,我不知道是否要实现一个游戏循环,这意味着一个循环可以管理玩家和与大富翁游戏直接相关的变量,(想想这样的事情,比如提示每个玩家进行他们的回合,增加回合到下一个玩家,或者从每个玩家那里获得骰子滚动--依次)。我指

  • 包含在程序启动时启动的线程。这个线程包含一个循环,每40毫秒更新一次游戏并重新绘制()board。 备选办法B: 板创建一个摆动计时器。这个计时器的动作监听器是板本身。actionPerformed()方法每40毫秒运行一次,并更新game+repaints Board()。 谢谢

  • 利用 cocos2d 制作的一个RPG回合制战斗游戏,包括人物在有障碍物的瓷砖地图中走动、回合制战斗场面,技能效果、抽奖效果。 作者说:(使用本网站代码里面的图片素材,望原作者见谅),算是自己琢磨一个月的总结吧,希望对像我一样的新手有点帮助,高手勿喷。 [Code4App.com]

  • 本食谱演示了使用组合流来创建游戏循环的一种方式。本食谱旨在突出如何用响应式的方式来重新思考现有问题。在这个示例中,我们将提供整体循环以及自上帧以来的增量时间。与此相结合的是用户输入流,以及当前的游戏状态,我们可以用它来更新我们的对象,并根据每帧的发出来将其渲染到屏幕上。 示例代码 ( StackBlitz ) import { BehaviorSubject, Observable, of, fr

  • 我对我的编程技能越来越有信心,所以我决定重新开始之前开始的纸牌游戏。这个程序的重点是现在我对程序流程、变量、条件等有了很好的掌握,我想加深我对OOP的理解 所以我需要一些关于面向对象设计的建议 我的纸牌游戏将有5个类: Main 卡 牌组(has-a-Card-ArrayList) 玩家(拥有-从牌组对象接收的卡对象的卡数组列表) 经销商 我想知道让Dealer类成为一个接口是否合适的OOP。所有

  • 问题内容: 我写一个游戏循环,我发现在例如下面的代码在这里。我还研究了进行游戏循环的其他方法,例如本文。但是我无法让这些工作。因此,我保留了第一个链接中的那个。 我想知道的是: 我编写游戏循环的方式是否是实现此目标的好方法? 有什么建议? 我应该在游戏循环中使用吗? 这是我当前的代码: 问题答案: 最终,您将想要移至LWJGL之类的地方,但让我强调一下,请继续做您现在在这里所做的事情。它将教您基本