千家信息网

Easyx如何实现扫雷游戏

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,今天给大家介绍一下Easyx如何实现扫雷游戏。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。代码:#include#in
千家信息网最后更新 2025年01月23日Easyx如何实现扫雷游戏

今天给大家介绍一下Easyx如何实现扫雷游戏。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。

代码:

#include#include#include#include #include#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=0&&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 赢了返回 1int 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;}

以上就是Easyx如何实现扫雷游戏的全部内容了,更多与Easyx如何实现扫雷游戏相关的内容可以搜索之前的文章或者浏览下面的文章进行学习哈!相信小编会给大家增添更多知识,希望大家能够支持一下!

0