扫雷

作者: 社交帐号直接注册 | 来源:发表于2018-01-16 13:30 被阅读0次
#include <graphics.h>//图形库头文件
#include <time.h>//时间头文件
using namespace std;

const int N = 50;//正方形的边长
const int M = 10;//单边各格子数目
int win=0;

//初始化游戏
//绘图环境(窗口)
//加载图片

void InitGame();//初始化游戏
void DrawMap(int map[][M + 2], IMAGE img[]);//加载图片
int MouseMessage(int map[][M + 2]);//鼠标消息
void swap(int map[][M + 2], int x, int y);//点到0以后,翻开一片

HWND hWnd;//窗口句柄

int main()
{
    InitGame();//初始化游戏
    while (1)
    {
        if (MessageBox(hWnd, L"再玩一局吗?", L"提示", MB_YESNO) == IDNO)//再玩一局
        {
            break;
        }
    }

    system("pause");
    return 0;
}

void InitGame()//初始化游戏
{
    initgraph(500, 500, NULL);//创建窗口
    int map[M + 2][M + 2] = { 0 };
    int m, n, i, j;
    srand((unsigned)time(NULL));//随机种子

    for (n = 0; n < M;)//埋雷,循环多少次就生成多少个雷
    {
        i = rand() % M + 1;//随机数的范围1-M
        j = rand() % M + 1;
        if (map[i][j] == 0)//埋雷
        {
            map[i][j] = -1;//-1代表雷
            n++;//埋雷的数目,不浪费生成雷的个数
        }
    }

    for (i = 1; i <= M; i++)//埋数字
    {
        for (j = 1; j <= M; j++)//遍历二维数组
        {
            if (map[i][j] != -1)//判断是不是雷
            {
                for (m = i - 1; m <= i + 1; m++)//雷的周围
                {
                    for (n = j - 1; n <= j + 1; n++)//遍历雷周围的9个位置
                    {
                        if (map[i][j] == -1)//判断如果是雷
                        {
                            map[i][j]++;//个数加一
                        }
                    }
                }
            }
        }
    }

    IMAGE img[12];//图片数组类型
    loadimage(&img[0], L"0.jpg", N, N);//读取图片素材
    loadimage(&img[1], L"1.jpg", N, N);
    loadimage(&img[2], L"2.jpg", N, N);
    loadimage(&img[3], L"3.jpg", N, N);
    loadimage(&img[4], L"4.jpg", N, N);
    loadimage(&img[5], L"5.jpg", N, N);
    loadimage(&img[6], L"6.jpg", N, N);
    loadimage(&img[7], L"7.jpg", N, N);
    loadimage(&img[8], L"8.jpg", N, N);
    loadimage(&img[9], L"雷.jpg", N, N);
    loadimage(&img[10], L"地图.jpg", N, N);
    loadimage(&img[11], L"标记.jpg", N, N);
    hWnd = GetHWnd();//窗口置前
    win = 0;//重置游戏
    while (1)
    {
        DrawMap(map, img);
        if (MouseMessage(map) == 9)//点到炸弹,结束游戏
        {
            DrawMap(map,img);
            MessageBox(hWnd, L"炸弹来了", L"提示", MB_OK);
            return;
        }
        if (win == N*M - M)//赢了
        {
            DrawMap(map, img);
            MessageBox(hWnd, L"恭喜你", L"提示", MB_OK);
            return;
        }
    }
}

void DrawMap(int map[][M + 2], IMAGE img[])//加载图片
{
    for (int i = 1; i <= M; i++)
    {
        for (int j = 1; j <= M; j++)//遍历二维数组
        {
            if (map[i][j] >= 20)
            {
                putimage((i - 1)*N, (j - 1)*N, &img[11]);//标记
                continue;//退出当前循环,马上进入下一次循环
            }
            switch (map[i][j])//判断和加载数字和雷图片
            {
            case 9:
                putimage((i - 1)*N, (j - 1)*N, &img[9]);//雷图片
                break;
            case 10:
                putimage((i - 1)*N, (j - 1)*N, &img[0]);
                break;
            case 11:
                putimage((i - 1)*N, (j - 1)*N, &img[1]);
                break;
            case 12:
                putimage((i - 1)*N, (j - 1)*N, &img[2]);
                break;
            case 13:
                putimage((i - 1)*N, (j - 1)*N, &img[3]);
                break;
            case 14:
                putimage((i - 1)*N, (j - 1)*N, &img[4]);
                break;
            case 15:
                putimage((i - 1)*N, (j - 1)*N, &img[5]);
                break;
            case 16:
                putimage((i - 1)*N, (j - 1)*N, &img[6]);
                break;
            case 17:
                putimage((i - 1)*N, (j - 1)*N, &img[7]);
                break;
            case 18:
                putimage((i - 1)*N, (j - 1)*N, &img[8]);
                break;
            default:
                putimage((i - 1)*N, (j - 1)*N, &img[10]);//封面图片
                break;
            }
        }
    }
}

