Slide 73
Slide 73 text
mutating func next() {
let currentBoard = self.currentBoard
let adjacentToEmpty = adjacentPositions(to: position(for: .empty))
let boardOptions = adjacentToEmpty.map { position -> (board: [[Tile]], moved: Tile, validPositions: Int) in
let tileToMove = tile(at: position)
move(tile: tileToMove)
defer { self.currentBoard = currentBoard }
return (self.currentBoard, tileToMove, validPositions)
}.filter { $0.moved != _previousNextTile }
let amountOfValidPositionsList = boardOptions.map { $0.validPositions }
let largestAmountOfValidPositions = amountOfValidPositionsList.max()
precondition(largestAmountOfValidPositions != nil, "No maximum valid positions found in \(boardOptions)")
let nextBestSteps = amountOfValidPositionsList.filter { $0 == largestAmountOfValidPositions }
let bestStepIndex = boardOptions.firstIndex { $0.validPositions == nextBestSteps.first }
precondition(bestStepIndex != nil, "Should always have an index for the next best step")
let bestOption = boardOptions[bestStepIndex!]
self.currentBoard = bestOption.board
_previousNextTile = bestOption.moved
}
52 — @basthomas