SVX日記
2016-01-07(Thu) 石取りゲームのAIを作ってみる
で、とりあえず、習作として「石取りゲーム」を作ってみることにした。ルールは簡単で、まとめて置いてある数十個の石ころから「1~3個の石を順に取り合い、最後の1個を取った(取らされた)ら負け」というルールである。
単純なルールなので、容易に必勝法に思い至るが、そのロジックをプログラミングしても発展性がない。ここは「ミニマックス法」を採用するべき状況なのである。というわけで、秘蔵のインデックスを検索し「Oh!X1990年4月号」を引っ張り出し、故祝一平氏の連載「C調言語講座PRO-68K」から「第21回 思考よ~ん(その4)」の記事を参照するのであった。ホンマOh!Xは一生もんでっせ。
当記事では「ミニマックス法」よりは「αβの枝刈り」の説明を主としつつも、成果物(コード)には実装しない、というある意味で潔い(?)内容になっているが、内容的には十分に参考になるものだ。とりあえず、記事を参考に「ミニマックス法」をRubyで実装してみた。「αβの枝刈り」は、まぁ、余裕があったらやるということで。
いざ対戦してみると、ゲームのルールがシンプルなだけに、ゲーム開始時の石数が十数個であれば、容易に読み切れてしまうことがわかった。「読み切り」とは、勝負の完了に至るすべてのパターンの把握をいう。それには、えらく複雑な処理が必要かと言えばさほどでもなく、評価関数に至ってはルールをそのまま表した、以下のコードだけ。
149 def evaluate(game)
150 point = 50 # 標準の評価点
151 game.stones == 1 and point = 99999 # 手番後に石の残りを 1 にしたら勝ち
152 point
153 end
コードを置いておく。