/////////////////////////////////////////////////////////////////////////////// // 神経衰弱 #include "el.h" #define MAIN_SCREEN 1 void MainScreen(void); DDOBJ bmpCard, bmpMark, bmpNumber; struct { // 場のカードデータ int mark; // マーク int no; // 数字 bool rev; // カードが裏だったらtrue } ba[4][13]; /////////////////////////////////////////////////////////////////////////////// // メイン関数 int elMain("神経衰弱"); { elWindow(640, 480, FALSE); elLoop() { elSetScreen(MAIN_SCREEN, MainScreen()); } elExitMain(); } /////////////////////////////////////////////////////////////////////////////// // ウインドウ生成関数 void elCreate(void) { elDraw::Screen(640,480); // ビットマップ読み込み bmpCard = elDraw::LoadObject("card.bmp"); bmpMark = elDraw::LoadObject("mark.bmp"); bmpNumber = elDraw::LoadObject("number.bmp"); // シャッフル int deal[4][13] = {0}; // 配り終えたカードチェック用 for (int y = 0; y < 4; y++) { for (int x = 0; x < 13; x++) { int mk, no; do {mk = rand() % 4; no = rand() % 13;} while (deal[mk][no]); ba[y][x].mark = mk; ba[y][x].no = no; ba[y][x].rev = true; deal[mk][no] = 1; } } elCallScreen(MAIN_SCREEN); } /////////////////////////////////////////////////////////////////////////////// // キーボード関数 void elKeyboard(void) { case VK_ESCAPE: { elDraw::Exit(); break; } elExitKeyboard(); } /////////////////////////////////////////////////////////////////////////////// // イベント関数 long elEvent(void) { elExitEvent(); } /////////////////////////////////////////////////////////////////////////////// // メイン画面 void MainScreen(void) { static int omote = 0; // 表になっているカードの枚数 static int ox, oy; // 表になっているカード static int nx, ny; // 現在めくったカード static int nokori = 52; // 残りカード枚数 static DWORD startTime; // 開始時間 static DWORD pastTime; // 経過時間 if (elChangeScreen()) startTime = timeGetTime(); elDraw::Clear(); // カードめくり処理 if (MouseCL && omote < 2) { nx = (MousePX - 60) / 40; ny = (MousePY - 96) / 64; if (nx >= 0 && nx <= 12 && ny >= 0 && ny <= 3 && ba[ny][nx].rev) { if (omote == 0) { ox = nx; oy = ny; ba[oy][ox].rev = false; omote = 1; } else { ba[ny][nx].rev = false; if (ba[ny][nx].no == ba[oy][ox].no) { nokori -= 2; omote = 0; } else omote = 2; } } } else if (MouseCR && omote == 2) { ba[oy][ox].rev = true; ba[ny][nx].rev = true; omote = 0; } // 場のカード表示 for (int y = 0; y < 4; y++) { for (int x = 0; x < 13; x++) { int x2 = x * 40 + 60; int y2 = y * 64 + 96; int xc = ba[y][x].rev ? 40 : 0; elDraw::Layer(x2, y2, bmpCard, xc, 0, xc + 40, 64); if (!ba[y][x].rev) { elDraw::Layer(x2 + 6, y2 + 5, bmpMark, ba[y][x].mark * 28, 0, ba[y][x].mark * 28 + 28, 28); elDraw::Layer(x2 + 6, y2 + 33, bmpNumber, ba[y][x].no * 28, 0, ba[y][x].no * 28 + 28, 26); } } } SHOW(8, 8, "めくる:左クリック 閉じる:右クリック"); pastTime = (timeGetTime() - startTime) / 1000; SHOW2(8, 32, "経過時間:%d 秒", pastTime); ShowCursor(TRUE); elDraw::Refresh(); // ゲームクリア処理 if (nokori <= 0) { MESG("クリア! 所要時間は %d 秒です。", pastTime); elDraw::Exit(); } }