您好,登錄后才能下訂單哦!
今天給大家介紹一下Easyx如何實(shí)現(xiàn)掃雷游戲。文章的內(nèi)容小編覺得不錯(cuò),現(xiàn)在給大家分享一下,覺得有需要的朋友可以了解一下,希望對(duì)大家有所幫助,下面跟著小編的思路一起來閱讀吧。
代碼:
#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è)置十個(gè)雷 用-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++) { //對(duì)周圍的數(shù)據(jù)加1,會(huì)有一個(gè)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ù),貼對(duì)應(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)求出對(duì)應(yīng)的數(shù)組的下標(biāo) int r = msg->y / ImgSize; int c = msg->x / ImgSize; //左鍵打開格子 if (msg->message == WM_LBUTTONDOWN) { //什么時(shí)候能夠打開,沒有打開的時(shí)候就打開 if (map[r][c]>=19 && map[r][c]<=28) { //這個(gè)函數(shù)只能播放wav格式 PlaySound("./images/click.wav", NULL, SND_ASYNC | SND_FILENAME); map[r][c] -= 20; boomBlank(map, r, c); //檢測(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)用都會(huì)播放一下 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 個(gè)格子 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; }
以上就是Easyx如何實(shí)現(xiàn)掃雷游戲的全部?jī)?nèi)容了,更多與Easyx如何實(shí)現(xiàn)掃雷游戲相關(guān)的內(nèi)容可以搜索億速云之前的文章或者瀏覽下面的文章進(jìn)行學(xué)習(xí)哈!相信小編會(huì)給大家增添更多知識(shí),希望大家能夠支持一下億速云!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。