クリックされた場所に駒を置く

マウスでクリックされた場所に黒と白の駒を置きます。

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

プロジェクトの設定

  1. 新規プロジェクト Osero を作成して下さい。
    Ypos と Xpos にはマウスがクリックされた座標から盤の位置を計算して記録します。
        #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);
                T[Ypos][Xpos]= 1;
                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 に格納します。
    Xpos と Ypos がオセロ盤の外を参照しないように「0~7」に治まるようにしています。
    配列の添え字が範囲外を参照するとトラブルの元になるので、できるだけ配慮をしたいものです。
    「・・・」を埋めてプログラムを完成させて下さい。
        void  SetPos(POINT pt)
        {   Xpos= ...;
            Ypos= ...;
            Xpos= Xpos & ...;
            Ypos= Ypos & ...;
        }
        
  8. オセロ盤と駒を描画する関数です。
        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)
                {    :
                     :
                }
            }
        }
        
  9. 一個の駒を描画する関数です。
        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);
        }
        
  10. [デバッグ][デバッグなしで開始]を選択してビルドに続いて実行を行います。
    マウスの右(左)クリックで駒を置きます。
    オセロ盤の外をクリックするとどうなるか確かめて下さい。

【演習】

クリックした場所に駒を置くことができるかを調べる関数を作成して下さい。
駒を置くことができるのは「相手の駒を挟んで裏返すこと」ができる時です。
置くことが出来ないときは Message Box でエラーメッセージを表示して下さい。

[Next Chapter ↓] 挟んだ駒を裏返す
[Previous Chapter ↑] オセロゲームの盤と駒を表示

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