int MouseMessage(int map[][M + 2])//鼠标消息
{
    MOUSEMSG m;//鼠标消息结构体
    while (1)
    {
        m = GetMouseMsg();//获取一个鼠标消息
        switch (m.uMsg)//获取当前鼠标消息
        {
        case WM_LBUTTONDOWN://鼠标左键点击,m.x m.y 50-100 /50 =1
            if (map[m.x / N + 1][m.y / N + 1] > 9)//鼠标点左边转换成数组坐标,表示已经翻开
            {
                continue;
            }
            else if (map[m.x / N + 1][m.y / N + 1] == 0)//翻开为0的情况
            {
                swap(map, m.x / N + 1, m.y / N + 1);
            }
            else
            {
                map[m.x / N + 1][m.y / N + 1] += 10;//翻开为数字的情况
                win++;//翻开计数
            }
            return map[m.x / N + 1][m.y / N + 1];
            break;
        case WM_RBUTTONDOWN://鼠标右键点击,标记和取消标记
            if (map[m.x / N + 1][m.y / N + 1] < 9)
            {
                map[m.x / N + 1][m.y / N + 1] += 30;//标记
            }
            else if (map[m.x / N + 1][m.y / N + 1] > 20)
            {
                map[m.x / N + 1][m.y / N + 1] -= 30;//取消标记
            }
            else//已经翻开情况
            {
                continue;
            }
            return 0;
            break;
        }
    }
}

void swap(int map[][M + 2], int x, int y)//点到0以后,翻开一片
{
    map[x][y] = 10;
    win++;//翻开计数
    int i, j;
    for (i = x - 1; i <= x + 1; i++)
    {
        for (j = y - 1; j <= y + 1; j++)//点击点周围的点
        {
            if (i >= 1 && i <= M&&j >= 1 && j <= M)//是否越界
            {
                if (map[i][j] <= 9)//是否翻开,没有翻开
                {
                    if (map[i][j] == 0)//周围的数为0
                    {
                        swap(map, i, j);//调用自己函数
                    }
                    else
                    {
                        map[i][j] += 10;//不为0,翻开
                        win++;//翻开计数
                    }
                }
            }
        }
    }
}

相关文章

  • 小赚红包扫雷平台开发

    小赚红包扫雷系统app开发,小赚红包扫雷源码搭建,小赚社区红包扫雷,小赚扫雷系统app,提供小赚红包扫雷服务器、域...

  • 扫雷红包飞信扫雷系统模式现成开发

    扫雷红包飞信扫雷系统模式现成开发、虾聊扫雷系统app源码开发,樱桃红包扫雷系统app源码开发、博友红包扫雷系统ap...

  • Web版扫雷开发小记(3)

    前篇: web版扫雷开发小记(1)web版扫雷开发小记(2)web版扫雷开发小记(3)web版扫雷开发小记(4) ...

  • Web扫雷开发小记(1)

    目录Web扫雷开发小记(2)Web扫雷开发小记(3)Web扫雷开发小记(4) 刚好今天做阿里前端笔试问到扫雷了,那...

  • web版扫雷开发小记(4)

    目录:Web扫雷开发小记(1)Web扫雷开发小记(2)Web扫雷开发小记(3) 其实在完成上篇的功能之后,一个扫雷...

  • 飞信红包扫雷系统源码平台

    飞信红包扫雷系统app源码开发、腾信红包扫雷系统app源码、诚信红包扫雷系统app开发、提供红包扫雷系统服务器、域...

  • 虾聊社区红包扫雷接龙平台模式开发

    樱桃红包扫雷系统app源码开发、虾聊社区红包扫雷接龙平台模式开发、博友红包扫雷系统app开发、腾信红包扫雷系统ap...

  • 哇!踩到雷了

    这一段时间迷上了一个年头可能比我大的游戏--扫雷。人家追剧我在扫雷,人家游戏我在扫雷,累了,困了,扫一扫雷。真心爱...

  • 两分钟教你用C++修改"扫雷"游戏的设置,有

    C++ 6.0 修改"扫雷"游戏的设置,可以对扫雷游戏的界面进行设置,设置 黑白界面和彩色界面,可修改扫雷游戏英雄...

  • 58红包扫雷app开发

    红包扫雷游戏系统开发模式找王157-1806-7234微/电同号,红包扫雷游戏玩法、红包扫雷游戏充值/兑换、红包扫...

网友评论

      本文标题:扫雷

      本文链接:https://www.haomeiwen.com/subject/jtufoxtx.html