Swift 4 - GKMinmaxStrategist Модифицирует актуальную игровую модель - PullRequest
0 голосов
/ 13 апреля 2019

До того, как я начну, этот вопрос уже задавался некоторое время назад, но я не считаю, что ответ удовлетворительный ( 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) применяется к фактическому игровому полю, а не к копии, но я не понимаю почему (Чтобы подтвердить, я напечатал игровое поле сразу после входа и перед выходом функция и отпечатки различались, хотя я не ожидал, что основная плата изменится при каждом вызове этого метода). В противном случае он работает нормально и возвращает разумное движение.

Любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 13 апреля 2019

Я подозреваю, что проблема в вашей setGameModel функции:

func setGameModel(_ gameModel: GKGameModel) {
    if let board = gameModel as? Board {
        gameBoard = board.gameBoard
    }
}

Я предполагаю, что board.gameBoard - это класс, а не структура, что означает, что обе игровые модели ссылаются на одну и ту же доску. Затем, когда GKMinmaxStrategist выполняет вычисления, он меняет этот класс и, следовательно, текущую модель игры.

Надеюсь, это поможет!

...