hiuhuy 2023-03-17 20:05 采纳率: 50%
浏览 125
已结题

c语言 以及easyX制作扫雷 点到雷时让所有雷出现

当点击到雷时所有雷出现
以及点击到雷时判断失败的两个函数无法同时出现。点击到雷后, 出现了所有雷,但判断失败的窗口不会出现,使用鼠标在雷的图片上滑动后才能让提示窗口出现,想问问原因,以及如何解决

img

img

img

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<graphics.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define size 50
#define N 7
static int lei = 0;
int cishu = 1;
double start, finish;
int flag;//判断输赢的标志
int row, col;
int map[N][N];
//定义图片数组保存图片
IMAGE img[12];
//找到九宫格内雷的数目
void game()
{
    for (int i = 0;i < N;i++) //问题5:不初始化,导致无法复位,使得绘制时发生错误
    {
        for (int j = 0;j < N;j++)
        {
            map[i][j] = 0;

        }


    }


    srand((unsigned)time(NULL));//利用time函数得到不同的随机数
    for (int i = 0;i < N;i++)
    {
        row = rand() % N;//限制得到的随机数在map数组下标内
        col = rand() % N;
        if (map[row][col] == 9)//防止得到的随机数相同导致雷的的数目减少
            i--;
        map[row][col] = 9;

        //printf("%d %d\n", row, col);

    };



    int m, n;


    for (int i = 0;i < N;i++)
    {
        for (int j = 0;j < N;j++)
        {
            if (map[i][j] == 0)
            {
                for (m = i - 1;m <= i + 1;m++)     //对九宫格外圈进行遍历
                {
                    for (n = j - 1;n <= j + 1;n++)
                    {
                        if ((n >= 0 && n <= N - 1 && m >= 0 && m <= N - 1) && map[m][n] == 9)//防止越界
                            map[i][j] += 1;
                    }
                }
            }



        }

    }
    //加载图片
    for (int i = 0;i < 12;i++)
    {
        char file[50] = "";
        sprintf(file, "./image/%d.jpg", i);
        loadimage(&img[i], file, size, size);
    }
    //加密格子为鼠标点击做铺垫
    for (int i = 0;i < N;i++)//加密错误 ,导致越界,使得空格消失
    {
        for (int j = 0;j < N;j++)
        {
            map[i][j] += 20;
        }

    }
}
//打开空格
void unfold(int row, int col) {
    int m, n;
    if (map[row][col] == 0)
    {
        for (m = row - 1;m <= row + 1;m++)     //对九宫格外圈进行遍历
        {
            for (n = col - 1;n <= col + 1;n++)
            {
                if ((n >= 0 && n < N && m >= 0 && m < N) && (map[m][n] == 20 ||
                    map[m][n] != 29) && map[m][n] >= 8) {
                    map[m][n] -= 20;
                    flag++;
                    unfold(m, n);//利用递归展开除了雷的格子
                }
            }
        }
    }
}

//绘制界面
void GameDraw()
{
    cleardevice();//清屏处理
    for (int i = 0;i < N;i++)
    {
        for (int j = 0;j < N;j++)
        {
            if (map[i][j] == 9)
            {
                putimage(j * size, i * size, &img[9]);//绘制雷
            }
            else if (map[i][j] >= 0 && map[i][j] <= 8)
            {
                putimage(j * size, i * size, &img[map[i][j]]);//绘制数字
            }
            else if (map[i][j] >= 20 && map[i][j] <= 29)
            {
                putimage(j * size, i * size, &img[10]);//进行遮挡
            }
            else if (map[i][j] > 34) {
                putimage(j * size, i * size, &img[11]);//右击添加旗帜执行
            }
        }

    }

}
//鼠标操作

int  MouseControl()
{
    if (MouseHit())//判断有无鼠标消息 
    {
        MOUSEMSG msg = GetMouseMsg();//鼠标所在的x,y坐标。
        int row = msg.y / size;
        int col = msg.x / size;
        switch (msg.uMsg)
        {
        case WM_LBUTTONDOWN:

            if (map[row][col] > 8) {


                map[row][col] -= 20;
                flag++;
                unfold(row, col);
                //Sleep(1000);
            }

            break;
        case WM_RBUTTONDOWN:map[row][col] += 20;
            break;

        }
        return map[row][col];
    }
}
int  MouseControl2()
{


    if (MouseHit())//判断有无鼠标消息 
    {
        MOUSEMSG msg = GetMouseMsg();//鼠标所在的x,y坐标。
        int row = msg.y / size;
        int col = msg.x / size;
        switch (msg.uMsg)
        {
        case WM_LBUTTONDOWN:

            if (map[row][col] > 8) {


                map[row][col] -= 20;
                flag++;
                unfold(row, col);
                //Sleep(1000);
            }

            break;
        case WM_RBUTTONDOWN:map[row][col] += 20;
            break;

        }
        return map[row][col];
    }

}


//让雷出现
void Bomb()
{
    if (MouseControl() == 9)
    {
        for (int i = 0;i < N;i++) 
        {
            for (int j = 0;j < N;j++)
            {
                if (map[i][j] == 29) {
                    map[i][j] -= 20;
                    
                    lei++;
                    
                }

            }


        }

    }

    
}
//判断输赢


void judge()
{
    static int newtime = 0, oldtime = 0, time = 0;
    int x = 0;
    
    if (MouseControl() == 9) {

        printf("%d", lei);
        if (lei == N-1)//当所有雷都出现时判断失败
        {
            lei = 0;

            
            
            int isok = MessageBox(GetHWnd(), "You lose,next game?", "提示", MB_OKCANCEL);
            if (IDOK == isok)
            {
                game();//重新进行炸弹的摆放

            }
            else
            {
                exit(123);
            }
        }
    }
    for (int i = 0;i < N;i++)
    {
        for (int j = 0;j < N;j++)//多次标记旗帜会导致判断胜负出现问题,所以更换了胜利判断条件
        {

            if (map[i][j] == 49) {
                x++;
            }
        }

    }

    if (x == N)
    {
        finish = clock();

        printf("%d", (int)(finish - start) / CLOCKS_PER_SEC);
        int isok = MessageBox(GetHWnd(), "You win", "提示", MB_OKCANCEL);
        //
        if (IDOK == isok)
        {
            game();


            flag = 0;//复位,开始第二局
        }
        else
        {
            exit(123);
        }
        x = 0;
    }

}



int main()
{
    cishu = 1;
    initgraph(N * size, N * size, SHOWCONSOLE);
    game();
    //错误3:将扫描放入循环中导致重复加密使得旗帜图片覆盖无法消除
    BeginBatchDraw();//解决卡顿利用缓冲区
    start = clock();
    while (1)
    {

        //show(map);


        GameDraw();
        FlushBatchDraw();
        cishu++;

        Bomb();
        judge();

    }
    EndBatchDraw();
    getchar();
    return 0;
}

  • 写回答

3条回答 默认 最新

  • dahe0825 2023-03-17 20:14
    关注

    可以把代码用文本贴出来吗

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月18日
  • 修改了问题 3月17日
  • 创建了问题 3月17日

悬赏问题

  • ¥15 火车票关联12306问题
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES
  • ¥15 结构功能耦合指标计算
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表