GameplayKitの機能の1つであるMinMax AI
を試してみました。
この機能に出てくるクラスを説明していきます。
GKMinmaxStrategist
こちらはAIの中心的なクラスになります。
GKMinmaxStrategistにはゲームのルールを渡す事で最善手を取得できるクラスです。
ルールはgameModelというプロパティーとmaxLookAheadDepthというプロパティーにセットします。
gameModelの型ですが、GKGameModelというプロトコルでゲームのルールを記述します。
maxLookAheadDepthは何手先まで読むかを表します。
ゲームの最善手の取得はbestMoveForPlayerと言うメソッドで行い、GKGameModelUpdateというプロトコルを返してくれます。
GKGameModel
このクラスでは、プレイヤー一覧、ユーザーの指し手による点数などゲームの内容を表現しています。
class GameScene: SKScene { let strategist = GKMinmaxStrategist() override func didMoveToView(view: SKView) { strategist.gameModel = Model() strategist.maxLookAheadDepth = 3 print(strategist.bestMoveForActivePlayer()) } } class Model: NSObject, GKGameModel { let _players = [ Player(playerId: 1), Player(playerId: 2) ] var players: [GKGameModelPlayer]? { return _players } var activePlayer: GKGameModelPlayer? { return _players.last } func setGameModel(gameModel: GKGameModel) { } func gameModelUpdatesForPlayer(player: GKGameModelPlayer) -> [GKGameModelUpdate]? { return [Update()] } func applyGameModelUpdate(gameModelUpdate: GKGameModelUpdate) { } func copyWithZone(zone: NSZone) -> AnyObject { return self } func scoreForPlayer(player: GKGameModelPlayer) -> Int { return 10 } } class Player: NSObject, GKGameModelPlayer { let playerId: Int init(playerId: Int) { self.playerId = playerId } } class Update: NSObject, GKGameModelUpdate { var value = 10 }