C++基於EasyX庫實現拼圖小遊戲
用C++的EasyX庫做的拼圖小遊戲,供大傢參考,具體內容如下
記錄一下自己做的第一個項目,還有一些改進空間QWQ,可以支持難度升級,但是通關判斷似乎有點小問題肯定不是我菜通不瞭關 。
#pragma once #include <iostream> #include <graphics.h> #include <Windows.h> #include <algorithm> #include <easyx.h> #include <cstdlib> #include <random> #include <cmath> using namespace std; static const int MAX_MAP = 30; //定義最大行或者列分塊常量 int check[MAX_MAP][MAX_MAP]; //檢查數組 int map[MAX_MAP][MAX_MAP]; //序號儲存 int random[MAX_MAP * MAX_MAP]; //隨機化數組 IMAGE img_total; //原圖片 IMAGE img_blank; //白底 IMAGE img[MAX_MAP][MAX_MAP]; //儲存分塊圖片 int level = 3; //關卡難度 int width_temp = 0; //分塊寬度 int height_temp = 0; //分塊高度 int flagi = 0; //標記塊行位置 int flagj = 0; //標記塊列位置 int mousei = 0; //標記鼠標位置 int mousej = 0; //標記鼠標位置 int FLAG = 0; //勝利標記 void Get_graphics(); //讀取圖片並預載到原圖中 void Set_graphics(); //設置好圖片位置及對應關系 void Line_flush(); //畫線條分割圖片 void Rand_array(); //初始化隨機數組 void Get_mouse(); //獲取鼠標操作 void Judge_graphics(); //判定是否通關並選擇是否下一關 void Show_graphics(); //顯示分塊圖片 inline void Get_graphics() //讀取圖片並預載到原圖中 { loadimage(&img_total, L"1.png"); loadimage(&img_blank, L"0.png"); initgraph(img_total.getwidth(), img_total.getheight()); } inline void Set_graphics() //設置好圖片位置及對應關系 { width_temp = img_total.getwidth() / level; height_temp = img_total.getheight() / level; //載入各分塊的圖片 SetWorkingImage(&img_total); for (int i = 0; i < level; i++) { for (int j = 0; j < level; j++) getimage(&img[i][j], i * width_temp, j * height_temp, width_temp, height_temp); } SetWorkingImage(); //校驗數組初始化 int cnt = 0; for (int i = 0; i < level; i++) { for (int j = 0; j < level; j++) { check[i][j] = cnt; cnt++; } } } inline void Line_flush() //畫線條分割圖片 { for (int i = 0; i < level; i++) { //setlinecolor(RED); //可以更改線條顏色 默認白色 line(i * width_temp, 0, i * width_temp, img_total.getheight()); line(0, i * height_temp, img_total.getwidth(), i * height_temp); } } inline void Rand_array() //初始化隨機數組 { for (int i = 0; i < level * level; i++) random[i] = i; random_device rd; mt19937 g(rd()); // 隨機數引擎 shuffle(random, random + level * level, g); // 打亂順序 int cnt = 0; for (int i = 0; i < level; i++) { for (int j = 0; j < level; j++) { map[j][i] = random[cnt]; //逆轉賦值1 cnt++; } } } void Get_mouse() { MOUSEMSG msg = GetMouseMsg(); if (msg.uMsg == WM_LBUTTONDOWN) { mousei = msg.x / width_temp; mousej = msg.y / height_temp; if ((mousei + 1 == flagi && mousej == flagj) || (mousei == flagi && mousej + 1 == flagj) || (mousei - 1 == flagi && mousej == flagj) || (mousei == flagi && mousej - 1 == flagj)) { //交換圖片分塊 swap(map[mousej][mousei], map[flagj][flagi]); } } } void Judge_graphics() { int cnt = 0; for (int i = 0; i < level; i++) { for (int j = 0; j < level; j++) { if (map[i][j] == check[i][j]) cnt++; } } if (cnt == level * level) { MessageBox(GetHWnd(), _T("過關瞭."), _T("消息提示."), MB_OK); FLAG = 1; exit(0); } } inline void Show_graphics() //顯示分塊圖片 { for (int i = 0; i < level; i++) { for (int j = 0; j < level; j++) { if (map[j][i] == level * level - 1) //逆轉賦值2 { flagi = i; flagj = j; putimage(i * width_temp, j * height_temp, &img_blank); } else { int countj = map[j][i] % level; int counti = map[j][i] / level; putimage(i * width_temp, j * height_temp, &img[countj][counti]); } } } Line_flush(); } int main() { Get_graphics(); Set_graphics(); Rand_array(); Show_graphics(); while (1) { BeginBatchDraw(); //雙緩沖防止閃爍 Get_mouse(); Show_graphics(); EndBatchDraw(); //雙緩沖防止閃爍 Judge_graphics(); } if (FLAG) { putimage(0, 0, &img_total); FLAG = 0; } system("pause"); return 0; }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。