C#で三目並べをつくったのですが、CPU側は次の着手をランダムに選択していただけなので弱すぎました。そこでAIを強くすることを考えます。

リーチがかかっているとき

まず3目並ぶときは勝ちを決め、プレーヤーが3目並びそうなときはこれを阻止します。

そのために縦横ななめに3つそろうCellの組み合わせ8とおりを取得するメソッドを定義します。

角の位置にあるCellもよく使うのでこれを取得するメソッドを定義します。

コンストラクタ内で上記メソッドを実行して、結果をフィールド変数に格納します。

すでにリーチがかかっているかもしれないので、これをチェックするメソッドを定義します。

CPUの手番のときにCPU側がリーチの場合は勝負を決め、プレーヤー側がリーチのときはこれを阻止します。

ThinkCpuメソッドを以下のように変更します。

複数のリーチをかける手段を探す

もしCPU側から複数のリーチをかける手段が存在するならその手を採用するとともに、それ以外のときはプレーヤーから複数のリーチをかける手段が存在しないような着手を選ぶようにします。

もしCPU側から複数のリーチをかける手段が存在する場合、これを実行する処理を示します。

プレーヤー側から複数のリーチをかける手段が存在する場合、これを防ぐ処理を示します。

初手に対して正しく対応しないと負けてしまう場合があります。プレーヤーが先番の場合、初手が角の場合はCPU側は中央に、初手が中央の場合は角に着手しなければ負けてしまいます。それ以外のときもCPU側は中央に着手するのが無難です。

もしプレーヤー側が悪手を放った場合、勝ちにいけるようにします。

プレーヤー側が悪手を放った場合

負けない選択をする

まとめると以下のようにすると負けることはなくなりそうです。