Osero Object Class のメンバー関数

Osero Object Class で提供されるメンバー関数(メソッド)に付いて説明します。
オセロの思考関数を作成するには、ある座標に駒を置けるかを調べたり、全ての打てる手をリストしたり、 仮に駒を置いた局面を設定したり、数手先の局面を確認するなど様々な関数が必要になります。
これらの関数を最初から作成するのは非常に大変な作業になります。
そこで思考関数を作成するために必要なメンバー関数を Osero Object Class として組み込んで提供しています。
ここでは思考関数に関係する Osero Object Class の領域とメンバー関数に付いて説明します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

Object Class の領域

思考関数に関係する Osero Object Class の領域です。
  1. オセロ盤の定義と盤上の駒の表現です。
    この領域は protected:(非公開) です。
    参照するときは CopyST() メンバー関数で ST[8][8] にコピーして下さい。
        char    T[8][8];                //OSEROの盤を定義
        ・空白:  0
        ・黒:    1
        ・白:  -1
        
  2. 手番を格納する領域です。
    この領域は protected:(非公開) です。
    参照するときは Teban() メンバー関数で取得して下さい。
        short   TEBAN;                  //手番(1:黒  -1:白)
        
  3. 全ての打てる場所を検索して格納する領域です。
    Search() メンバー関数を実行すると、全ての手を検索して S[] に格納してくれます。
         BYTE    S[30];                 //盤面の打てる箇所を格納
        ・上4 Bit: Y座標(0~7)
        ・下4 Bit: X座標(0~7)
        
  4. T[8][8] と同じオセロ盤ですが、こちらは自由に参照/設定することができます。
    T[8][8] を ST[8][8] にコピーするときは CopyST() メソッドを使って下さい。
    SDisp() メンバー関数で ST[8][8] の状態をオセロ盤の右下に小さく表示して思考の様子を確認することができます。
        char    ST[8][8];               //自由に使用できるOSERO盤
        
  5. 残り手数が記録されている領域です。
    最初は60に設定され、駒を置くごとにカウントダウンして行きます。
        short   Countdown;              //残り手数
        

Object Class のメンバー関数

思考関数に関係する Osero Object Class のメンバー関数(メソッド)の説明です。
  1. 手番を調べるメンバー関数です。
    手番(1:黒 -1:白)がリターンされます。
        short   Teban()  { return TEBAN; }
        
  2. 盤上の駒を調べるメンバー関数です。
    c と一致したときは TRUE が、一致しないときは FALSE がリターンされます。
        BOOL    Test(short x, short y, short c, char t[8][8]);
        BOOL    Test(BYTE pos, short c, char t[8][8]);
        
  3. 全ての打てる場所を調べるメンバー関数です。
    c には、黒(1)または白(-1)を指定します。
    s[] には検索結果を格納する配列を指定します。
    t[8][8] には T[8][8] や ST[8][8] などのオセロ盤を指定します。
    打てる場所の個数がリターンされます。
        short   Search(short, BYTE[], char[8][8]);
        short   Search(short c, BYTE s[])  { return(Search(c, s, T)); }
        short   Search(short c)            { return(Search(c, S, T)); }
        
  4. T[8][8] を ST[8][8] にコピーするメンバー関数です。
        void    CopyST() {  MoveMemory(ST,T,64); }
        
  5. 駒を置いて、挟んだ駒を裏返すメンバー関数です。
    エラーの時は-1がリターンされます。
    BYTE pos を引数にするメソッドでは pos(0~7) がエラーのときに、小さい盤(ST[][]) と白黒の手番と 駒を置こうとした座標(pos) が MessageBox に表示されます。
    メッセージは通常 ST[][] に対して挟んだ駒を裏返すときのメッセージで、画面に表示されている 大きな盤(T[][]) では無いので注意して下さい。
        if (c==1)   wsprintf(msg,"Reverse Error (●=%X)",pos);
        else        wsprintf(msg,"Reverse Error (○=%X)",pos);
        MessageBox(NULL,msg,"OSERO Error",MB_OK);
        
        short   Reverse(WORD, WORD, short, char [8][8]);
        short   Reverse(BYTE pos, short c, char t[8][8]);
        
  6. 盤に駒が置けるか否かを調べます。
    ゼロがリターンされると置く事はできません。
        short   Check(WORD x, WORD y, short c, char t[8][8]);
        short   Check(short pos[2], short c, char t[8][8]) { return(Check(pos[1],pos[0],c,t)); }
        short   Check(BYTE pos, short c, char t[8][8]) { return(Check(pos&7,(pos>>4)&7,c,t)); }
        
  7. ST[8][8] をサブウインドウに表示して思考の様子を確認するメンバー関数です。
    SDisp() を実行する度に MessageBox で応答確認が要求されます。
    msg には DialogBox に表示する簡単な Message を指定して下さい。
    応答するのが面倒なときは、右ボタンをクリックするとメッセージが抑制されます。
    デバッグが終わればコメントにして下さい。
    void SDisp(LPSTR msg);
  8. 盤上の駒をカウントするメンバー関数です。
    c にカウントする駒(1, -1, 0)を渡すと個数がリターンされます。
    short Count(short, char[8][8]);
  9. 辺を一列(8個の並び)取り出すメンバー関数です。
    t[8][8] から辺を一列取り出して str[8] に格納します。
    no には「0~7」の範囲で、取り出す辺と格納する方向を指示します。
    左上から時計回りに0~3(及び 4~7)で取り出す起点(コーナ)を指示します。
    コーナを起点にして、0~3の時は時計方向に、4~7は反時計方向に列を取り出します。
    void Getstr(int no, char str[8], char t[8][8]);

座標テーブル

オセロ盤の座標を定義したテーブルです。
Osero Object Class には含まれませんが、思考関数の作成に便利なので外部領域として公開します。
  1. 座標テーブルの外部宣言です。
        extern  BYTE    T00[4];     //0-0 座標テーブル(左上,右上,右下,左下)
        extern  BYTE    T11[4];     //1-1 座標テーブル(左上,右上,右下,左下)
        extern  short   TD[8][2];   //上辺→,右辺↓,下辺←,左辺↑, 左辺↓,上辺←,右辺↑, 下辺→
        
  2. 4個のコーナ座標を定義する T00 のテーブルです。
    左上から時計回りに、上4ビットでY座標を、下4ビットでX座標を定義しています。
        BYTE    T00[4]=     //0-0 座標テーブル(左上,右上,右下,左下)
        {  0x00,  0x07,  0x77,  0x70  };
        
  3. 2-2の座標を定義する T11 のテーブルです。
    T00 に対応する 2-2 の座標を定義しています。
        BYTE    T11[4]=     //1-1 座標テーブル(左上,右上,右下,左下)
        {  0x11,  0x16,  0x66,  0x61  };
        
  4. 8個の辺を取り出すときに使う、Y座標とX座標の増減テーブルです。
    このテーブルは思考関数の作成には直接関係しないかも知れません。
    左上のコーナから時計回りに4個の列を取り出します。
    次に同じ順に、コーナを開始点にして逆方向に列を取り出します。
        short   TD[8][2]=   //上辺→,右辺↓,下辺←,左辺↑, 左辺↓,上辺←,右辺↑, 下辺→
        { { 0,1 }, { 1,0 }, { 0,-1 }, { -1,0 }, { 1,0 }, { 0,-1 }, { -1,0 }, { 0,1 } };
        

[Next Chapter ↓] ST[8][8] を利用した思考関数
[Previous Chapter ↑] 思考関数の作成方法

超初心者のプログラム入門(Win32API C++)