До того, как я начну, этот вопрос уже задавался некоторое время назад, но я не считаю, что ответ удовлетворительный ( GKMinmaxStrategist изменяет модель после возврата лучшего хода )
Я пытаюсь построить простую настольную игру с двумя типами игроков (король, враг). В рамках этого я пытаюсь реализовать GKMinmaxStrategist, и проблема в том, что он продолжает модифицировать фактическую модель игры, а не симулирует ходы на копии.
Позвольте мне начать с показа кода:
//From Board Class
func moveToken(move: Move) {
let tokenAtOrigin = tokenAt(at: move.origin)
gameBoard[move.destination.row, move.destination.column] = tokenAtOrigin
tokenAtOrigin?.row = move.destination.row
tokenAtOrigin?.column = move.destination.column
gameBoard[move.origin.row, move.origin.column] = nil
}
//Extension to Board for strategist implementation
extension Board: GKGameModel {
func copy(with zone: NSZone? = nil) -> Any {
let copy = Board()
copy.setGameModel(self)
print(copy === self) //returns False
return copy
}
func setGameModel(_ gameModel: GKGameModel) {
if let board = gameModel as? Board {
gameBoard = board.gameBoard
}
}
func apply(_ gameModelUpdate: GKGameModelUpdate) {
guard let move = gameModelUpdate as? Move else {
return
}
moveToken(move: move)
currentPlayer = currentPlayer.opponent
}
}
//GameViewController
var board = Board()
strategist.gameModel = board
...
Как упоминалось в коде выше, copy
и self
оказываются отдельными экземплярами. Я совершенно уверен, что проблема в методе применения, где moveToken(move: move)
применяется к фактическому игровому полю, а не к копии, но я не понимаю почему (Чтобы подтвердить, я напечатал игровое поле сразу после входа и перед выходом функция и отпечатки различались, хотя я не ожидал, что основная плата изменится при каждом вызове этого метода). В противном случае он работает нормально и возвращает разумное движение.
Любая помощь будет высоко ценится!