我已经制作了一款策略游戏并为其实施了游戏套装AI。人工智能每回合可能需要多次动作。由于GKMinMaxStrategist
为每次调用提供了最佳移动,因此我将方法bestMoveForPlayer()
置于tileForAIMove()
内的while循环中。
我看到的每个实现都将该方法放在DispatchQueue.global()
单独的线程中,所以我尝试匹配它。要实际执行移动,需要更改映射,因此我在主线程上执行它。不幸的是,这会导致导致BAD ACCESS错误的奇怪行为,因为while循环可以在主线程执行上一次移动之前在全局线程内执行多次。
我尝试了几种变体,但此时无法弄清楚如何在这里有效地使用线程。这是我目前的代码:
func startAIMove() {
DispatchQueue.global().async {[unowned self] in
let strategistTime = CFAbsoluteTimeGetCurrent()
var timeCieling = 2.0
while let move = self.tileForAIMove() {
DispatchQueue.main.async {[unowned self] in
self.makeAIMove(with: move.tile, position: move.position)
//Keep going until all the moves for this possible turn are made.
self.checkForPlayerLosing()
if let currentPlayer = self.gameModel!.activePlayer! as? Player {
if currentPlayer.availableLevel3! + currentPlayer.availableLevel2! + currentPlayer.availableLevel1! + currentPlayer.availableCounters! == 0{
//No valid moves left so we transition to next player.
DispatchQueue.main.asyncAfter(deadline: .now() + timeCieling){ [unowned self] in
print("EndTurn \(self.gameModel!.activePlayer!.playerId)")
self.advanceTurnToNextPlayer()
}
}
}
}
}
}
}
基本上我要问的是,我怎么能更好地使这个线程代码。
谢谢!