しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swiftで簡単にミニマックス法が使えるMinMax AIを使ってみる

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
}