カードをクリックして表返します

48枚のカードをシャッフルして裏向けに並べて、クリックされたカードを表返します。

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

プログラムの説明

  1. CARD Object Class は、前回と同じです。
  2. Main() プログラムです。
    t[48] が48枚のカードをシャッフルする領域です。
    dsp[48] が画面に表示するカードイメージの番号です。
        int         t[48], dsp[48];
        
  3. WM_CREATE: で画像を入力して、Shuffle() 関数でカードをシャッフルします。
    dsp[] に 48 番のイメージ(裏面)を格納します。
            case WM_CREATE:
                Card= new CARD(hWnd);
                if (Card->Load(File,10,5)==FALSE)
                {   PostMessage(hWnd,WM_CLOSE,0,0);
                    break;
                }
                Card->Shuffle(t,48);
                for(i=0; i<48; i++) dsp[i]= 48;
                break;
        
  4. WM_PAINT: では Card->Show(); で dsp[] に格納されているカードイメージを表示します。
    最初は全てのカードを裏向けて表示します。
            case WM_PAINT:
                hdc= BeginPaint(hWnd,&ps);
                for(i=0; i<48; i++)
                    Card->Show(dsp[i],(i%10)*56+20,(i/10)*80+20);
                EndPaint(hWnd, &ps);
                break;
        
  5. WM_LBUTTONDOWN: でマウスの左クリックを検出してカードを表返します。
    setno() がクリックされた位置からカードを特定する関数です。
        POINT       pt;
             :
            case WM_LBUTTONDOWN:
                pt.x= LOWORD(lParam);
                pt.y= HIWORD(lParam);
                i= setno(pt.x,pt.y);
                if (i<48)   dsp[i]= t[i];
                InvalidateRect(hWnd,NULL,FALSE);
                break;
        
  6. WM_CLOSE: で CARD Object を開放して下さい。
            case WM_CLOSE:
                SAFE_DELETE(Card);
                DestroyWindow(hWnd);
                break;
        
  7. クリックされた座標をカード番号に変換する関数です。
    カード一枚分のサイズは「幅56ピクセル,高さ80ピクセル」です。
        int  setno(int x, int y)
        {   int     xn,yn;
            xn= (x-20)/56;
            yn= (y-20)/80;
            return (yn*10+xn);
        }
        

【演習】

  1. プログラムを完成させて下さい。

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