挟んだ駒を裏返す



クリックした場所に駒を置いて、挟んだ駒を裏返します。

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

プロジェクトの設定

  1. 新規プロジェクト Osero を作成して下さい。
        #define WSIZE 50                //枠のサイズ
        #define KSIZE (WSIZE*8/20)      //駒の直径
    
        char    T[8][8];                //OSEROの盤を定義
        RECT    rcBox= { 20, 20, WSIZE*8+20, WSIZE*8+20  }; //盤のサイズ
        HPEN    bPen,wPen,grPen;        //黒、白、灰色のペン
        HBRUSH  bBrush,wBrush,gBrush;   //黒、白、緑のブラシ
        UINT    Ypos,Xpos;              //OSERO盤の座標
        
  2. WndProc() に WM_CREATE: を追加してアプリケーションを初期化します。
        switch( message ) 
        {
            case WM_CREATE:
                AppInit();
                break;
        
  3. WM_LBUTTONDOWN: と WM_RBUTTONDOWN: で盤上に駒を置いて、挟んだ駒を裏返します。
    左クリックで黒、右クリックで白です。
    エラーの時はメッセージボックスを表示します。
            case WM_LBUTTONDOWN:
                pt.x= LOWORD(lParam);
                pt.y= HIWORD(lParam);
                SetPos(pt);
                //駒を置いて、挟んだ駒を裏返す
                if (Reverse(Xpos,Ypos,1)==FALSE)
                {   MessageBox(hWnd,"そこに黒の駒を置くことはできません","Error",MB_OK);
                    break;
                }
                InvalidateRect(hWnd,NULL,TRUE);
                break;
            case WM_RBUTTONDOWN:
                    :
                break;
        
  4. WM_PAINT で盤と駒を表示します。
        case WM_PAINT:
            hdc = BeginPaint (hWnd, &ps);
            // TODO: この位置に描画用のコードを追加してください...
            Disp(hdc);
            EndPaint( hWnd, &ps );
            break;
        
  5. WM_DESTROY: で生成したペンとブラシを開放して下さい。
        case WM_DESTROY:
            DeleteObject(grPen);
            DeleteObject(gBrush);
            PostQuitMessage( 0 );
            break;
        
  6. アプリケーションを初期化する関数です。
        void  AppInit()
        {
                :
            T[4][3]=T[3][4]= 1;
            T[3][3]=T[4][4]= -1;
        }
        
  7. クリックした位置(pt)を盤の座標に変換して Xpos Ypos に格納します。
        void  SetPos(POINT pt)
        {   Xpos= ...;
            Ypos= ...;
            Xpos= Xpos & ...;
            Ypos= Ypos & ...;
        }
        
  8. T[y][x] に駒を置いて、挟んだ駒を裏返します。
    駒を挟むことが出来ないときは FALSE をリターンします。
    「挟んだ駒を裏返す処理」を埋めて、関数を完成させて下さい。
        int  Reverse(UINT x, UINT y, int c)
        {   int     k,l,sw;
            UINT    i,j;
            if (c==0)   return(TRUE);   //パスのとき
            if (y>7 || x>7 || T[y][x])  return(FALSE);
            sw= 1;                      //挟んだ駒があったかを調べるフラグ
                :
            //挟んだ駒を裏返す処理
                :
            if (sw)     return(FALSE);
            T[y][x]= c;
            return(TRUE);
        }
        
  9. オセロ盤と駒を描画する関数です。
        void  Disp(HDC hdc)
        {   int     i,j,y,x;
            //ペンとブラシの設定
            SelectObject(hdc,bPen);
            SelectObject(hdc,gBrush);
            //オセロ盤の色と外枠の線
                  :
            //罫線の表示
                  :
            SelectObject(hdc,grPen);
            //駒を表示
            for(i=0,y=rcBox.top+WSIZE/2; i<8; i++,y+=WSIZE )
            {   for(j=0,x=rcBox.left+WSIZE/2; j<8; j++,x+=WSIZE)
                {    :
                     :
                }
            }
        }
        
  10. 一個の駒を描画する関数です。
        void  Koma(HDC hdc, int x, int y, HBRUSH hb1, HBRUSH hb2)
        {
            SelectObject(hdc,hb2);
            Ellipse(hdc,x-KSIZE,y-KSIZE-3,x+KSIZE,y+KSIZE-3);
        }
        
  11. [デバッグ][デバッグなしで開始]を選択してビルドに続いて実行を行います。
    マウスの右(左)クリックで駒を置いて、挟んだ駒を裏返します。

【演習】

  1. 「挟んだ駒を裏返す」関数を完成させて下さい。
  2. 挟んだ駒が裏返せるようになれば、マウスのクリックでプレイが出来るようになります。
    人間同士がマウスのクリックで対戦できるプログラムを作成して下さい。

[Next Chapter ↓] Osero Object Class
[Previous Chapter ↑] クリックされた場所に駒を置く

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