強さは、性格になる。4目並べAIに4人ぶんの個性を持たせた話
同じアルゴリズムで、弱い相手から強い相手まで
ブラウザで動く4目並べ(Connect4)のアーケードをつくった。 難易度の違う相手が順番に出てきて、勝つと次の相手へ進む。最初はやさしく、最後は手強い。
面白いのは、4人いる相手が全員「同じAI」だということだ。 脳みそは一つで、変えているのはたった二つのつまみだけ。それでも、人間の側にははっきり性格の違いに見える。
中身は、ありふれた minimax
AIの思考そのものは、ゲームAIの教科書どおりだ。
- 自分が今打てる手を全部試す
- その先の相手の手も試す
- さらにその先も、と何手か読み進める
- 最後にいちばん自分が得をする手を選ぶ
これが minimax で、無駄な枝を早めに切り落とす αβ枝刈りを足して速くしている。盤面が決着していれば勝ち負けで点をつけ、決着していなければ評価関数でざっくり点をつける。
評価関数は、こんな素朴なルールの足し算でできている。
中央の列にコインがある +4 / 1枚4つ並んでいる窓 +100自分3つ + 空き1 +8自分2つ + 空き2 +3相手3つ + 空き1 -10 ← 相手のリーチは止めたい縦・横・斜めに4マスずつの「窓」を全部スキャンして、この点を足し合わせるだけ。 中央が強いのは、4目並べでは中央の列を持っているほど勝ち筋が多いからだ。たったこれだけのルールで、AIは中央を取りに来て、こちらのリーチをふさいで、自分のリーチを作りはじめる。
強さを決めているのは、二つのつまみ
ここからが本題。4人の相手は、次の二つの値が違うだけだ。
- 読みの深さ(何手先まで読むか)
- 運の量(どれくらいの確率で、最善手ではなく適当な手を打つか)
| 相手 | 読みの深さ | 運の量 | 体感 |
|---|---|---|---|
| 1人目 | 1手 | 0.40 | とても甘い |
| 2人目 | 3手 | 0.12 | そこそこ |
| 3人目 | 5手 | 0.04 | 手強い |
| 4人目 | 6手 | 0.00 | ほぼミスしない |
深さを増やすほど先が見えるので強くなる。運の量を増やすほど、たまにわざと変な手を打つので弱くなる。 たったこの二つで、「初心者っぽいうっかり屋」から「淡々と詰めてくる本気の相手」まで地続きに作り分けられる。強さの差が、そのまま性格の差として立ち上がってくるのが気持ちいい。
完璧に解かない、という設計
4目並べを完璧に解こうとすると、本当は全部の手を最後まで読み切ればいい。でも盤面の組み合わせは天文学的で、まともにやれば固まってしまう。 だから「どこまで読むか」を決め、「読み切れない先」は評価関数というざっくりした目分量で済ませる。
全部を計算するのではなく、効くところだけ見て、あとは要点で押さえる。 そして今回は、その省き方の匙加減そのものが、相手の個性になった。
正直なところ
おもちゃなので、雑なところもある。
- 読みを深くすると、計算がブラウザのメインスレッドを占有して一瞬固まる
- 同じ評価点の手が複数あるとランダムに選ぶので、同じ局面でも打ち方がブレる(再現性は低い)
- 記録は保存していないので、リロードすると最初から
このあたりは、別スレッド(Web Worker)に思考を逃がす、同点なら中央寄りを固定で選ぶ、といった改善でいずれ直せる。でも「まず動くものを出す」を優先したので、今日のところはここまで。
このゲームも、曖昧な注文から対話しながら詰めていったらすぐ形になった。手を動かしながら考えられるのは、やっぱり強い。
(PC・スマホ対応。難易度の違う相手が順番に出てきます。インストール不要、その場で遊べます。)