问题描述
我创建了一个简单的 tik-tac-toe 游戏,并且有一些您可以玩的机器人。我试图在连续的机器人轮次之间有一个延迟,否则所有连续的机器人移动都会同时出现在屏幕上
这是我在代码中尝试过的:
// bot functionality
private fun botturn(botDifficulty: Int) {
var botMove = 100
when (botDifficulty) {
1 -> botMove = easyBot(confirmedMoves)
2 -> botMove = mediumBot(activePlayer,confirmedMoves,maxPlayers)
3 -> botMove = hardBot(activePlayer,maxPlayers)
else -> Toast.makeText(this,"What sort of bot is this??",Toast.LENGTH_SHORT).show()
}
trueCellID = botMove
// colour chosen segment
setSegmentColor(trueCellID,-1,activePlayer)
// Todo add 1-2 second delay after confirming move?
Log.d("Wait","start of wait $activePlayer")
Thread.sleep(1000)
Log.d("Wait","end of wait $activePlayer")
confirmMove()
}
使用 Thread.sleep 似乎只是延迟所有 UI 更新,直到所有 botPlayer 睡眠发生后。我也尝试过使用 Handler.postDelayed
、GlobalScope.launch
和 delay
块和 runOnUiThread
和 SystemClock.sleep(1000)
- 这些都存在相同的问题,即执行所有机器人等待,然后是 UI 更新。
我什至尝试尝试调整此解决方案 - how to wait for Android runOnUiThread to be finished? 但得到了相同的结果 - 然后所有 UI 更新都有很大的延迟。
是否有解决方法或我错过了一些简单的东西?
解决方法
正如 broot 在评论中所建议的,将 setSegmentColor()
和 confirmMove()
都放在 postDelayed()
块中实现了 botTurn()
之间的期望延迟
val botDelay = 1500L
Handler().postDelayed(
{
// colour chosen segment then save move
setSegmentColor(botMove,-1,activePlayer)
confirmMove(botMove)
},botDelay
)