2026-4-6 13:23:52 [显示全部楼层]
231浏览
查看: 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);
        }
}

扫雷.zip

24.93 KB, 下载次数: 104

材1  见习技师
 楼主|

发表于 2026-4-6 13:25:04

怎么显示错误了???
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail