java - 如何制作等待用户事件的java应用程序

标签 java

我正在开发一款 4 人纸牌游戏。一名玩家是用户,而其他玩家是计算机玩家。我开始循环从每个玩家那里获取牌。电脑玩家通过自动选择合适的卡片来 throw 卡片,而用户则通过点击卡片来 throw 卡片。但问题是,循环不等待用户选择。

最佳答案

有几种方法可以解决这个问题。一种是让游戏逻辑位于与用户界面不同的线程中。它会经历这样的循环:

while (!gameOver()) {
    getPlayerMoves();
    updateGameState();
    notifyUI();
}

getPlayerMoves() 方法会阻止每个玩家(无论是计算机还是人类),直到移动可用为止。计算机播放器可以在同一线程中实现,因为它们并不真正阻塞。 notifyUI() 方法将通知 UI 线程游戏状态已更改。执行此操作的一种便捷方法是使用消息队列。

UI 线程将简单地监听事件并对它们使用react。它预计有两种事件:来自游戏逻辑线程的通知(如上所述)和(人类)玩家的移动。当它收到游戏状态已更改的通知时,它将更新显示并启用玩家移动。当它收到玩家移动时,它将禁用该玩家的额外移动(因为玩家每回合不应移动两次),向游戏线程发送通知,并等待另一个事件。 (如果只有一名人类玩家,那么此时唯一可能的事件应该是游戏状态更改。)

如果您使用 Swing,有几个内置类可以极大地简化线程之间的此类通知。看看SwingWorker类开始。如果没有,看看this thread用于线程之间消息的方式。

关于java - 如何制作等待用户事件的java应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7301835/

相关文章:

java - 如何为 Guice 指定默认的枚举实例?

Java CXF WS 客户端 - gZip HTTP REQUEST HEADER 被忽略

java - 需要帮助计算值(value)百分比

java - 使用 JNI 时如何摆脱 LD_PRELOAD

java - 使用所属类的lazy-init选项运行计划方法

java - Maven:发现从元素 "reportSets"开始的无效内容

java - 如何使SearchView与RecyclerView相同?

java - SQLite select 不适用于Where 子句

java - 隐藏和显示后 float 操作按钮图标图像不显示

java - 游戏框架 2.2 java : how to set language (i18n) from subdomain