Easyx實現掃雷遊戲
本文實例為大傢分享瞭Easyx實現掃雷遊戲的具體代碼,供大傢參考,具體內容如下
代碼:
#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 //雷的數量 #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; //是不是第一次進來 //函數聲明 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() { //創建窗口 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); //遊戲主循環 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"); } } //初始化數據 void init(int map[][COL]) { loadResource(); //設置隨機數種子 srand((unsigned)time(NULL)); //把map全部初始化為0 memset(map, 0, sizeof(int) * ROW * COL); //隨機設置十個雷 用-1表示 for (int i = 0; i < MineNum; ) { //數組的有效下標 [0,9] int r = rand() % ROW; int c = rand() % COL; if (map[r][c] == 0) { map[r][c] = -1; //隻有執行瞭這裡的代碼,才成功設置瞭雷 -1 i++; } } //把以雷為中心的九宮格數據都+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++) { //對周圍的數據加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]) { //貼圖,根據map裡面的數據,貼對應的圖片 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]); } } } } //鼠標操作數據 void mouseMsg(ExMessage* msg,int map[][COL]) { //先根據鼠標點擊的坐標求出對應的數組的下標 int r = msg->y / ImgSize; int c = msg->x / ImgSize; //左鍵打開格子 if (msg->message == WM_LBUTTONDOWN) { //什麼時候能夠打開,沒有打開的時候就打開 if (map[r][c]>=19 && map[r][c]<=28) { //這個函數隻能播放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; } } } //點擊空白格子,連環爆開周圍的所有空白格子還有數字 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) //沒有打開 { //每一次調用都會播放一下 if (isfirst) { PlaySound("./images/search.wav", NULL, SND_ASYNC | SND_FILENAME); isfirst = false; } map[r][c] -= 20; boomBlank(map, r, c); } } } } return; } //遊戲結束條件 輸瞭返回-1 沒結束返回0 贏瞭返回 1 int judge(int map[][COL],int row ,int col) { //點到瞭雷,結束 輸瞭 if (map[row][col] == -1 || map[row][col] == 19) { return -1; } //點完瞭格子,結束 贏瞭 點開瞭100 - 10 = 90 個格子 int cnt = 0; for (int i = 0; i < ROW; i++) { for (int k = 0; k < COL; k++) { //統計打開的格子的數量 if (map[i][k] >= 0 && map[i][k] <= 8) { ++cnt; } } } if (ROW*COL - MineNum == cnt) { return 1; } return 0; }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。