C++用类实现扫雷随机产生 8*8 的雷分布图

完成一个控制台扫雷游戏。每个网格相邻区域只包含同一行和同一列紧邻的 4 个网格。
规则:
(1)随机产生 8*8 的雷分布图;
(2)用户“y”表示游戏,“q”退出游戏;
(3)让用户输入行列号,用键盘“m”标雷,“k”打开;
(4)打开区域为雷或者全部区域被翻开,则 game over。

按如下 CGame 类的定义完成代码。
class CGame


{
public:
CGame(); //初始化
virtual ~CGame(); 
void Print(); //打印当前图
bool DoStep(); 
void FlgMine(int x,int y); //标记雷
void Open(int x,int y); //打开该结点
bool Judge(); //判断是否结束
void Run(); //游戏运行
}

参考如下链接:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROWS ROW + 2
//设置11*11的格子防止数组越界。
#define COLS COL + 2
#define ROW 9
#define COL 9
//以下是对函数的声明
void InitMine(char mine[ROWS][COLS], int row, int col, char set);
void SetMine(char mine[ROWS][COLS], int row, int col);
void DisplayMine(char show[ROWS][COLS], int row, int col);
int CountMine(char mine[ROWS][COLS], int x, int y);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//设置雷的个数
#define minecount 10
 
#define _CRT_SECURE_NO_WARNINGS
//对9*9雷区遍历查*的数量和minecount进行比较。
int is_win(char show[ROWS][COLS], int row, int col)
{
    int i = 0;
    int j = 0;
    int c = 0;
    for (i = 1; i <= row; i++)
    {
        for (j = 1; j <= col; j++)
        {
            if ('*' == show[i][j])
            {
                c++;
            }
        }
    }
    return c;
}
//用递归,进行实现一片展开的功能
void SpreadMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
    //调用CountMine函数进行查找周围八个位置雷的个数。
    int count = CountMine(mine, x, y);
    if (0 == count)
    {
        show[x][y] = ' ';
        if (show[x][y + 1] == '*')
            SpreadMine(mine, show, x, y + 1);
        if (show[x][y - 1] == '*')
            SpreadMine(mine, show, x, y - 1);
        if (show[x + 1][y] == '*')
            SpreadMine(mine, show, x + 1, y);
        if (show[x + 1][y - 1] == '*')
            SpreadMine(mine, show, x + 1, y - 1);
        if (show[x + 1][y + 1] == '*')
            SpreadMine(mine, show, x + 1, y + 1);
        if (show[x - 1][y] == '*')
            SpreadMine(mine, show, x - 1, y);
        if (show[x - 1][y + 1] == '*')
            SpreadMine(mine, show, x - 1, y + 1);
        if (show[x - 1][y - 1] == '*')
            SpreadMine(mine, show, x - 1, y - 1);
    }
    else
    {
        //如果该位置是雷,则将雷的个数显示在此位置
        show[x][y] = count + '0';
        //由于‘0’的的ASCII码值为48,‘1’的ASCII码值是49.
        // 所以
        //1 + '0' = '1'
        //2 + '0' = '2'
    }
}
//查找非雷位置周围八个位置有多少雷
int CountMine(char mine[ROWS][COLS], int x, int y)
{
    return  (mine[x - 1][y + 1] + mine[x][y + 1]
        + mine[x + 1][y + 1] + mine[x - 1][y]
        + mine[x + 1][y] + mine[x - 1][y - 1]
        + mine[x][y - 1] + mine[x + 1][y - 1] - 8 * '0');
}
//扫雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int x = 0;
    int y = 0;
    int c = row * col - minecount;
    while (1)
    {
        printf("请输入坐标(x,y):");
        scanf("%d%d", &x, &y);
        //将输入的坐标限制在9*9的雷区
        if (x <= row && x >= 1 && y <= col && y >= 1)
        {
            if (mine[x][y] == '0')
            {
                SpreadMine(mine, show, x, y);
                system("cls");
                DisplayMine(show, ROW, COL);
                if (is_win(show, ROW, COL) == minecount)
                {
                    printf("恭喜你赢了!\n");
                    DisplayMine(mine, ROW, COL);
                    break;
                }
            }
            else
            {
                printf("很遗憾你被炸死了~\n");
                DisplayMine(mine, ROW, COL);
                break;
            }
        }
        else
        {
            printf("输入坐标越界,请重新输入:");
        }
    }
}
//初始化棋盘,一个函数,两次调用。
void InitMine(char mine[ROWS][COLS], int row, int col, char set)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            mine[i][j] = set;
        }
    }
}
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{
    int c = 0;
    while (c != minecount)
    {
        int x = rand() % row + 1;
        //用rand()函数对9求余得到0~9这十个数,再加一就得到1~10.
        int y = rand() % col + 1;
        if (mine[x][y] == '0')
        {
            //如果此位置为‘0’,即非雷
            //则设置为‘1’,即雷
            mine[x][y] = '1';
            c++;
        }
    }
}
//运用双重循环打印9*9的B雷区
void DisplayMine(char show[ROWS][COLS], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i <= row; i++)
    {
        printf("%d ", i);
        for (j = 1; j <= col; j++)
        {
            if (0 == i)
            {
                printf("%d ", j);
            }
            else
            {
                printf("%c ", show[i][j]);
            }
        }
        printf("\n");
    }
}
#define _CRT_SECURE_NO_WARNINGS
game()
{
    system("cls");//对画面进行清屏,使页面简洁。
    char mine[ROWS][COLS] = { 0 };//创建11*11数组
    char show[ROWS][COLS] = { 0 };
    //第一次传mine数组名
    InitMine(mine, ROWS, COLS, '0');
    //第二次传show数组名
    InitMine(show, ROWS, COLS, '*');
    //在A雷盘布置雷,所以需要传mine数组名
    SetMine(mine, ROW, COL);
    //用B盘进行展示雷的信息和结果
    DisplayMine(show, ROW, COL);
    //进行排雷
    FindMine(mine, show, ROW, COL);
}
menu()
{
    printf("┏━━━━━━┓━━━━━━━━━━━━━━━━━━━━┓━━━━━━━━━━━┓\n");
    printf("┣━━━━━━┫━━━━━━1.PLAY━━━━━━━━┫━━━━━━━━━━━┫\n");
    printf("┣━━━━━━┫━━━━━━1.EXIT━━━━━━━━┫━━━━━━━━━━━┫\n");
    printf("┗━━━━━━┛━━━━━━━━━━━━━━━━━━━━┛━━━━━━━━━━━┛\n");
}
test()
{
    //用rand()函数之前需要先用srand函数。
    srand((unsigned int)time(NULL));
    int n = 0;
    //游戏进去之后需要先有个菜单所以用上do语句
    do
    {
        //打印菜单
        menu();
        scanf("%d", &n);
        switch (n)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("请重新选择\n");
            break;
        }
    } while (n);
}
//程序的入口
int main()
{
    test();
    return 0;
}


C++实现只需对函数进行封装即可实现,逻辑应该不算太难,不过二者是两种模式,有一点转换的小困难,但你可以添加C++的逻辑进去

C比C++简单,直接改就行