旅行者744 2021-12-28 15:03 采纳率: 66.7%
浏览 146
已结题

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(); //游戏运行
}
  • 写回答

3条回答 默认 最新

  • 天际的海浪 2021-12-29 03:41
    关注
    获得0.80元问题酬金

    参考如下链接:

    #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;
    }
    
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 1月5日
  • 赞助了问题酬金 12月28日
  • 创建了问题 12月28日

悬赏问题

  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真
  • ¥15 关于#c语言#的问题,请各位专家解答!