GKMinmaxStrategist 在 return 最佳移动后修改模型
GKMinmaxStrategist modifies model after return of best move
我在相应的 类 中实现了 GKGameModel、GKGameModelPlayer 和 GKGameModelUpdate 协议。在我询问最佳策略后,策略师更改了我的模型板。
我了解它是如何工作的,制作模型的副本并尝试了所有动作,但我认为我的“主要”模型(来自制作的副本)不会受到影响。
这是我的:
let strategist = GKMinmaxStrategist()
strategist.maxLookAheadDepth = 0
strategist.randomSource = GKRandomSource()
//my model. game is my auxiliary class, players is an array of GKGameModelPlayer
let gameTable = GameTable(game: game, players: [player1, player2])
strategist.gameModel = gameTable
print(gameTable.board)
let moveForActivePlayer = strategist.bestMoveForActivePlayer()
print(gameTable.board)
输出日志:
//first print:
—————————————————
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | |X|O| | | |
| | | |O|X| | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
—————————————————
//second print (after bestMove)
—————————————————
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | |O|O| | | |
| | | |O|O| | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
—————————————————
顺便说一句,这是黑白棋 (othello) 游戏。
我不明白为什么我们的模型会改变...我以为副本会,但主要模型会准备好应用最佳移动。
我做错了什么?
这是我模型的复制方法:
func copy(with zone: NSZone? = nil) -> Any {
let table = GameTable(game: self.game)
table.setGameModel(self)
return table
}
func setGameModel(_ gameModel: GKGameModel) {
let table = gameModel as! GameTable
self.board = table.board.copy() //board is a class with array of every cell.
//It's responsible for game state.
//copy() here just returns new instance with same values for cells
self.players = table.players
self.activePlayer = table.activePlayer
}
我在这里做错了什么?提前致谢。
编辑
我在我的代码中发现了问题,这与蒂姆在他的回答中所说的有关。您需要检查您是否真的制作了副本(或为 Swift 创建新对象)。我错过了一个地方,那是我的错误。
看来问题是您需要对阵列进行深拷贝。否则,即使在复制的版本中,您的板阵列中对象的状态也会发生变化。
根据 Apple (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Collections/Articles/Copying.html) 的说法,您可以使用
轻松进行深度复制
NSArray *deepCopyArray=[[NSArray alloc] initWithArray:someArray copyItems:YES];
只是,我假设,在 Swift
我在相应的 类 中实现了 GKGameModel、GKGameModelPlayer 和 GKGameModelUpdate 协议。在我询问最佳策略后,策略师更改了我的模型板。 我了解它是如何工作的,制作模型的副本并尝试了所有动作,但我认为我的“主要”模型(来自制作的副本)不会受到影响。
这是我的:
let strategist = GKMinmaxStrategist()
strategist.maxLookAheadDepth = 0
strategist.randomSource = GKRandomSource()
//my model. game is my auxiliary class, players is an array of GKGameModelPlayer
let gameTable = GameTable(game: game, players: [player1, player2])
strategist.gameModel = gameTable
print(gameTable.board)
let moveForActivePlayer = strategist.bestMoveForActivePlayer()
print(gameTable.board)
输出日志:
//first print:
—————————————————
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | |X|O| | | |
| | | |O|X| | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
—————————————————
//second print (after bestMove)
—————————————————
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | |O|O| | | |
| | | |O|O| | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
—————————————————
顺便说一句,这是黑白棋 (othello) 游戏。
我不明白为什么我们的模型会改变...我以为副本会,但主要模型会准备好应用最佳移动。
我做错了什么? 这是我模型的复制方法:
func copy(with zone: NSZone? = nil) -> Any {
let table = GameTable(game: self.game)
table.setGameModel(self)
return table
}
func setGameModel(_ gameModel: GKGameModel) {
let table = gameModel as! GameTable
self.board = table.board.copy() //board is a class with array of every cell.
//It's responsible for game state.
//copy() here just returns new instance with same values for cells
self.players = table.players
self.activePlayer = table.activePlayer
}
我在这里做错了什么?提前致谢。
编辑
我在我的代码中发现了问题,这与蒂姆在他的回答中所说的有关。您需要检查您是否真的制作了副本(或为 Swift 创建新对象)。我错过了一个地方,那是我的错误。
看来问题是您需要对阵列进行深拷贝。否则,即使在复制的版本中,您的板阵列中对象的状态也会发生变化。
根据 Apple (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Collections/Articles/Copying.html) 的说法,您可以使用
轻松进行深度复制NSArray *deepCopyArray=[[NSArray alloc] initWithArray:someArray copyItems:YES];
只是,我假设,在 Swift