Tim*_*len 12 swift gameplay-kit gkminmaxstrategist
我的代码中包含以下代码main.swift:
let strategist = GKMinmaxStrategist()
strategist.gameModel = position
strategist.maxLookAheadDepth = 1
strategist.randomSource = nil
let move = strategist.bestMoveForActivePlayer()
Run Code Online (Sandbox Code Playgroud)
... position我的GKGameModel子类的实例在哪里Position.运行此代码后,move是nil.bestMoveForPlayer(position.activePlayer!)也导致nil(但position.activePlayer!导致一个Player对象).
然而,
let moves = position.gameModelUpdatesForPlayer(position.activePlayer!)!
Run Code Online (Sandbox Code Playgroud)
导致非空的可能移动数组.从Apple的文档(关于bestMoveForPlayer(_:)):
如果玩家无效,玩家不是游戏模型的一部分,或玩家没有有效的移动,则返回nil.
据我所知,这种情况都不是这样,但功能仍然存在nil.这可能会发生什么?
如果它可以有任何帮助,这是我的GKGameModel协议的实现:
var players: [GKGameModelPlayer]? = [Player.whitePlayer, Player.blackPlayer]
var activePlayer: GKGameModelPlayer? {
return playerToMove
}
func setGameModel(gameModel: GKGameModel) {
let position = gameModel as! Position
pieces = position.pieces
ply = position.ply
reloadLegalMoves()
}
func gameModelUpdatesForPlayer(thePlayer: GKGameModelPlayer) -> [GKGameModelUpdate]? {
let player = thePlayer as! Player
let moves = legalMoves(ofPlayer: player)
return moves.count > 0 ? moves : nil
}
func applyGameModelUpdate(gameModelUpdate: GKGameModelUpdate) {
let move = gameModelUpdate as! Move
playMove(move)
}
func unapplyGameModelUpdate(gameModelUpdate: GKGameModelUpdate) {
let move = gameModelUpdate as! Move
undoMove(move)
}
func scoreForPlayer(thePlayer: GKGameModelPlayer) -> Int {
let player = thePlayer as! Player
var score = 0
for (_, piece) in pieces {
score += piece.player == player ? 1 : -1
}
return score
}
func isLossForPlayer(thePlayer: GKGameModelPlayer) -> Bool {
let player = thePlayer as! Player
return legalMoves(ofPlayer: player).count == 0
}
func isWinForPlayer(thePlayer: GKGameModelPlayer) -> Bool {
let player = thePlayer as! Player
return isLossForPlayer(player.opponent)
}
func copyWithZone(zone: NSZone) -> AnyObject {
let copy = Position(withPieces: pieces.map({ $0.1 }), playerToMove: playerToMove)
copy.setGameModel(self)
return copy
}
Run Code Online (Sandbox Code Playgroud)
如果还有我应该展示的其他代码,请告诉我.
您需要在应用或取消应用移动activePlayer后进行更改。在你的情况下,那就是.playerToMove
轮到对游戏模型进行更新的玩家。GKMinmaxStrategist 假定下一次调用 applyGameModelUpdate: 方法将代表该玩家执行移动。
而且当然:
函数
applyGameModelUpdate将 GKGameModelUpdate 应用到游戏模型,可能会产生一个新的 activePlayer。GKMinmaxStrategist 将在主游戏模型的副本上调用此方法,以推测未来可能的动作及其效果。假设调用此方法代表 activePlayer 属性标识的玩家执行移动。
func applyGameModelUpdate(gameModelUpdate: GKGameModelUpdate) {
let move = gameModelUpdate as! Move
playMove(move)
//Here change the current Player
let player = playerToMove as! Player
playerToMove = player.opponent
}
Run Code Online (Sandbox Code Playgroud)
您的实施也是如此unapplyGameModelUpdate。
另外,请特别注意您的setGameModel实现,因为它应该复制模型中的所有数据。这包括activePlayer
设置另一个游戏模型的数据。所有数据都应该被复制,并且不应保留任何指向复制的游戏状态的指针。GKMinmaxStrategist 使用它来处理游戏的排列,而不需要对主游戏模型应用潜在的破坏性更新。
| 归档时间: |
|
| 查看次数: |
334 次 |
| 最近记录: |