Easyx實(shí)現(xiàn)掃雷游戲
本文實(shí)例為大家分享了Easyx實(shí)現(xiàn)掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
代碼:
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<easyx.h> ? #include<mmsystem.h> #pragma comment(lib, "winmm.lib") ? #define ROW 10?? ?//定義行列的常量 #define COL?? ?10? #define MineNum 10?? ?//雷的數(shù)量 #define ImgSize?? ?40?? ?//圖片的尺寸 ? //定義圖片資源 IMAGE imgs[12]; void loadResource() { ?? ?for (int i = 0; i < 12; i++) ?? ?{ ?? ??? ?char imgPath[50] = { 0 }; ?? ??? ?sprintf_s(imgPath, "./images/%d.jpg", i); ?? ??? ?loadimage(&imgs[i], imgPath, ImgSize, ImgSize); ?? ?} } ? bool isfirst = true;?? ?//是不是第一次進(jìn)來 ? //函數(shù)聲明 void show(int map[][COL]); void init(int map[][COL]); void draw(int map[][COL]); void mouseMsg(ExMessage* msg, int map[][COL]); void boomBlank(int map[][COL], int row, int col); int judge(int map[][COL], int row, int col); int main() { ?? ?//創(chuàng)建窗口 ?? ?initgraph(400, 400/*,EW_SHOWCONSOLE*/); ?? ?//播放開始音樂 ?? ?mciSendString("open ./images/start.mp3 alias bgm", NULL, 0, NULL); ?? ?mciSendString("play bgm", NULL, 0, NULL); ? ?? ?//掃雷地圖 ?? ?int map[ROW][COL] = {0}; ?? ?init(map); ? ?? ?//游戲主循環(huán) ?? ?while (true) ?? ?{ ?? ??? ?//處理消息 ?? ??? ?ExMessage msg; ?? ??? ?while (peekmessage(&msg, EM_MOUSE)) ?? ??? ?{ ?? ??? ??? ?switch (msg.message) ?? ??? ??? ?{ ?? ??? ??? ?case WM_LBUTTONDOWN:?? ?//鼠標(biāo)左鍵和右鍵點(diǎn)擊 ?? ??? ??? ?case WM_RBUTTONDOWN: ?? ??? ??? ??? ?mouseMsg(&msg, map); ?? ??? ??? ??? ?int ret = judge(map,msg.y/ImgSize, msg.x / ImgSize);?? ??? ?//點(diǎn)擊之后判斷 ?? ??? ??? ??? ?if (ret == -1) ?? ??? ??? ??? ?{ ? ?? ??? ??? ??? ??? ?draw(map); ?? ??? ??? ??? ??? ?int select = MessageBox(GetHWnd(), "你這么牛,怎么輸了呢?敢再來一把嗎?", "low B!", MB_OKCANCEL); ?? ??? ??? ??? ??? ?if (select == IDOK)?? ?//再來一把 ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?//重新初始化 ?? ??? ??? ??? ??? ??? ?init(map); ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?else ?//退出 ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?exit(0); ?? ??? ??? ??? ??? ?} ? ?? ??? ??? ??? ?} ?? ??? ??? ??? ?else if(ret == 1) ?? ??? ??? ??? ?{ ? ?? ??? ??? ??? ?} ?? ??? ??? ??? ?system("cls"); ?? ??? ??? ??? ?printf("judege:%d\n", ret); ?? ??? ??? ??? ?show(map); ?? ??? ??? ??? ?break; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?draw(map);?? ??? ? ?? ?} ? ?? ?//show(map); ?? ?getchar(); ?? ?return 0; } ? void show(int map[][COL]) { ?? ?for (int i = 0; i < ROW; i++) ?? ?{ ?? ??? ?for (int k = 0; k < COL; k++) ?? ??? ?{ ?? ??? ??? ?printf("%2d ", map[i][k]); ?? ??? ?} ?? ??? ?printf("\n"); ?? ?} } //初始化數(shù)據(jù) void init(int map[][COL]) { ?? ?loadResource(); ?? ?//設(shè)置隨機(jī)數(shù)種子 ?? ?srand((unsigned)time(NULL)); ? ?? ?//把map全部初始化為0 ?? ?memset(map, 0, sizeof(int) * ROW * COL); ? ?? ?//隨機(jī)設(shè)置十個雷 用-1表示 ?? ?for (int i = 0; i < MineNum; ) ?? ?{ ?? ??? ?//數(shù)組的有效下標(biāo) [0,9] ?? ??? ?int r = rand() % ROW; ?? ??? ?int c = rand() % COL; ?? ??? ?if (map[r][c] == 0) ?? ??? ?{ ?? ??? ??? ?map[r][c] = -1; ?? ??? ??? ?//只有執(zhí)行了這里的代碼,才成功設(shè)置了雷 -1 ?? ??? ??? ?i++; ?? ??? ?} ?? ?} ? ?? ?//把以雷為中心的九宮格數(shù)據(jù)都+1,雷除外 ?? ?for (int i = 0; i < ROW; i++) ?? ?{ ?? ??? ?for (int k = 0; k < COL; k++) ?? ??? ?{ ?? ??? ??? ?//找到雷,并遍歷雷所在的九宮格 ?? ??? ??? ?if (map[i][k] == -1) ?? ??? ??? ?{ ?? ??? ??? ??? ?for (int r = i-1; r <= i+1; r++) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?for (int c = k-1; c <= k+1; c++) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?//對周圍的數(shù)據(jù)加1,會有一個bug ?? ??? ??? ??? ??? ??? ?if ((r >= 0 && r < ROW && c >= 0 && c < COL) && map[r][c] != -1) ?? ??? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ??? ?++map[r][c]; ?? ??? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ?} ? ?? ?//加密格子 ?? ?for (int i = 0; i < ROW; i++) ?? ?{ ?? ??? ?for (int k = 0; k < COL; k++) ?? ??? ?{ ?? ??? ??? ?map[i][k] += 20; ?? ??? ?} ?? ?} } //繪制 void draw(int map[][COL]) { ?? ?//貼圖,根據(jù)map里面的數(shù)據(jù),貼對應(yīng)的圖片 ?? ?for (int i = 0; i < ROW; i++) ?? ?{ ?? ??? ?for (int k = 0; k < COL; k++) ?? ??? ?{ ?? ??? ??? ?if (map[i][k]>=0 && map[i][k]<=8)?? ?//[0,8] ?? ??? ??? ?{ ?? ??? ??? ??? ?int index = map[i][k];?? ?//0 1 2 3 4 5 6 7 8 ?? ??? ??? ??? ?putimage(k * ImgSize, i * ImgSize, &imgs[index]);?? ?// ?? ??? ??? ?} ?? ??? ??? ?else if (map[i][k] == -1) ?? ??? ??? ?{ ?? ??? ??? ??? ?putimage(k * ImgSize, i * ImgSize, &imgs[9]); ?? ??? ??? ?} ?? ??? ??? ?else if (map[i][k] >= 19 && map[i][k] <= 28) ?? ??? ??? ?{ ?? ??? ??? ??? ?putimage(k * ImgSize, i * ImgSize, &imgs[10]); ?? ??? ??? ?} ?? ??? ??? ?else if(map[i][k] >= 39)?? ?//-1 + 20 +20 ?? ??? ??? ?{ ?? ??? ??? ??? ?putimage(k * ImgSize, i * ImgSize, &imgs[11]); ?? ??? ??? ?} ?? ??? ?} ?? ?} } //鼠標(biāo)操作數(shù)據(jù) void mouseMsg(ExMessage* msg,int map[][COL]) { ?? ?//先根據(jù)鼠標(biāo)點(diǎn)擊的坐標(biāo)求出對應(yīng)的數(shù)組的下標(biāo) ?? ?int r = msg->y / ImgSize; ?? ?int c = msg->x / ImgSize; ?? ?//左鍵打開格子 ?? ?if (msg->message == WM_LBUTTONDOWN) ?? ?{ ?? ??? ?//什么時候能夠打開,沒有打開的時候就打開 ?? ??? ?if (map[r][c]>=19 && map[r][c]<=28) ?? ??? ?{ ?? ??? ??? ?//這個函數(shù)只能播放wav格式 ?? ??? ??? ?PlaySound("./images/click.wav", NULL, SND_ASYNC | SND_FILENAME); ?? ??? ??? ?map[r][c] -= 20; ?? ??? ??? ?boomBlank(map, r, c);?? ?//檢測一下是不是空白格子,是,炸開 ?? ??? ??? ?isfirst = true; ?? ??? ?}?? ? ?? ?} ?? ?//右鍵標(biāo)記格子 ?? ?else if (msg->message == WM_RBUTTONDOWN) ?? ?{ ?? ??? ?PlaySound("./images/rightClick.wav", NULL, SND_ASYNC | SND_FILENAME); ?? ??? ?//是否能夠標(biāo)記:如果沒有打開就能標(biāo)記 ?? ??? ?if (map[r][c] >= 19 && map[r][c] <= 28) ?? ??? ?{ ?? ??? ??? ?map[r][c] += 20; ?? ??? ?} ?? ??? ?else if(map[r][c]>=39) ?? ??? ?{ ?? ??? ??? ?map[r][c] -= 20; ?? ??? ?} ?? ?} } //點(diǎn)擊空白格子,連環(huán)爆開周圍的所有空白格子還有數(shù)字 ?row col 是當(dāng)前點(diǎn)擊的格子 void boomBlank(int map[][COL],int row,int col) {?? ? ?? ?//判斷row col位置是不是空白格子 ?? ?if (map[row][col] == 0) ?? ?{ ?? ??? ?for (int r = row-1; r <= row+1; r++) ?? ??? ?{ ?? ??? ??? ?for (int c = col-1; c <= col+1; c++) ?? ??? ??? ?{ ?? ??? ??? ??? ?if ((r>=0&&r<ROW&&c>=0&&c<COL)?? ??? ??? ?//沒越界 ?? ??? ??? ??? ??? ?&& map[r][c]>=19 && map[r][c]<=28)?? ?//沒有打開 ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?//每一次調(diào)用都會播放一下 ?? ??? ??? ??? ??? ?if (isfirst) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?PlaySound("./images/search.wav", NULL, SND_ASYNC | SND_FILENAME); ?? ??? ??? ??? ??? ??? ?isfirst = false; ?? ??? ??? ??? ??? ?} ? ?? ??? ??? ??? ??? ?map[r][c] -= 20; ?? ??? ??? ??? ??? ?boomBlank(map, r, c); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?return; } //游戲結(jié)束條件 輸了返回-1 ?沒結(jié)束返回0 贏了返回 1 int judge(int map[][COL],int row ,int col) { ?? ?//點(diǎn)到了雷,結(jié)束?? ?輸了 ?? ?if (map[row][col] == -1 || map[row][col] == 19) ?? ?{ ?? ??? ?return -1; ?? ?} ? ?? ?//點(diǎn)完了格子,結(jié)束 贏了 點(diǎn)開了100 - 10 = 90 個格子 ?? ?int cnt = 0; ?? ?for (int i = 0; i < ROW; i++) ?? ?{ ?? ??? ?for (int k = 0; k < COL; k++) ?? ??? ?{ ?? ??? ??? ?//統(tǒng)計(jì)打開的格子的數(shù)量 ?? ??? ??? ?if (map[i][k] >= 0 && map[i][k] <= 8) ?? ??? ??? ?{ ?? ??? ??? ??? ?++cnt; ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?if (ROW*COL - MineNum == cnt) ?? ?{ ?? ??? ?return 1; ?? ?} ? ?? ?return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談C語言共用體和與結(jié)構(gòu)體的區(qū)別
下面小編就為大家?guī)硪黄獪\談C語言共用體和與結(jié)構(gòu)體的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02C++實(shí)現(xiàn)LeetCode(58.求末尾單詞的長度)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(58.求末尾單詞的長度),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C/C++代碼操作MySQL數(shù)據(jù)庫詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于C/C++代碼操作MySQL數(shù)據(jù)庫的相關(guān)資料,通過文中的這些示例,我們可以連接到MySQL數(shù)據(jù)庫,并執(zhí)行常見的數(shù)據(jù)庫操作,如創(chuàng)建表、插入數(shù)據(jù)和查詢數(shù)據(jù),需要的朋友可以參考下2023-12-12C語言?詳解如何刪除有序數(shù)組中的重復(fù)項(xiàng)
數(shù)組不擅長插入(添加)和刪除元素。數(shù)組的優(yōu)點(diǎn)在于它是連續(xù)的,所以查找數(shù)據(jù)速度很快。但這也是它的一個缺點(diǎn)。正因?yàn)樗沁B續(xù)的,所以當(dāng)插入一個元素時,插入點(diǎn)后所有的元素全部都要向后移;而刪除一個元素時,刪除點(diǎn)后所有的元素全部都要向前移2022-03-03C語言strlen,strcpy,strcmp,strcat,strstr字符串操作函數(shù)實(shí)現(xiàn)
這篇文章主要介紹了C語言strlen,strcpy,strcmp,strcat,strstr字符串操作函數(shù)實(shí)現(xiàn),,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-09-09AVX2指令集優(yōu)化浮點(diǎn)數(shù)組求和算法
這篇文章主要為大家介紹了AVX2指令集優(yōu)化浮點(diǎn)數(shù)組求和算法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05深入解析C++編程中對設(shè)計(jì)模式中的策略模式的運(yùn)用
這篇文章主要介紹了C++編程中對設(shè)計(jì)模式中的策略模式的運(yùn)用,需要的朋友可以參考下2016-03-03