1.2 石を返す処理

今回は、前回紹介した変数を用いて、石を返す処理の説明をします。

石を返す処理は、次のように行います。

  1. 上下左右および斜めの8方向の中から1つの方向を選ぶ。
  2. 石を置いたマスを出発点として、その方向に1マスずつ移動し、マスの状態を調べる。

    • 相手の石がある状態なら、次のマスに移動。
    • 自分の石がある状態なら、出発点と現在のマスの間の石を自分の石に変えて、処理を終了。
    • 空きマスか壁の場合には、なにもせずに処理を終了。

  3. 以上の処理を全ての方向について行う。
これを処理する関数は次のようになります。
以下に書かれているのは黒番で返す処理だけですが、少し変更するだけで、白番での処理もできるようになります。
/* 黒番で石を返す処理 flip_black(マスのインデックス)
返り値は返した石の数 */
int flip_black(int m)
{
    int n=0;
    
    n+=flip_line_black(m, -10);
    n+=flip_line_black(m,  -9);
    n+=flip_line_black(m,  -8);
    n+=flip_line_black(m,  -1);
    n+=flip_line_black(m,   1);
    n+=flip_line_black(m,   8);
    n+=flip_line_black(m,   9);
    n+=flip_line_black(m,  10);

    if(n>0)
        ban[n]=BLACK;

    return n;
}

/* 黒番で1方向の石を返す処理 flip_line_black(マスのインデックス, 返す方向)
返り値は返した石の数 */
int flip_line_black(int m, int dir)
{
    int i=0, n=m+dir;

    while(ban[n]==WHITE)
        n+=dir;

    if(ban[n]!=BLACK)
        return 0;

    n-=dir;
    while(n!=m){
        ban[n]=BLACK;
	n-=dir;
        i++;
    }

    return i;
}

上の関数では石を置くマスが空いているかどうかを調べていないので、関数を呼び出す前にあらかじめそれを調べておく必要があります。

石を返さずに、あるマスに石を置けるかどうか、または石を置いた場合に何石返せるかを知りたい場合があります。
このような処理は、石を返す処理を行う関数に少し変更を加えるだけで実現できます。


トップに戻る
1.1 盤面の表現
1.3 返した石を元に戻す処理