を返しません。このコードを実行すると、move
はnil
になります。 bestMoveForPlayer(position.activePlayer!)
もnil
になります(但しposition.activePlayer!
の結果はPlayer
になります)。しかしながらGKMinmaxStrategistは、私は私の<code>main.swift</code>に次のコードを持っている任意の移動
、可能な動きの非空の配列に
let moves = position.gameModelUpdatesForPlayer(position.activePlayer!)!
結果。 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
}
私は私に知らせて、表示されるはずです他のコードがある場合。 がか適用解除動きを適用した後activePlayer
** maxLookAheadDepth **を増やしてみましたか? –
私は持っていますが、違いはありません。 –
私は理論を持っています、あなたのplayMove()の実装を追加して、自分の理論が正しいかどうか確認できますか? –