ST[8][8] を利用した思考関数

ST[8][8] を利用した思考関数の作成について解説します。
ST[8][8] を使うとメインの盤の右下に小さなオセロ盤が表示され、局面を進めた状況を確認することができます。

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

ST[8][8] を利用した思考関数

  1. 検索された手の中から、最も多くの駒を裏返す手を打つプログラムです。
        // pt に石を置いて駒をカウントする
        static  short count(OseroApp *App, BYTE pt)
        {   short   ban;
    
            ban= App->Teban();
            App->CopyST();
            App->Reverse(pt,ban,App->ST);
            App->SDisp("多く返す");
            return(App->Count(ban,App->ST));
        }
    
        // 初期化
        EXPORT char *B_init()
        {   time_t  nowtime;
            time(&nowtime);
            srand(nowtime);
            return ("Black 多く裏返す");
        }
    
        // Play の手を考える
        // 上4 Bit:Y座標、下4 Bit:X座標
        EXPORT BYTE B_think(OseroApp *App)
        {   short   i,n,cnt,wcnt;
            BYTE    mx;
    
            n= App->Search(App->Teban());   //手番で打てる場所を検索
            if (n==0)   return(0xFF);       //パスのとき
            mx= App->S[0];
            cnt= 0;                         //初期値を最小に設定
            for(i=0; i<n; i++)
            {   wcnt= count(App,App->S[i]);
                if (cnt<wcnt || (cnt==wcnt && (rand()&1)))
                {   cnt= wcnt;
                    mx= App->S[i];
                }
            }
            return(mx);
        }
        
  2. pt が自分の駒を置く座標です。
    CopyST() で ST[][] にオセロ盤をコピーしてきます。
    Reverse() で駒を裏返します。
    pos がエラーのときに、白黒の手番と pos(0~7) が MessageBox に表示されます。
    メッセージは通常 ST[][] に対して挟んだ駒を裏返すときのメッセージで、画面に表示されている 大きな盤(T[][]) では無いので注意して下さい。
    SDisp() でサブウインドウに表示して状態を確認します。
        // pt に石を置いて駒をカウントする
        static  short count(OseroApp *App, BYTE pt)
        {   short   ban;
    
            ban= App->Teban();
            App->CopyST();
            App->Reverse(pt,ban,App->ST);
            App->SDisp("多く返す");
            return(App->Count(ban,App->ST));
        }
        
  3. count() を使って最も多くの駒を裏返す手を選ぶ処理です。
    mx に最初に検索された手を、cnt に最も小さい値を設定しています。
    count() で App->S[i] にプレイした状態を再現して駒をカウントします。
    駒の数が同じときは乱数により選んでいます。
        EXPORT BYTE B_think(OseroApp *App)
        {   short   i,n,cnt,wcnt;
            BYTE    mx;
    
            n= App->Search(App->Teban());   //手番で打てる場所を検索
            if (n==0)   return(0xFF);       //パスのとき
            mx= App->S[0];
            cnt= 0;                         //初期値を最小に設定
            for(i=0; i<n; i++)
            {   wcnt= count(App,App->S[i]);
                if (cnt<wcnt || (cnt==wcnt && (rand()&1)))
                {   cnt= wcnt;
                    mx= App->S[i];
                }
            }
            return(mx);
        }
        

【演習】

  1. Osero Object Class のメソッドの基本的な使い方を理解して下さい。
  2. 裏返す駒が最も少ない手を選ぶときは、どこを修正すれば良いでしょう。
  3. 次に相手の打つ手を最小に制限する手を選ぶプログラムを作成して下さい。
    相手の打つ手を制限すると、ゲームが有利に展開するときがあります。

[Next Chapter ↓] MinMax 法による思考
[Previous Chapter ↑] Osero Object Class のメンバー関数

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