【发布时间】:2017-09-16 17:43:48
【问题描述】:
所以我用 JavaFX 构建了这个游戏,但我在 gui 上遇到了一些问题。当用户单击一个按钮时,它的事件处理程序被触发。这是该事件处理程序的伪代码:
When button is clicked
try to make a move
update the board with the new move
let the AI make a move
update the board with the ai's move
这里的问题是,棋盘仅在执行完最后一行后才更新,因此在人类玩家制作完棋盘后,您永远不会真正看到棋盘。我读过一些关于用
做gui的东西Platform.runLater(() -> {
});
但这似乎对我不起作用。我在这里错过了什么?
编辑这是我的代码:
@FXML
public void btnCell(ActionEvent actionEvent) {
disableAllButtonsDuringAITurn(board.getCells());
Node sourceNode = (Node) actionEvent.getSource();
String cellId = sourceNode.getId();
int row = Character.getNumericValue(cellId.charAt(3));
int col = Character.getNumericValue(cellId.charAt(4));
board = treeBuilder.getFlippedBoard(board, row, col, Cell.Black, Cell.White);
playTurn();
}
private void playTurn() {
updateView(board.getCells());
checkWinner();
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
MakeAIMove();
updateView(board.getCells());
updateAvailableMovesForHuman();
checkWinner();
if (!canHumanMakeTurn) {
playTurn();
}
}//Only here is the view updated.
【问题讨论】:
-
从用户的角度来看,您希望它如何工作?用户应该做什么和看什么?是否涉及任何动画?人工智能计算移动需要多长时间?
-
AI 可以在没有任何用户输入的情况下进行移动,从用户的角度来看,可能几乎是瞬间完成的。因此,在用户完成所有轮到自己的输入后,系统可以立即执行 AI 移动的计算,并显示包括两个玩家移动的棋盘结果。
-
为了防止这种情况,您可以在用户移动并更新板后阻止用户输入,然后运行 PauseTransition 以安排人为延迟(或者如果您想从 JavaFX 应用程序线程中进行计算,则运行任务),当暂停或任务完成时,更新棋盘以反映 AI 移动。效果将是用户移动,UI 更新,出现暂停,在此期间用户无法进行新移动,AI 移动并更新棋盘,之后用户可以进行新移动。这就是你想要的吗?
-
您可能缺少的是 UI 更新不是即时的,您需要放弃对 JavaFX 应用程序线程的控制,以便在脉冲内发生更新。请参阅有关脉冲的 JavaFX Architecture doc 以帮助理解这一点。
-
如前所述。当用户单击一个按钮时,板应该更新,然后在线程上调用 wait 大约 2000 毫秒,然后 AI 应该让它移动。就像现在一样,用户做出动作,AI 做出动作,然后棋盘更新。从而使玩家很难看到他做了什么。