1.1 盤面の表現

この章では、オセロプログラムに必要な関数について解説します。
各関数をCで記述していきます。

はじめにことわっておきますが、ここで紹介するのはあくまで一例です。
別のよい方法や、改造の余地もあると思うので、実際にオセロプログラムを作る場合には、自分が一番便利だと思う方法を使ってください。

まず盤面をどのようにして表現したらよいかを考えます。
これは各マスの状態をあらわす変数を配列にすればよく、ここでは次の配列を用います。

#define BLANK 0
#define BLACK 1
#define WHITE 2
#define WALL  3

char ban[91];
のようになります。
マスの数が64なのに配列が91個の要素をもつのは、配列が壁となるマスを含むためです。
壁を含むことによって、石を返す処理をするとき等に、ある座標が盤から出ているかどうかの処理が簡単になります。
これは森田オセロで使われていた方法です。

A1を(1, 1)とするとき、座標(x, y)にあるマスの状態はban[x+y*9]によってあらわされます。
xとyが1≦x<9、1≦y<9の範囲にないマスはすべて壁となります。

マスのインデックスに名前をつけて定数としておくと便利です。
これは次のように記述できます。

#define A1 10
#define B1 11
#define C1 13
・
・
・
#define H8 80

また以下の値をあらわす変数が必要になることがあります。

  • 手番
  • 黒、白の石数(または石差)
  • 現在何手目か

変数ban[]を使って盤面を初期化する関数を作ると次のようになります。

ban_init()
{
    int i, j;

    for(i=0;i<91;i++)
        ban[i]=WALL;

    for(i=1;i<9;i++)
        for(j=1;j<9;j++)
            ban[i*9+j]=BLANK;

    ban[D4]=WHITE;
    ban[D5]=BLACK;
    ban[E4]=BLACK;
    ban[D5]=WHITE;
}

トップに戻る
1.2