今回はオセロをつくります。コンピュータとの対戦型にしていますが、着手を決めるこれといったアルゴリズムはないのでメチャクチャ弱いです。

追記:コンピュータのアルゴリズムを改良して作り直しました。こちらのページがおすすめです。

オセロをつくる コンピューターをもっと強くする

オセロをつくる 先読みさせてコンピューターをもっと強くする

以下は古いコンテンツです。

使用するのは毎度おなじみのPictureBoxです。オセロの各マスは白か黒、なにも置かれていない状態のいずれかです。

デザイナで[スタート」メニューとステータスバーを作成しました。ステータスバーには手番がどちらにあるかを表示させます。

まずPictureBoxを継承してStoneというクラスを作成します。Stoneクラスは盤面のどの位置にあるのかを管理するRowプロパティとColumプロパティをもちます。

それからStoneColorプロパティで色を変えたり色を取得できるようにしています。

またクリックされたらこれをForm1クラスに伝えることができるようにStoneClickイベントを作成しています。

とりあえずこれで実行してみましょう。ちょっと見た目がチープです。

そこで石はPNGファイルをつかって表し、StoneクラスのStoneColorプロパティも少し変更しました。

これでややオセロらしくなりました。

オセロのルールは

相手の石を挟むと裏返して自分の石にできる
石を置ける場所は相手の石を挟むことができる場所でなければならない。
石を置ける場所がない場合はパスをする。ただし石を置ける場所がある場合はパスはできない。
盤面が全部埋まるか、双方がパスをした場合はゲーム終了
ゲームが終了したとき、自分の石の数が多いほうが勝ち

です。

そこでまず着手しようとしたときは本当に着手が許される場所なのかチェックする必要があります。

CreatePictureBoxesメソッドのなかでピクチャーボックスを作成してクリックされた場合はイベントハンドラBox_PictureBoxExClickがよばれます。引数は8×8の盤面のなかにおけるピクチャーボックスの位置です。

手番でないのに着手することはできません。そこでフィールド変数 bool isYour を用意しました。

クリックされた場所は着手可能な場所か調べる必要があります。上下左右、斜め、全部で8方向考える必要があります。そこで以下のようなメソッドを作成しました。

隣の石がない場合、自分の石の場合は挟むことはできません。相手の石の場合、その延長上に自分の石があれば挟むことができていることになります。延長上に自分の石がみつかる前に盤面の外に出てしまったり、石が置かれていないマスが見つかった場合は挟めていないということになります。

挟むことができているStoneオブジェクトをリストに格納して取得できるようにしています。

これで GetRevarseStonesが返した要素の数が0でなければ着手できるということになります。クリックした場所が着手可能な位置であれば石を置き、挟んだ石をひっくり返します。

自分の着手が終わったら次はコンピュータの手番になりますが、長くなったので次回にします。

C#でオセロをつくる コンピューターの次の一手