/////////////////////////////////////////////////////////////////////////////// // 15パズル #include "el.h" #define MAIN_SCREEN 1 void MainScreen(void); DDOBJ pic; // パネル int panel[16]; // パネルの種類(0〜14:各パネル 15:空き) // i番目とj番目のパネルを入れ替える関数 void Swap(int i, int j) { int tmp = panel[i]; panel[i] = panel[j]; panel[j] = tmp; } /////////////////////////////////////////////////////////////////////////////// // メイン関数 int elMain("15パズル"); { elWindow(320, 320, FALSE); elLoop() { elSetScreen(MAIN_SCREEN, MainScreen()); } elExitMain(); } /////////////////////////////////////////////////////////////////////////////// // ウインドウ生成関数 void elCreate(void) { elDraw::Screen(320, 320); // 画像読み込み pic = elDraw::LoadObject("pic.bmp"); // パネルのシャッフル int i, pn; for (i = 0; i < 16; i++) panel[i] = i; for (i = 0; i < 1000; i++) { for (int j = 0; j < 16; j++) if (panel[j] == 15) pn = j; int x = pn % 4; int y = pn / 4; int dir = rand() % 4; switch (dir) { case 0: if (x > 0) Swap(pn - 1, pn); break; // 左と入れ替え case 1: if (x < 3) Swap(pn, pn + 1); break; // 右と入れ替え case 2: if (y > 0) Swap(pn - 4, pn); break; // 上と入れ替え case 3: if (y < 3) Swap(pn, pn + 4); break; // 下と入れ替え } } elCallScreen(MAIN_SCREEN); } /////////////////////////////////////////////////////////////////////////////// // キーボード関数 void elKeyboard(void) { case VK_ESCAPE: { elDraw::Exit(); break; } elExitKeyboard(); } /////////////////////////////////////////////////////////////////////////////// // イベント関数 long elEvent(void) { elExitEvent(); } /////////////////////////////////////////////////////////////////////////////// // メイン画面 void MainScreen(void) { static int status = 0; // 状態 (0:開始前 1:ゲーム中 2:ゲーム終了) int i, x, y; elDraw::Clear(); // マウスがクリックされたときの処理 if (MouseCL) { if (status == 0) status = 1; // 開始前ならゲーム開始 else if (status == 1) { // ゲーム中なら // パネル移動 x = MousePX / 80; y = MousePY / 80; int pn = y * 4 + x; if (x > 0 && panel[pn - 1] == 15) Swap(pn - 1, pn); // 左と入れ替え if (x < 3 && panel[pn + 1] == 15) Swap(pn, pn + 1); // 右と入れ替え if (y > 0 && panel[pn - 4] == 15) Swap(pn - 4, pn); // 上と入れ替え if (y < 3 && panel[pn + 4] == 15) Swap(pn, pn + 4); // 下と入れ替え // パネルが全部揃ったか判定 for (i = 0; i < 16; i++) if (panel[i] != i) break; if (i == 16) { MESG("クリア!"); status = 2; } } } // パネルの表示 if (status == 1) { for (i = 0; i < 16; i++) { x = (panel[i] % 4) * 80; y = (panel[i] / 4) * 80; if (panel[i] < 15) elDraw::Layer((i % 4) * 80, (i / 4) * 80, pic, x, y, x + 80, y + 80); } } else { elDraw::Layer(0, 0, pic, 0, 0, 320, 320); // スタート・エンド時には全て表示 } // 文字の表示 if (status == 0) SHOW(74, 155, "この絵をよく覚えて左クリック!"); // カーソルの表示 ShowCursor(TRUE); elDraw::Refresh(); }