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

三目並べとは3×3 の格子を用意し、二人が交互に「○」と「×」を書き込んでいき3つ並べるゲームである。まるばつ、まるぺけとも呼ばれる。

まずデザイナで以下のようなものをつくります。

Cellクラスの定義

次にセルを描画するためのCellクラスを定義します。

ここでは四角いマスをどの位置に描画するのか、そこに描画されるのは○なのか×なのか、マス以外なにも描画されないのかというデータの保持、実際の描画の処理などをおこないます。

CellStatus列挙体はセルに描画されるものが○か×か何も無いかを指定するためのものです。

Cellクラスのコンストラクタを示します。

引数はそのセルが上から何行目か、左から何列目か、輪郭部分と○×を描画する矩形です。

プレーヤーの手番のときにクリックされたらそのセルに○または×をセットしたいので、クリックされた座標がセルの内部かどうかを返すメソッドを定義します。

○または×を描画する処理を示します。

Bottomプロパティは、セルの輪郭の下部分のY座標を取得するためのものです。

Form1クラスの定義

次にForm1クラスを定義します。コンストラクタと定数は以下のとおりです。

セルの初期化

セルを初期化する処理を示します。

描画に関する処理

描画に関する処理を示します。セルを描画する処理とゲームの結果を表示する処理をおこなっているだけです。

セルを描画する処理を示します。

セルの輪郭部分を描画したあと○か×が設定されている場合はそれも描画しています。

ゲームの結果を描画する処理を示します。

クリック時の処理

自分の手番のときになにも書かれていないセルをクリックしたら○または×を描画します。

クリック時の処理を示します。クリックされたとき自分の手番で無かった場合やゲームが終了している場合はなにもしません。

プレーヤーがクリックした座標は、着手可能なセルなのかどうかをチェックする処理を示します。クリックされた座標をCell.IsInside(point)メソッドに渡すと最大でひとつだけtrueを返すセルがあるはずです。着手可能なセルとはいうまでもなく○も×も書かれていないセルのことです。着手がおこなわれた場合はtrue、そうでない場合はfalseを返します。trueを返した場合はCPUの着手をする処理に移ります。

勝敗判定

プレーヤーが勝利したかをチェックする処理を示します。

○または×がセットされているセルを集めます。それらのなかに縦横ななめのどれかで3つ並んでいるものがあるか調べます。同じ行、同じ列のものを探して3つみつかればそろっていることになります。ななめの場合は真ん中と対角の関係にある2つの角がそろっているかを調べています。

CPUの着手

CPUに着手させる処理を示します。ここでは着手されていないセルを集めて乱数で着手する場所を決めています。だからメチャクチャ弱いです。この部分は次回改善します。

CPUが着手したらプレーヤーの敗北が確定しているかもしれないのでチェックします。

終局した場合は結果を表示するために更新処理が必要なのでその処理をおこないます。

再挑戦のための処理

[再挑戦]のボタンがクリックされたら新しいゲームを開始します。

プレーヤーの先手後手を設定するチェックボックスの状態が変更されたときの処理を示します。プレーヤーを先番であればisPlayerFirstフラグをtrueに、そうでない場合はfalseに設定します。