シャッフルして表示


48枚のカードをシャッフルして、画面に整列して表示します。

C#でも カードをシャッフル を作成しています。

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

Object Class の説明

  1. Card.h にカードをシャッフルするメソッド(メンバ関数)を追加します。
    t[] がカードの順番を格納する配列で、n がカードの枚数です。
        void        Shuffle(int t[], int n);
        
  2. Card.cpp の修正です。
    #include で time.h を取り込んで下さい。
    Constructor で time() を取得して、乱数を初期化します。
        #include    <time.h>
    
        // コンストラクタ(オブジェクトの初期化)
        CARD::CARD(HWND hwnd) : BSprite(hwnd)
        {   time_t  nowtime;
            time(&nowtime);
            srand(nowtime);
        }
        
  3. カードをシャッフルするメンバ関数を追加します。
    シャッフルする関数は各自に任せます。
        // カードをシャッフルする
        void  CARD::Shuffle(int t[], int n)
        {
                :
        }
        

メインプログラムの説明

  1. Main.cpp の説明です。
    t[48] が48枚のカードをシャッフルする領域です。
        #include    "Card.h"
    
        CARD        *Card= NULL;
        char        File[MAX_PATH]= "花札.bmp";
        int         t[48];
        
  2. WM_CREATE: で画像を入力して、Shuffle() で乱数を使ってカードをシャッフルします。
        switch(msg)
        {   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);
                break;
        
  3. WM_PAINT: では Card->Show(); でカードを並べて描画します。
    プログラムを起動する毎にカードの並び順が異なっていることを確かめて下さい。
            case WM_PAINT:
                hdc= BeginPaint(hWnd,&ps);
                for(i=0; i<48; i++)
                    Card->Show(t[i],(i%10)*56+20,(i/10)*80+20);
                EndPaint(hWnd, &ps);
                break;
        
  4. WM_CLOSE: で CARD Object を開放して下さい。
            case WM_CLOSE:
                SAFE_DELETE(Card);
                DestroyWindow(hWnd);
                break;
        

【演習】

  1. Shuffle() 関数を作成して、プログラムを完成させて下さい。
  2. 起動するごとにカードの並びが違うことを確認して下さい。
  3. GetOpenFileName() で BMP ファイルを選択して入力する関数を追加して下さい。
    1. Card.h に Open() 関数の定義を追加します。
              HRESULT     Open(LPSTR szDir);
              
    2. Card.cpp に BMP ファイルを選択して入力する関数を追加します。
              // OPENFILENAME 構造体で BMP ファイルを Load する
              HRESULT  CARD::Open(LPSTR szDir)
              {   OPENFILENAME    ofn;
      
                  memset(&ofn,0,sizeof(OPENFILENAME));
                  ofn.lStructSize= sizeof(OPENFILENAME);
                  ofn.hwndOwner= hWnd;
                  ofn.lpstrFilter= "bmp(*.bmp)\0*.bmp\0All files(*.*)\0*.*\0\0";
                  ofn.lpstrFile= szFile;
                  ofn.lpstrFileTitle= NULL;
                  ofn.nMaxFile= MAX_PATH;
                  ofn.Flags= OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
                  ofn.lpstrDefExt= "bmp";
                  ofn.lpstrTitle= "ファイルオープン!";
                  ofn.lpstrInitialDir= szDir;
                  if (GetOpenFileName(&ofn)!=TRUE)
                  {   MessageBox(hWnd,"Open キャンセル","Bmp Open",MB_OK);
                      return -1;
                  }
                  else    return Load(szFile,1,1);
              }
              
    3. Main.cpp の WM_CREATE: を次のように変更して下さい。
      ダイアログボックスから画像を選択できるようになります。
              switch(msg)
              {   case WM_CREATE:
                      Card= new CARD(hWnd);
                      if (Card->Open("\0")==FALSE)
                      {   PostMessage(hWnd,WM_CLOSE,0,0);
                          break;
                      }
                      Card->SetNum(10,5);
                      Card->Shuffle(t,48);
                      break;
              

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