Easyx實現(xiàn)掃雷游戲
更新時間:2022年01月16日 13:06:31 作者:shi_xiaobin
這篇文章主要為大家詳細介紹了Easyx實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了Easyx實現(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;?? ?//是不是第一次進來
?
//函數(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:?? ?//鼠標左鍵和右鍵點擊
?? ??? ??? ?case WM_RBUTTONDOWN:
?? ??? ??? ??? ?mouseMsg(&msg, map);
?? ??? ??? ??? ?int ret = judge(map,msg.y/ImgSize, msg.x / ImgSize);?? ??? ?//點擊之后判斷
?? ??? ??? ??? ?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è)置隨機數(shù)種子
?? ?srand((unsigned)time(NULL));
?
?? ?//把map全部初始化為0
?? ?memset(map, 0, sizeof(int) * ROW * COL);
?
?? ?//隨機設(shè)置十個雷 用-1表示
?? ?for (int i = 0; i < MineNum; )
?? ?{
?? ??? ?//數(shù)組的有效下標 [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]);
?? ??? ??? ?}
?? ??? ?}
?? ?}
}
//鼠標操作數(shù)據(jù)
void mouseMsg(ExMessage* msg,int map[][COL])
{
?? ?//先根據(jù)鼠標點擊的坐標求出對應(yīng)的數(shù)組的下標
?? ?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;
?? ??? ?}?? ?
?? ?}
?? ?//右鍵標記格子
?? ?else if (msg->message == WM_RBUTTONDOWN)
?? ?{
?? ??? ?PlaySound("./images/rightClick.wav", NULL, SND_ASYNC | SND_FILENAME);
?? ??? ?//是否能夠標記:如果沒有打開就能標記
?? ??? ?if (map[r][c] >= 19 && map[r][c] <= 28)
?? ??? ?{
?? ??? ??? ?map[r][c] += 20;
?? ??? ?}
?? ??? ?else if(map[r][c]>=39)
?? ??? ?{
?? ??? ??? ?map[r][c] -= 20;
?? ??? ?}
?? ?}
}
//點擊空白格子,連環(huán)爆開周圍的所有空白格子還有數(shù)字 ?row col 是當前點擊的格子
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)
{
?? ?//點到了雷,結(jié)束?? ?輸了
?? ?if (map[row][col] == -1 || map[row][col] == 19)
?? ?{
?? ??? ?return -1;
?? ?}
?
?? ?//點完了格子,結(jié)束 贏了 點開了100 - 10 = 90 個格子
?? ?int cnt = 0;
?? ?for (int i = 0; i < ROW; i++)
?? ?{
?? ??? ?for (int k = 0; k < COL; k++)
?? ??? ?{
?? ??? ??? ?//統(tǒng)計打開的格子的數(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)體字節(jié)對齊和共用體大小
這篇文章主要介紹了C++結(jié)構(gòu)體字節(jié)對齊和共用體大小,結(jié)構(gòu)體內(nèi)存對齊在筆試和面試中經(jīng)常被問到,所以這篇文章做個總結(jié),首先通過代碼驗證不同結(jié)構(gòu)體的內(nèi)存大小,需要的朋友可以參考下2021-11-11
C++中HTTP?代理服務(wù)器的設(shè)計與實現(xiàn)詳解
代理服務(wù)器,即允許一個網(wǎng)絡(luò)終端(一般為客戶端)通過這個服務(wù)與另一?個網(wǎng)絡(luò)終端(一般為服務(wù)器)進行非直接的連接,下面我們就來看看如何使用C++設(shè)計與實現(xiàn)一個HTTP?代理服務(wù)器吧2024-01-01
C++深入探索類真正的形態(tài)之struct與class
前邊我們所定義的類,均是使用struct關(guān)鍵字來定義,但是C++中真正用于定義類的關(guān)鍵字為class,因為要C++兼容C,所以保留struct關(guān)鍵字,struct與class的用法完全相同2022-04-04

