C語言代碼實(shí)現(xiàn)簡單的掃雷小游戲
C語言+EASYX實(shí)現(xiàn)掃雷,供大家參考,具體內(nèi)容如下
主要思路就是通過一個(gè)二維數(shù)組存儲(chǔ)不同的數(shù)來代表0到8等具體的圖片,再配合鼠標(biāo)的位置和點(diǎn)擊情況,來改變數(shù)組某一項(xiàng)的值,而顯示不同的圖片。
水平有限,有些地方的代碼過于復(fù)雜和繁瑣,有待優(yōu)化;有些功能的實(shí)現(xiàn)也不是很完整和合理,敬請(qǐng)指正。
#include <stdio.h> //標(biāo)準(zhǔn)的輸入輸出頭文件。 #include <graphics.h> //EasyX圖形界面。 #include <time.h> #include <stdlib.h> #include<mmsystem.h> #pragma comment(lib,"winmm.lib")//導(dǎo)入靜態(tài)庫 int f2=0;//標(biāo)志信號(hào) int flag=0;//標(biāo)志信號(hào) int ROW = 0; //棋盤行數(shù) int COL = 0; //棋盤列數(shù) int NUM = 0; //雷的個(gè)數(shù) int size; //圖片尺寸 HWND hwnd1; int count = 0;//已掀開的數(shù)量; void BGMPLAY(void)//播放音樂函數(shù) { mciSendString(L"open ./image/XXX.mp3 alias bgm",0,0,0);//XX可替換為自己的歌曲 mciSendString(L"play bgm repeat",0,0,0); } struct rayxy//地雷位置 { int x; int y; }xy[200];//地雷位置 IMAGE img[21];//存儲(chǔ)圖像 void welcome() { initgraph( 640, 480); loadimage(&img[9], L"./image/開始界面1.jpg", 640, 480);//開始界面 loadimage(&img[15], L"./image/菜單界面.jpg", 640, 480);//菜單選擇界面 if (!flag) { putimage(0, 0, &img[9]); Sleep(1000); } cleardevice(); putimage(0, 0, &img[15]); //模式選擇 MOUSEMSG msg = { 0 }; const int x1=9,y1=8, x2=290,y2=8,x3=9,y3=330,x4=290,y4=330, h=306, w=265; int sx = 0, sy = 0; //模式選擇 while (1) { HWND hwnd; msg = GetMouseMsg(); if (msg.uMsg == WM_LBUTTONDOWN) { sx = msg.x; sy = msg.y; break; } } if ((sx >= x1 && sy >= y1)&& (sx <= x1+w && sy <= y1+h)) { ROW = 9; COL = 9; NUM = 10; size = 70; } if ((sx >= x2 && sy >= y2) && (sx <= x2 + w && sy <= y2 + h)) { ROW = 16; COL = 30; NUM = 99; size = 43; } if((sx >= x3 && sy >= y3) && (sx <= x3 + w && sy <= y3 + h)) { ROW = 16; COL = 16; NUM = 40; size = 48; } if ((sx >= x4 && sy >= y4) && (sx <= x4 + w && sy <= y4 + h)) { MessageBox(hwnd1, L"敬請(qǐng)期待!??!", L"提示", MB_OK); f2 = 1; flag = 1; Sleep(1000); } }//歡迎界面 int map[30][30];//棋盤地圖 void imgplay(void) { loadimage(&img[0], L"./image/空白.jpg",size, size);//空白 loadimage(&img[1], L"./image/1.jpg", size, size); loadimage(&img[2], L"./image/2.jpg", size, size); loadimage(&img[3], L"./image/3.jpg", size, size); loadimage(&img[4], L"./image/4.jpg", size, size); loadimage(&img[5], L"./image/5.jpg", size, size); loadimage(&img[6], L"./image/6.jpg", size, size); loadimage(&img[7], L"./image/7.jpg", size, size); loadimage(&img[8], L"./image/8.jpg", size, size);//8 loadimage(&img[16], L"./image/問號(hào).jpg", size, size);//問號(hào) loadimage(&img[10], L"./image/覆蓋.jpg", size, size);//覆蓋 loadimage(&img[11], L"./image/標(biāo)記.jpg", size, size);//標(biāo)記 loadimage(&img[12], L"./image/地雷.jpg", size, size);//地雷 loadimage(&img[13], L"./image/勝利.jpg", size, size);//勝利 loadimage(&img[14], L"./image/問號(hào).jpg", size, size);//問號(hào) loadimage(&img[16], L"./image/9.jpg", size, size);//9 loadimage(&img[17], L"./image/0.jpg", size, size);//0 loadimage(&img[18], L"./image/冒號(hào).jpg", size, size);//冒號(hào) loadimage(&img[20], L"./image/標(biāo)記錯(cuò)誤.jpg", size, size);/標(biāo)記錯(cuò)誤 } void gameinit() { int i, j; srand((unsigned int)time(NULL));//為隨機(jī)布雷提供隨機(jī)數(shù) for (i = 0; i < ROW + 2; i++) { for (j = 0; j < COL + 2; j++) { map[i][j] = 0; } } int r, c, n = 0; while (n < NUM) { r = rand() % ROW + 1; c = rand() % COL + 1; if (map[r][c] != -1) { map[r][c] = -1; xy[n].x = r; xy[n].y = c; n++; } else { continue; } } for (i = 1; i <= ROW; i++) { for (j = 1; j <= COL; j++) { if (map[i][j] != -1) { for (r = i - 1; r <= i + 1; r++) for (c = j - 1; c <= j + 1; c++) { if (map[r][c] == -1) { map[i][j]++; } } } } } for (i = 1; i <= ROW; i++) { for (j = 1; j <= COL; j++) { map[i][j] += 20; } } } void drawgraph() { int i, j; for (i = 1; i <= ROW; i++) { for (j = 1; j <= COL; j++) { if (map[i][j] == -1) { putimage((j - 1) * size, (i - 1) * size, &img[12]);//地雷 } else if (map[i][j] >= 0 && map[i][j] <= 8) { putimage((j - 1) * size, (i - 1) * size, &img[map[i][j]]);//顯示數(shù)字和空白 } else if (map[i][j] >= 19 && map[i][j] <= 28) { putimage((j - 1) * size, (i - 1) * size, &img[10]);//覆蓋 } else if (map[i][j] >= 29&&map[i][j]<=38) { putimage((j - 1) * size, (i - 1) * size, &img[11]);//標(biāo)記 } else if(map[i][j]>=39&&map[i][j]<=48) { putimage((j - 1) * size, (i - 1) * size, &img[14]);//問號(hào) } if (map[i][j] == -2) { putimage((j - 1) * size, (i - 1) * size, &img[13]);//勝利 } } } } void draw(int i, int j) { if (map[i][j] == -1) { putimage((j - 1) * size, (i - 1) * size, &img[12]);//地雷 } else if (map[i][j] >= 0 && map[i][j] <= 8) { putimage((j - 1) * size, (i - 1) * size, &img[map[i][j]]);//顯示數(shù)字和空白 } else if (map[i][j] >= 19 && map[i][j] <= 28) { putimage((j - 1) * size, (i - 1) * size, &img[10]);//覆蓋 } else if (map[i][j] >= 29&&map[i][j]<=38) { putimage((j - 1) * size, (i - 1) * size, &img[11]);//標(biāo)記 } else { putimage((j - 1) * size, (i - 1) * size, &img[14]);//問號(hào) } } void blankopen(int r, int c) { int a, b; if (map[r][c] == 20) { count++; map[r][c] -= 20; } for (a = r - 1; a <= r + 1; a++) { for (b = c - 1; b <= c + 1; b++) { if (a >= 1 && a <= ROW && b >= 1 && b <= COL) { if (map[a][b] >= 20 && map[a][b] <= 28) { map[a][b] -= 20; count++; } } } } } int playgame() { MOUSEMSG msg = { 0 }; int r, c; //while (1) //{ msg = GetMouseMsg(); switch (msg.uMsg) { case WM_LBUTTONDOWN: c = msg.x / size + 1; r = msg.y / size + 1; if (map[r][c] >= 29&&map[r][c]<=38) { map[r][c] -= 10; } if (map[r][c] >= 39 && map[r][c] <= 48) { map[r][c] -= 20; } if (map[r][c] >= 19 && map[r][c] <= 28) { if (map[r][c] == 20) { blankopen(r, c); } else { if (map[r][c] != 19) count++; map[r][c] -= 20; } } if (map[r][c] == 0) blankopen(r, c); draw(r, c); return map[r][c]; //break; case WM_RBUTTONDOWN: c = msg.x / size + 1; r = msg.y / size + 1; if (map[r][c] >= 19 && map[r][c] <= 28) { map[r][c] += 10; } else if (map[r][c] >= 29&&map[r][c]<=38) { map[r][c] += 10; } else { map[r][c] -= 20; } draw(r, c); return map[r][c]; //break; } //} } int timerec(void) { time_t timep; struct tm p; time(&timep); gmtime_s(&p, &timep); int t = p.tm_min * 60 + p.tm_sec; return t; } void timeplay(int t) { int min=0 ,sec=0; printf("%d\n", t); min = t / 60; putimage((COL - 3) * size, (ROW)*size, &img[18]); switch (min / 10) { case 0:putimage((COL - 5) * size, (ROW ) * size, &img[17]); break; case 1:putimage((COL - 5) * size, (ROW ) * size, &img[1]); break; case 2:putimage((COL - 5) * size, (ROW ) * size, &img[2]); break; case 3:putimage((COL - 5) * size, (ROW ) * size, &img[3]); break; case 4:putimage((COL - 5) * size, (ROW ) * size, &img[4]); break; case 5:putimage((COL - 5) * size, (ROW ) * size, &img[5]); break; case 6:putimage((COL - 5) * size, (ROW ) * size, &img[6]); break; case 7:putimage((COL - 5) * size, (ROW ) * size, &img[7]); break; case 8:putimage((COL - 5) * size, (ROW ) * size, &img[8]); break; case 9:putimage((COL - 5) * size, (ROW ) * size, &img[16]); break; default:putimage((COL - 5) * size, (ROW ) * size, &img[10]); break; } switch (min % 10) { case 0:putimage((COL - 4) * size, (ROW ) * size, &img[17]); break; case 1:putimage((COL - 4) * size, (ROW ) * size, &img[1]); break; case 2:putimage((COL - 4) * size, (ROW ) * size, &img[2]); break; case 3:putimage((COL - 4) * size, (ROW ) * size, &img[3]); break; case 4:putimage((COL - 4) * size, (ROW ) * size, &img[4]); break; case 5:putimage((COL - 4) * size, (ROW ) * size, &img[5]); break; case 6:putimage((COL - 4) * size, (ROW ) * size, &img[6]); break; case 7:putimage((COL - 4) * size, (ROW ) * size, &img[7]); break; case 8:putimage((COL - 4) * size, (ROW ) * size, &img[8]); break; case 9:putimage((COL - 4) * size, (ROW ) * size, &img[16]); break; default:putimage((COL - 4) * size, (ROW ) * size, &img[10]); break; } sec = t % 60; switch (sec / 10) { case 0:putimage((COL - 2) * size, (ROW ) * size, &img[17]); break; case 1:putimage((COL - 2) * size, (ROW ) * size, &img[1]); break; case 2:putimage((COL - 2) * size, (ROW ) * size, &img[2]); break; case 3:putimage((COL - 2) * size, (ROW ) * size, &img[3]); break; case 4:putimage((COL - 2) * size, (ROW ) * size, &img[4]); break; case 5:putimage((COL - 2) * size, (ROW ) * size, &img[5]); break; case 6:putimage((COL - 2) * size, (ROW ) * size, &img[6]); break; case 7:putimage((COL - 2) * size, (ROW ) * size, &img[7]); break; case 8:putimage((COL - 2) * size, (ROW ) * size, &img[8]); break; case 9:putimage((COL - 2) * size, (ROW ) * size, &img[16]); break; default:putimage((COL - 2) * size, (ROW ) * size, &img[10]); break; } switch (sec % 10) { case 0:putimage((COL - 1) * size, (ROW ) * size, &img[17]); break; case 1:putimage((COL - 1) * size, (ROW ) * size, &img[1]); break; case 2:putimage((COL - 1) * size, (ROW ) * size, &img[2]); break; case 3:putimage((COL - 1) * size, (ROW ) * size, &img[3]); break; case 4:putimage((COL - 1) * size, (ROW ) * size, &img[4]); break; case 5:putimage((COL - 1) * size, (ROW ) * size, &img[5]); break; case 6:putimage((COL - 1) * size, (ROW ) * size, &img[6]); break; case 7:putimage((COL - 1) * size, (ROW ) * size, &img[7]); break; case 8:putimage((COL - 1) * size, (ROW ) * size, &img[8]); break; case 9:putimage((COL - 1) * size, (ROW ) * size, &img[16]); break; default:putimage((COL - 1) * size, (ROW ) * size, &img[10]); break; } for (int i = 0; i < COL-5; i++) { putimage((i) * size, (ROW)*size, &img[20]); } } int main() { BGMPLAY();//播放初始音樂 int i = 0, j = 0, MAX = 0; srand((unsigned int)time(NULL)); loop: loop1: f2 = 0; welcome(); if (f2)goto loop1; imgplay(); count = 0; hwnd1 = initgraph(COL * size, (ROW+1) * size); gameinit(); MAX = ROW * COL - NUM; time_t timep; struct tm p; time(&timep); gmtime_s(&p,&timep); int t1 = timerec(); while (1) { drawgraph(); timeplay(timerec() - t1); if (playgame() == -1) { for (i = 0; i < NUM; i++) { map[xy[i].x][xy[i].y] = -1; } drawgraph(); Sleep(1000); MessageBox(hwnd1, L"很遺憾!", L"提示", MB_OK); int x = MessageBox(hwnd1, L"回到主菜單", L"Minesweeper", MB_OKCANCEL); if (x == 1) { flag = 1; goto loop; } break; } if (count == MAX) { for (i = 0; i < NUM; i++) { map[xy[i].x][xy[i].y] = -2; } drawgraph(); Sleep(1000); MessageBox(hwnd1, L"Very good!!!", L"提示", MB_OK); int y = MessageBox(hwnd1, L"回到主菜單", L"Minesweeper", MB_OKCANCEL); if (y) { flag = 1; goto loop; } else { break; } } } }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++中指向?qū)ο蟮某V羔樑c指向常對(duì)象的指針詳解
如果一個(gè)變量已經(jīng)被聲明成常變量,則只能用指向常變量的指針變量指向它,而不能用一般的(非const型的)指針變量指向它2013-10-10Qt物聯(lián)網(wǎng)管理平臺(tái)之實(shí)現(xiàn)數(shù)據(jù)查詢導(dǎo)出打印
這篇文章主要為大家介紹了如何利用Qt編寫物聯(lián)網(wǎng)管理平臺(tái)中數(shù)據(jù)查詢導(dǎo)出打印的功能,文字的示例代碼講解詳細(xì),感興趣的可以了解一下2022-07-07C++有符號(hào)和無符號(hào)之間的轉(zhuǎn)換問題
在開發(fā)中經(jīng)常會(huì)遇到有符號(hào)和無符號(hào)之間的轉(zhuǎn)換問題,如果不清楚問題根源,很難解決bug,今天小編通過本文給大家分享c++有符號(hào)無符號(hào)轉(zhuǎn)換問題,需要的朋友參考下2021-07-07