文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Easyx如何实现扫雷游戏

2023-06-26 05:54

关注

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

Easyx如何实现扫雷游戏

代码:

#include<stdio.h>#include<stdlib.h>#include<time.h>#include<easyx.h> #include<mmsystem.h>#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);    //播放开始音乐    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<ROW&&c>=0&&c<COL)            //没越界                    && map[r][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如何实现扫雷游戏相关的内容可以搜索编程网之前的文章或者浏览下面的文章进行学习哈!相信小编会给大家增添更多知识,希望大家能够支持一下编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