強さは、性格になる。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)に思考を逃がす、同点なら中央寄りを固定で選ぶ、といった改善でいずれ直せる。でも「まず動くものを出す」を優先したので、今日のところはここまで。

このゲームも、曖昧な注文から対話しながら詰めていったらすぐ形になった。手を動かしながら考えられるのは、やっぱり強い。


🔴 4目並べAIと対戦する →

(PC・スマホ対応。難易度の違う相手が順番に出てきます。インストール不要、その場で遊べます。)