我在相应的类中实现了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创建新对象)。我在一个地方错过了这个,这是我的错误。
答案 0 :(得分:1)
看起来问题是您需要对阵列进行深层复制。否则,即使在复制的版本中,也会更改板阵列中对象的状态。
根据Apple(https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Collections/Articles/Copying.html),您可以轻松地使用
进行深层复制 NSArray *deepCopyArray=[[NSArray alloc] initWithArray:someArray copyItems:YES];
我认为,只有在Swift
中