GKMinmaxStrategist在返回最佳移动后修改模型

时间:2017-06-11 16:31:32

标签: ios swift model minimax gameplay-kit

我在相应的类中实现了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创建新对象)。我在一个地方错过了这个,这是我的错误。

1 个答案:

答案 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