我在main.swift
下面的代碼:GKMinmaxStrategist不返回任何動作
let strategist = GKMinmaxStrategist()
strategist.gameModel = position
strategist.maxLookAheadDepth = 1
strategist.randomSource = nil
let move = strategist.bestMoveForActivePlayer()
...其中position
是我GKGameModel
子Position
的一個實例。此代碼運行後,move
是nil
。 bestMoveForPlayer(position.activePlayer!)
也導致nil
(但position.activePlayer!
產生Player
對象)。
然而,
let moves = position.gameModelUpdatesForPlayer(position.activePlayer!)!
導致的可能的移動的非空數組。從蘋果公司的文件(約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
}
如果有任何其他的代碼,我應該表現,讓我知道。
你試過增加** maxLookAheadDepth **嗎? –
我有,但它沒有區別。 –
我有一個理論,可否請您添加您的playMove()實現來查看我的理論是否正確? –