iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Easyx如何实现扫雷游戏
  • 889
分享到

Easyx如何实现扫雷游戏

2023-06-26 05:06:50 889人浏览 八月长安
摘要

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

今天给大家介绍一下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如何实现扫雷游戏相关的内容可以搜索编程网之前的文章或者浏览下面的文章进行学习哈!相信小编会给大家增添更多知识,希望大家能够支持一下编程网!

--结束END--

本文标题: Easyx如何实现扫雷游戏

本文链接: https://www.lsjlt.com/news/307199.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c++中int和double有什么区别
    int 和 double 是 c++ 的数据类型,用于表示整数和浮点数。它们的关键区别在于:1. 范围:int 为整数,double 为浮点数且范围更大;2. 存储大小:int 占 4 ...
    99+
    2024-05-14
    c++ 隐式转换
  • C++ 多线程程序测试的挑战和策略
    多线程程序测试面临不可重复性、并发错误、死锁和缺乏可视性等挑战。策略包括:单元测试:针对每个线程编写单元测试,验证线程行为。多线程模拟:使用模拟框架在控制线程调度的情况下测试程序。数据竞...
    99+
    2024-05-14
    c++ 多线程
  • c++中深拷贝和浅拷贝的应用时间
    浅拷贝复制对象指针或引用,仅适用于不含动态分配内存或简单数据结构的对象;深拷贝复制实际数据,包括动态分配内存,适用于包含动态分配内存或复杂数据结构的对象。 浅拷贝和深拷贝的应用时间 在...
    99+
    2024-05-14
    c++
  • 探索用于 C++ 服务器架构的高级数据结构
    在 c++++ 服务器架构中,选择适当的高级数据结构至关重要。哈希表用于快速数据查找,树用于表示数据层次结构,图用于表示对象之间的关系。这些数据结构在实践中有着广泛的应用,例如缓存系统、...
    99+
    2024-05-14
    c++ 数据结构 社交网络 键值对
  • fixed在c++中的作用
    fixed 关键字在 c++ 中用于将浮点数存储为固定小数,提供更高精度,尤其适用于需要高精度的金融计算。fixed 将浮点数表示为具有固定小数位数的小数,默认情况下使用十进制表示法,小...
    99+
    2024-05-14
    c++
  • insert在c++中怎么用
    insert() 函数在 c++ 中用于在容器(如 vector、set)中插入元素,提供了一种动态调整容器大小并添加新元素的方法。它需要两个参数:要插入元素的位置 (pos) 和要插入...
    99+
    2024-05-14
    c++ 标准库
  • 如何使用 Golang 构建 RESTful API 并处理 JSON 响应?
    如何使用 golang 构建和处理 json 响应的 restful api步骤:创建 golang 项目并安装 gorilla mux。定义路由并处理 http 请求。安装 json ...
    99+
    2024-05-14
    golang git
  • c++中int和long的区别
    int 和 long 都是 c++ 中的整型类型,主要区别在于范围和存储空间:范围:int 为 32 位整数,范围为 [-2^31, 2^31-1];long 为 64 位整数,范围为 ...
    99+
    2024-05-14
    c++ 数据丢失
  • c++中int a(n)和int a[n]的区别
    int a(n)声明一个不可变的整型变量,而int a[n]声明一个可修改元素的整型数组,用于存储和处理数据序列或集合。 int a(n) 和 int a[n] 在 C++ 中的区别 ...
    99+
    2024-05-14
    c++
  • C++ 多线程编程中调试和故障排除的技术
    c++++ 多线程编程的调试技巧包括:使用数据竞争分析器检测读写冲突,并使用同步机制(如互斥锁)解决。使用线程调试工具检测死锁,并通过避免嵌套锁和使用死锁检测机制来解决。使用数据竞争分析...
    99+
    2024-05-14
    c++ 多线程 故障排除 同步机制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作