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

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

  • 写回答

4条回答 默认 最新

  • 关注

    答题思路如下:

    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    
    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(); //游戏运行
    private:
        int grid[8][8]; //生成雷图,0表示无雷,1表示有雷
        int state[8][8]; //状态,0表示未翻开,1表示标雷,2表示已翻开
        bool mflag; //是否触雷
        bool bover; //游戏是否结束
    };
    
    CGame::CGame()
    {
        int i,j;
        mflag = false;
        bover = false;
        for (i=0;i<8;i++)
        {
            for (j=0;j<8;j++)
            {
                grid[i][j] = rand()%2; //生成0-1的随机数
                state[i][j] = 0;
            }
        }
    }
    void CGame::Print()
    {
        int i,j;
        system("cls");
        for (i=0;i<8;i++)
        {
            for (j=0;j<8;j++)
            {
                if (state[i][j] == 0)
                    cout << "□";
                else if(state[i][j] == 1)
                    cout << "m";
                else
                    cout << grid[i][j]<<" "; //打开
            }
            cout << endl;
        }
    }
    //
    bool CGame::DoStep()
    {
        int x,y,op;
        cout << "请输入行列数:";
        cin >>x>>y;
        cout << "请选择:1.标雷  2.翻开";
        
        while(1)
        {
            cin >> op;
            if(op==1)
            {
                FlgMine(x,y);
                break;
            }
            else
            {
                Open(x,y);
                if(mflag) return false;
                break;
            }
        }
        fflush(stdin);
        cout << "是否继续(按y继续/按q退出):";
        char ch = getchar();
        getchar();
        if(ch == 'Y' || ch == 'y')
            return true;
        
        return false;
    }
    //标记雷
    void CGame::FlgMine(int x,int y)
    {
        state[x-1][y-1] = 1; //标记雷
        Print(); //刷新雷图
    }
    //打开该结点
    void CGame::Open(int x,int y)
    {
        state[x-1][y-1] = 2;//翻开
        Print();//刷新雷图
        if(grid[x-1][y-1] == 1)//是雷
        {
            mflag = true; //结束游戏
            cout << "翻到雷了";
        }
    }
    //判断是否结束
    bool CGame::Judge() 
    {
        if(mflag) return true;
        //判断是否都已经翻出
        for (int i=0;i<8;i++)
        {
            for (int j=0;j<8;j++)
            {
                if (state[i] == 0)
                {
                    return false;
                }
            }
        }
        return true;
    }
    //游戏运行
    void CGame::Run()
    {
        Print(); 
        while(!bover)
        {
            if( DoStep() )
                Judge();
            else
                break;
        }
    }
    CGame::~CGame(){}
    int main()
    {
        srand((unsigned int)time(NULL));
        CGame game;
        game.Run();
        cout << "游戏运行结束"<<endl;
        system("pause");
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月1日
  • 已采纳回答 12月29日
  • 创建了问题 12月28日

悬赏问题

  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目