C++基于EasyX庫(kù)實(shí)現(xiàn)拼圖小游戲
用C++的EasyX庫(kù)做的拼圖小游戲,供大家參考,具體內(nèi)容如下
記錄一下自己做的第一個(gè)項(xiàng)目,還有一些改進(jìn)空間QWQ,可以支持難度升級(jí),但是通關(guān)判斷似乎有點(diǎn)小問(wèn)題肯定不是我菜通不了關(guān) 。
#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]; //檢查數(shù)組 int map[MAX_MAP][MAX_MAP]; //序號(hào)儲(chǔ)存 int random[MAX_MAP * MAX_MAP]; //隨機(jī)化數(shù)組 IMAGE img_total; //原圖片 IMAGE img_blank; //白底 IMAGE img[MAX_MAP][MAX_MAP]; //儲(chǔ)存分塊圖片 int level = 3; //關(guān)卡難度 int width_temp = 0; //分塊寬度 int height_temp = 0; //分塊高度 int flagi = 0; //標(biāo)記塊行位置 int flagj = 0; //標(biāo)記塊列位置 int mousei = 0; //標(biāo)記鼠標(biāo)位置 int mousej = 0; //標(biāo)記鼠標(biāo)位置 int FLAG = 0; //勝利標(biāo)記 void Get_graphics(); //讀取圖片并預(yù)載到原圖中 void Set_graphics(); //設(shè)置好圖片位置及對(duì)應(yīng)關(guān)系 void Line_flush(); //畫線條分割圖片 void Rand_array(); //初始化隨機(jī)數(shù)組 void Get_mouse(); //獲取鼠標(biāo)操作 void Judge_graphics(); //判定是否通關(guān)并選擇是否下一關(guān) void Show_graphics(); //顯示分塊圖片 inline void Get_graphics() //讀取圖片并預(yù)載到原圖中 { loadimage(&img_total, L"1.png"); loadimage(&img_blank, L"0.png"); initgraph(img_total.getwidth(), img_total.getheight()); } inline void Set_graphics() //設(shè)置好圖片位置及對(duì)應(yīng)關(guān)系 { 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(); //校驗(yàn)數(shù)組初始化 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); //可以更改線條顏色 默認(rèn)白色 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() //初始化隨機(jī)數(shù)組 { for (int i = 0; i < level * level; i++) random[i] = i; random_device rd; mt19937 g(rd()); // 隨機(jī)數(shù)引擎 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]; //逆轉(zhuǎn)賦值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("過(guò)關(guān)了."), _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) //逆轉(zhuǎn)賦值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; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言中關(guān)于庫(kù)函數(shù) qsort 的模擬實(shí)現(xiàn)過(guò)程
庫(kù)函數(shù)的模擬實(shí)現(xiàn)有利于我們?nèi)ド钊肓私膺@個(gè)函數(shù)內(nèi)部是怎樣實(shí)現(xiàn)的,以及學(xué)習(xí)它的算法,使我們更加了解這個(gè)函數(shù)該怎樣去使用,接下來(lái)我將詳細(xì)的介紹qsort的應(yīng)用及用法,并且用代碼模擬實(shí)現(xiàn)它們的功能2021-09-09VS2019配置opencv詳細(xì)圖文教程和測(cè)試代碼的實(shí)現(xiàn)
這篇文章主要介紹了VS2019配置opencv詳細(xì)圖文教程和測(cè)試代碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
線性表是最基本、最簡(jiǎn)單、也是最常用的一種數(shù)據(jù)結(jié)構(gòu)。線性表(linear list)是數(shù)據(jù)結(jié)構(gòu)的一種,一個(gè)線性表是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列,這篇文章帶你學(xué)習(xí)下線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)2021-11-11Qt使用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)增刪改查
這篇文章主要為大家詳細(xì)介紹了Qt如何使用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)增刪改查功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06C語(yǔ)言棧的表示與實(shí)現(xiàn)實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言棧的表示與實(shí)現(xiàn),對(duì)于數(shù)據(jù)結(jié)構(gòu)與算法的研究有一定的借鑒價(jià)值,需要的朋友可以參考下2014-07-07C語(yǔ)言實(shí)現(xiàn)24點(diǎn)游戲源代碼
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)24點(diǎn)游戲源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10C++實(shí)現(xiàn)動(dòng)態(tài)煙花代碼
這篇文章主要介紹了利用C++實(shí)現(xiàn)的放煙花程序,用到了EGE圖形庫(kù),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下2023-01-01