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

2023-12-31

我在相应的类中实现了 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| | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
—————————————————

顺便说一句,这是一款黑白棋游戏。

我不明白为什么我们的模型会改变......我认为副本会,但主模型将准备好应用最佳移动。

我在这里做错了什么? 这是我的模型的复制方法:

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        
}

我在这里做错了什么?提前致谢。

Edit

我在我的代码中发现了问题,它与蒂姆在回答中所说的有关。您需要检查是否确实复制了(或为 Swift 创建了新对象)。我在一个地方错过了这一点,那是我的错误。


看起来问题是您需要在阵列上进行深层复制。否则,即使在复制的版本中,棋盘数组中对象的状态也会发生变化。

根据苹果公司的说法(https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Collections/Articles/Copying.html https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Collections/Articles/Copying.html),您可以轻松地进行深复制

NSArray *deepCopyArray=[[NSArray alloc] initWithArray:someArray copyItems:YES];

我想,只是在 Swift 中 ????

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GKMinmaxStrategist 在最佳动作返回后修改模型 的相关文章

随机推荐