|
231| 1
|
[项目分享] 扫雷C++2(改进时间,地雷数显示) |
|
本帖最后由 材1 于 2026-4-7 18:26 编辑 扫雷C++2(改进时间,地雷数显示) 上一版的时间,地雷数显示太小了 这一版我把它改大些#include<cstdio> #include<graphics.h> #include<queue> #include<random> #include<vector> #include<windows.h> #pragma comment(lib, "winmm.lib") #define LOWER 9 #define UPPER 100 struct yx { int y, x; }; using namespace std; int main() { //参数 int w = 0, h = 0, l = 0; //输入参数 SetConsoleOutputCP(65001); printf("esc退出_\nh:"); while (scanf_s("%d", &h) == 3 || h < LOWER || UPPER < h)printf("too small/max\nh:"); printf("\nw:"); while (scanf_s("%d", &w) == 3 || w < LOWER || UPPER < w)printf("too small/max\nw:"); printf("\nlandmine:"); while (scanf_s("%d", &l) == 3 || l < LOWER || w * h < l)printf("too small/max\nl:"); //初始化 int size = 30; if (GetSystemMetrics(SM_CXSCREEN) / w < size)size = GetSystemMetrics(SM_CXSCREEN) / w; if (GetSystemMetrics(SM_CYSCREEN) / (h + 5) < size)size = GetSystemMetrics(SM_CYSCREEN) / (h + 5); const int f_size = size / 4; vector<vector<char>>grid(h, vector<char>(w, '0')); vector<vector<bool>>open(h, vector<bool>(w)),flag(h, vector<bool>(w)); bool started = 0; bool op = 1; int flag_num = 0; int _l = l; time_t start = 0; MOUSEMSG msg = { 0 }; srand(time(0)); //生成炸弹与数字 while (l > 0) { int ly = rand() % h, lx = rand() % w; if (grid[ly][lx] != '!') { grid[ly][lx] = '!'; for (int dy = -1; dy <= 1; ++dy) for (int dx = -1; dx <= 1; ++dx) { int y = ly + dy, x = lx + dx; if (0 <= y && 0 <= x && y < h && x < w && grid[y][x] != '!')++grid[y][x]; } --l; } } l = _l; initgraph(w * size, (h + 1) * size, EX_DBLCLKS); setbkcolor(BLACK); setbkmode(TRANSPARENT); setfont(size - 10, size - 20, _T("微软雅黑"), 0, 0, FW_BOLD, 0, 0, 0); outtextxy(0, 0, L"time:"); outtextxy(w * size / 2, 0, L"l:"); setfont(size, size - 10, _T("微软雅黑"), 0, 0, FW_BOLD, 0, 0, 0); outtextxy(0,100,L"It's ready"); //主循环 while (1) { //信息处理 { if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) { closegraph(); return 0; }//快捷esc if (MouseHit()) { msg = GetMouseMsg(); op = !started || msg.uMsg == WM_LBUTTONUP || msg.uMsg == WM_RBUTTONUP || msg.uMsg == WM_LBUTTONDBLCLK; } else msg = { 0 }; } int gx = msg.x / size, gy = msg.y / size - 1; bool lose = 0, win = 0; //鼠标交互 if (gy >= 0) { if (msg.uMsg == WM_LBUTTONUP) { queue<yx>q; started = 1; if (open[gy][gx] == 0) { if (flag[gy][gx] == 0) q.push({ gy,gx }); while (!q.empty()) { int qy = q.front().y; int qx = q.front().x; q.pop(); if (open[qy][qx])continue; open[qy][qx] = 1; if (grid[qy][qx] != '0')continue; for (int dy = -1; dy <= 1; dy++) for (int dx = -1; dx <= 1; dx++) { int ny = qy + dy; int nx = qx + dx; if (ny >= 0 && ny < h && nx >= 0 && nx < w && grid[ny][nx] != '!' && !open[ny][nx] && flag[ny][nx] == 0) q.push({ ny, nx }); } } Beep(600, 50); } op = 1; } else if (msg.uMsg == WM_RBUTTONUP) { if (open[gy][gx] == 0) { Beep(800, 30); flag_num += flag[gy][gx] ? -1 : 1; flag[gy][gx] = !flag[gy][gx]; op = 1; } } else if (msg.uMsg == WM_LBUTTONDBLCLK) { if (open[gy][gx] && grid[gy][gx] > '0') { queue<yx>q; int cnt = 0; for (int dy = -1; dy <= 1; ++dy) for (int dx = -1; dx <= 1; ++dx) { int y = gy + dy, x = gx + dx; if (0 <= y && 0 <= x && y < h && x < w) { if(flag[y][x])++cnt; if (!open[y][x] && !flag[y][x])q.push({ y,x }); } } if (cnt == grid[gy][gx] - '0') { while (!q.empty()) { int qy = q.front().y; int qx = q.front().x; q.pop(); if (open[qy][qx])continue; open[qy][qx] = 1; if (grid[qy][qx] != '0')continue; for (int dy = -1; dy <= 1; dy++) for (int dx = -1; dx <= 1; dx++) { int ny = qy + dy; int nx = qx + dx; if (ny >= 0 && ny < h && nx >= 0 && nx < w && grid[ny][nx] != '!' && !open[ny][nx] && flag[ny][nx] == 0) q.push({ ny, nx }); } } Beep(600, 50); op = 1; } } } } //绘制界面 { setcolor(BLACK); setfillcolor(BLACK); if (op) { win = 1; op = 0; for (int i = 0; i < h; ++i) for (int j = 0; j < w; ++j) { if (!open[j] && grid[j] != '!')win = 0; if (open[j]) { setcolor(0x2F2F2F); setfillcolor(0x4F4F4F); fillrectangle(j * size, (i + 1) * size, (j + 1) * size, (i + 2) * size); switch (grid[j]) { case '1': { setcolor(0xFF0000); break; } case '2': { setcolor(0x008000); break; } case '3': { setcolor(0x0000FF); break; } case '4': { setcolor(0x800000); break; } case '5': { setcolor(0x000080); break; } case '6': { setcolor(0x808000); break; } case '7': { setcolor(0x000000); break; } case '8': { setcolor(0x808080); break; } } if (grid[j] != '0')outtextxy(j * size + 5, (i + 1) * size, grid[j]); if (grid[j] == '!') { lose = 1; win = 0; } } else { setfillcolor(0xCFCFCF); setcolor(0x8F8F8F); fillrectangle(j * size, (i + 1) * size, (j + 1) * size, (i + 2) * size); if (flag[j]) { setfillcolor(RED); fillrectangle(j* size + f_size, (i + 1)* size + f_size, (j + 1)* size - f_size, (i + 2)* size - f_size); } } } } if (!started) win = 0; //打印时间,地雷数 { setfont(size - 10, size - 20, _T("微软雅黑"), 0, 0, FW_BOLD, 0, 0, 0); setbkmode(OPAQUE); setcolor(0x8F8F8F); TCHAR buf[16]; if (started && start == 0)start = time(0); _itot_s(started ? time(0) - start : 0, buf, 10); LPCTSTR str = buf; outtextxy(55, 0, str); _itot_s(l - flag_num, buf, 10); _tcscat_s(buf, _T(" ")); str = buf; outtextxy(w * size / 2 + 20, 0, str); setbkmode(TRANSPARENT); setfont(size, size - 10, _T("微软雅黑"), 0, 0, FW_BOLD, 0, 0, 0); } } //输赢 { if (lose) { setfont(50, 50, _T("微软雅黑"), 0, 0, FW_BOLD, 0, 0, 0); Beep(150, 200); outtext(L"You lose"); while (1) { if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) { closegraph(); return 0; }//快捷esc Sleep(20); } } if (win) { setfont(50, 50, _T("微软雅黑"), 0, 0, FW_BOLD, 0, 0, 0); outtext(L"You win"); while (1) { if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) { closegraph(); return 0; }//快捷esc Sleep(20); } } } Sleep(10); } } |
24.93 KB, 下载次数: 104
沪公网安备31011502402448© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed