JavaScriptで三目並べをつくります。

HTML部分

style.css

JavaScript部分

定数は以下のとおりです。

Cellクラスを定義します。

ボタンや文字列を表示するために各要素を取得します。

グローバル変数を示します。

ページが読み込まれたときの処理

ページが読み込まれたときの処理を示します。

最初はプレーヤー側先手の設定にしたいのでチェックボックスがチェックされた状態にします。セルを描画するためのDOM要素を取得して配列に格納するとともにこれと対応するCellオブジェクトも生成します。同時に縦横斜めに一列そろっているCellオブジェクトが格納された配列の配列や、Cellオブジェクトの角の部分が格納された配列にも適切な値をセットします。

縦横斜めに一列そろっているCellオブジェクトの配列の配列を取得する処理を示します。

Cellオブジェクトの角の部分が格納された配列を取得する処理を示します。

セルを初期化する処理を示します。セルに○も×も表示されていない状態にするとともに、すべてのCellオブジェクトのStatusプロパティをCELL_STATUS_NONEにセットします。

勝敗判定

着手によってプレーヤー側またはCPU側が勝利したことを調べる処理を示します。

checkLines関数は縦横ななめのいずれかで3つ並んでいるかどうかを調べるためのものです。

対局が終了したらスタートボタンと先手後手設定用のチェックボックスを表示させます。

AIに次の一手を考えさせる

AIに次の一手を考えさせる処理を示します。

リーチがかかっているときは勝負を決め、プレーヤー側にリーチがかかっている場合はこれを阻止します。これに該当しない場合は次に複数のリーチをする手段が存在する場合はこれを実行し、プレーヤー側が可能なときはこれを阻止します。CPU後攻でプレーヤー側の初手が角の場合は中央へ、中央のときは角に着手しないと負けてしまうので、そのように着手します。

これらに該当しない場合は適当に空いている場所に着手します。

getEmptyCells関数は空白のセルを探します。

sleep関数はプレーヤー側着手後、すぐにCPU側が着手すると違和感があるので少し処理を止めるためのものです。

checkReach関数は現在リーチがかかっているか調べ、CPU側がリーチの場合はそのまま着手し、プレーヤー側がリーチの場合はこれを阻止するためのものです。

getReach関数はここに着手すれば勝利できるセルがあれば、これを配列にして返します。

setDoubleReach関数はここに着手すれば複数のリーチがかかる場合があるか調べ、そのような手が存在する場合は着手します。

blockDoubleReach関数はプレーヤー側が着手すれば複数のリーチがかかる場合があるか調べ、そのような手が存在する場合はこれを阻止します。

プレーヤー側がミスをした場合、CPUが勝ちにいく処理を示します。

ゲーム開始のための処理

ゲームを開始するための処理を示します。