C++实现控制台版扫雷程序

本文实例为大家分享了C++实现控制台版扫雷程序的具体代码,供大家参考,具体内容如下

测试平台: WIN7

工具: VC6.0 , VS2008都能编译得过。

花了两天时间写的,里面涉及的算法大都是自己想的,所以可能有些BUG。

#include 
#include 
#include 
using namespace std;
 
#pragma comment (linker,"/subsystem:console")
 
#define BLACK 0        //空白
#define MINE 100    //地雷
#define NOSWEEP 0    //未扫过
#define SWEEP 1        //扫雷
#define FLAG 2        //标记
 
class WinMine
{
public:
 
    WinMine(int iRow, int iColumn);
    ~WinMine();
public:
    void InitMine(int iMineMax);
    void SetColor();
    void StatisticsMine();
    void Map();
    bool OpenWhites(int x, int y, int status);
    void GameStart(int iMineMax);
    void GameOver();
    bool GoodOver();
private:
    int **m_ppMine;
    int **m_ppSweep;
    bool m_bMineflag;
    bool m_bSweepflag;
    int m_row;
    int m_column;
    int m_minenum;
};
 
int main(void)
{
    system("color 0d");
    while (true)
    {
        int level;
        WinMine *Mine;
        cout << "请输入游戏等级:" <> level;
        if (level == 1)
        {
            Mine = new WinMine(9,9);
            Mine->GameStart(10);
        }
        else if (level == 2)
        {
            Mine = new WinMine(16,16);
            Mine->GameStart(40);
        }
        else if (level == 3)
        {
            Mine = new WinMine(16,30);
            Mine->GameStart(70);
        }
        else if (level == 4)
        {
            return 0;
        }
        else 
        {
            cout << "输入错误!" < (m_row - 1) || column < 0 || column > (m_column - 1))
        return true;
    if (status == SWEEP &&  m_ppMine[row][column] == MINE)
    {
        return false;
    }
 
    if (status == FLAG)
    {
        m_ppSweep[row][column] = FLAG;
        return true;
    }
 
    if (m_ppSweep[row][column] == NOSWEEP && m_ppMine[row][column] != MINE)
    {
 
        if (m_ppMine[row][column] > 0)
        {
            m_ppSweep[row][column] = SWEEP; 
            return true;
        }
        else
        {
            m_ppSweep[row][column] = SWEEP;
            OpenWhites(row-1, column, status);
            OpenWhites(row-1, column-1, status);
            OpenWhites(row-1, column+1, status);
            OpenWhites(row, column-1, status);
            OpenWhites(row, column+1, status);
            OpenWhites(row+1, column, status);
            OpenWhites(row+1, column-1, status);
            OpenWhites(row+1, column+1, status);
        }
    }
    return true;
}
 
//地图
void WinMine::Map()
{
    SetColor();
    int i, j;
    for ( i = 0; i < m_row; i++)
    {
        for (j = 0; j < m_column; j++)
        {
            if (m_ppSweep[i][j] == SWEEP)
            {
                if (m_ppMine[i][j] == 0)
                {
                    cout << "□";
                }
                else if (m_ppMine[i][j] == 1)
                {
                    cout << "①";
                }
                else if (m_ppMine[i][j] == 2)
                {
                    cout << "②";
                }
                else if (m_ppMine[i][j] == 3)
                {
                    cout << "③";
                }
                else if (m_ppMine[i][j] == 4)
                {
                    cout << "④";
                }
                else if (m_ppMine[i][j] == 5)
                {
                    cout << "⑤";
                }
                else if (m_ppMine[i][j] == 6)
                {
                    cout << "⑥";
                }
                else if (m_ppMine[i][j] == 7)
                {
                    cout << "⑦";
                }
                else if (m_ppMine[i][j] == 8)
                {
                    cout << "⑧";
                }    
 
            }
            else if (m_ppSweep[i][j] == FLAG)
            {
                cout << "⊙";
            }
            else
                cout << "▇";
        }
        cout << endl;
    }
}
 
//游戏结束
void WinMine::GameOver()
{
 
    int i, j;
    for ( i = 0; i < m_row; i++)
    {
        for (j = 0; j < m_column; j++)
        {
            if (m_ppMine[i][j] == MINE)
                cout << "★";
            else 
                cout << "□";
            
        }
        cout << endl;
    }
}
//检查是否雷标记正确。
bool WinMine::GoodOver()
{
    int i, j;
    int num = 0;
    for (i = 0; i < m_row; i++)
    {
        for (j = 0; j < m_column; j++)
        {
            if (m_ppSweep[i][j] == FLAG && m_ppMine[i][j] == MINE)
                num++;
 
        }
    }
    if (num == m_minenum)
        return true;
    else
        return false;
}
 
//开始游戏
void WinMine::GameStart(int iMineMax)
{
    int x, y;
    int flag;
begin:
    memset(m_ppSweep[0], 0, m_row * m_column * sizeof(int));
    memset(m_ppMine[0], 0, m_row * m_column * sizeof(int));
    InitMine(iMineMax);
    StatisticsMine();
 
    while (true)
    {
        system("cls");
 
        Map();
        cout << "请输入要扫的区域的坐标:" <>x;
        cout << "请输入横坐标:";cin>>y;
        if (x <= 0 || x > m_row || y <= 0 || y > m_column)
        {
            cout <<"输入错误请重新输入" <> flag;
        if ( false == OpenWhites(x-1, y-1, flag) )
        {
            int i;
            system("cls");
            GameOver();
            cout << "游戏结束!" <> i;
            if (i == 1)
                goto begin;
            else 
                goto end;
        }
        else
        {
            if (GoodOver() == true)
            {
                int i;
                cout << "扫雷成功!" <> i;
                if (i == 1)
                    goto begin;
                else 
                    goto end;
            }
        }
    }
end:
    return;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

你可能感兴趣的:(C++实现控制台版扫雷程序)