3目並べ(ミニマックス法)
前回は3目並べをランダムでプレイするコードを実装しました。
今回はミニマックス法を使って3目並べをプレイしてみます。
ミニマックス法は相手が自分にとって最も不利になる手を指すと仮定して、最善の手を探す方法です。
解き方・ソースコード
相手が手番の場合は選択できる手の中から最も評価値の高い手を選び、自分が手番の場合は選択できる手の中から最も評価値の低い手を選びます。
ゲームの評価値としては、勝てば $ 1 $ ポイント、負ければ $ -1 $ ポイント、引き分けであれば $ 0 $ ポイントとします。(minmax関数)
[Google Colaboratory]
1 | goal = [0b111000000, 0b000111000, 0b000000111, # 横に3つ並んだケース |
[実行結果]
選択可能なマス目 [0, 1, 2, 3, 4, 5, 6, 7, 8] マス目の評価値 [0, 0, 0, 0, 0, 0, 0, 0, 0] 選択するマス目 0 ---------------------------- 選択可能なマス目 [1, 2, 3, 4, 5, 6, 7, 8] マス目の評価値 [-1, -1, -1, 0, -1, -1, -1, -1] 選択するマス目 4 ---------------------------- 選択可能なマス目 [1, 2, 3, 5, 6, 7, 8] マス目の評価値 [0, 0, 0, 0, 0, 0, 0] 選択するマス目 1 ---------------------------- 選択可能なマス目 [2, 3, 5, 6, 7, 8] マス目の評価値 [0, -1, -1, -1, -1, -1] 選択するマス目 2 ---------------------------- 選択可能なマス目 [3, 5, 6, 7, 8] マス目の評価値 [-1, -1, 0, -1, -1] 選択するマス目 6 ---------------------------- 選択可能なマス目 [3, 5, 7, 8] マス目の評価値 [0, -1, -1, -1] 選択するマス目 3 ---------------------------- 選択可能なマス目 [5, 7, 8] マス目の評価値 [0, -1, -1] 選択するマス目 5 ---------------------------- 選択可能なマス目 [7, 8] マス目の評価値 [0, 0] 選択するマス目 7 ---------------------------- 選択可能なマス目 [8] マス目の評価値 [0] 選択するマス目 8 ---------------------------- 引き分け ['0b10011100', '0b101100011']
結果は引き分けとなりました。
3目並べでは両者が最善の手を選べば、確実に引き分けになります。