java 事件驱动模式_java – 回合制游戏设计:事件驱动与游戏...

我用Java创建了我的第一个游戏.这场比赛是垄断.我正在努力设计游戏以模拟其回合制结构(管理玩家转弯).我想允许单个人控和一个或多个AI控制的玩家玩游戏.

我的具体问题是我不知道是否实现游戏循环,这意味着可以管理玩家的循环以及与大富翁游戏直接相关的变量,(想想诸如提示每个玩家轮到他们的事情,将转弯增加到下一个玩家,或者依次从每个玩家获得骰子.我并不是指“游戏循环”这个术语的更低级含义,它更多地涉及屏幕上的绘图框架,更新物理或以特定的时间更新AI.

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

>实现完全事件驱动的程序,没有这样的游戏循环,或

>实现一个游戏循环 – 在后台长时间运行并且只要游戏正在运行就基本上永无止境.这将是更具程序性的方法.

当我第一次尝试解决这个问题时,我遇到了我的UI冻结的问题,因为我的游戏循环永无止境,并且完全消耗了它运行的线程(我只是做了一个非常简单的while循环来说明这一点) .所以我开始创建一个SwingWorker来封装我的游戏循环.这解决了UI冻结的问题,但仍然让我想知道我是否走错了路.

作为一般规则,我发现网上的大多数建议似乎都支持任何事件驱动的方法,因此我使用SwingWorker的当前实现可能是朝错误方向迈出的一步.但是我无法完全理解如何为这个特定任务实现一个完全事件驱动的系统(意味着没有游戏循环存在).在我看来,一个循环必须存在于某个地方,以管理玩家转弯.

以下是我的具体问题:

>游戏循环(正如我所描述的那样)适用于基于回合制的游戏,例如Monopoly – 专门用于排队玩家轮流并提示适当的玩家轮流,一次一个玩家(并排队/序列的整个过程)包含转弯的步骤)?

>如果要创建一个纯粹的事件驱动系统来管理玩家回合,你如何迭代每个玩家来提示他们轮到他们并继续迭代直到游戏结束?

>如果要使用游戏循环来解决上述特定问题,是否必须在其自己的线程中运行(可能使用SwingWorker)以避免冻结UI?我的情况是特定于Java的,但我想我也会对非Java特定情况的答案感兴趣.

目前,我使用MVC模式组织了我的代码.我的控制器是我的游戏循环(实际的SwingWorker线程)所在的位置.它远非完整,但它有助于说明我如何管理玩家转向我称之为“游戏循环”.

来自控制器的SwingWorker代码:

swingWorker = new SwingWorker() {

@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 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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值