zoukankan      html  css  js  c++  java
  • 控制台扫雷程序C++源代码(Dim版V0.10)

    很久很久以前(感觉上),我们算法课上的老师就说给我们现场编个扫雷游戏看看。可过了N周后还是没见行动。郁闷了,就想自己写个出来算了,不过又还没学会编图形界面,所以只好做一个控制台的实现了。经过几个小时从无到有的思考和编程,这样一个简单版的扫雷从这里诞生。至今为止还没看到别人的相关代码,所以也许这里面的算法很烂,不过好歹是完完全全地从咱手中写出来的,小骄傲一下哈。最近还只是在考虑究竟学不学图形编程的问题,所以近期内是不会对程序做什么大的改进了,先发贴出来吧,版本V0.10嘻嘻~~以后学到了新的东西再改进改进。

    //这是Linux下的程序,移到Windows请把清屏函数由clear改为cls
    #include<iostream>
    #include<string>
    #include<iomanip>
    #include<ctime>
    #include<cmath>
    using namespace std;

    struct MnSwp
    {
    public:
    char MineNum;
    char Flag;
    char Logo;
    MnSwp();
    };

    MnSwp::MnSwp()
    {
    MineNum='0';
    Flag='N';
    Logo='#';
    }

    const int N=9;
    int X,Y;
    MnSwp Sweeping[N][N];
    int ExceptMine(int S,int T);
    void AddMineNum(int XX,int YY);
    void IfNotW(int XXX,int YYY);
    int Iter=0;

    int main()
    {
    /////////////////////Initialization And Print///////////////////////

    for(int i=0;i!=N;++i)
    {
    for(int j=0;j!=N;++j)
    {
    cout<<setw(2)<<Sweeping[i][j].Logo;
    }
    cout<<endl;
    }

    ////////////////////Random Creat the Mines And Put num around Mines///////////////////////

    int Random=0,m=0,n=0;
    srand((unsigned) time(NULL));
    for(int k=0;k!=10;++k)
    {
    Random=rand()%(N*N);
    m=Random/N;
    n=Random%N;
    if(Sweeping[m][n].Flag!='Y')
    {
    Sweeping[m][n].Flag='Y';

    AddMineNum(m-1,n-1);
    AddMineNum(m-1,n);
    AddMineNum(m-1,n+1);
    AddMineNum(m,n-1);
    AddMineNum(m,n+1);
    AddMineNum(m+1,n-1);
    AddMineNum(m+1,n);
    AddMineNum(m+1,n+1);
    }
    else --k;
    }




    //////////////////Let user Enter Coordinates//////////////////
    while(N==N)
    {
    if(Iter==(N*N-10))
    {
    cout<<"Congratulations!You succeed to debar all the Mines!"<<endl;
    return 0;
    }

    else
    {
    cout<<"Please enter the Row Number(1~"<<N<<"):";
    cin>>X;
    cout<<"Please enter the Arrange Number(1~"<<N<<"):";
    cin>>Y;

    --X;
    --Y;
    //////////////////When user Stamp on a Mine////////////////////
    if(Sweeping[X][Y].Flag=='Y')
    {
    system("clear"); //Windows下为cls
    for(int i=0;i!=N;++i)
    {
    for(int j=0;j!=N;++j)
    {
    if(Sweeping[i][j].Flag!='Y')
    cout<<setw(2)<<Sweeping[i][j].MineNum;
    else
    cout<<setw(2)<<'X';
    }
    cout<<endl;
    }
    cout<<"Your cess is Bad!!!You Stamped on a Mine!"<<endl;
    return 0;
    }
    /////////////////Not Stamp on a Mine//////////////////////
    else
    {
    system("clear"); //Windows下为cls
    ExceptMine(X,Y);
    for(int a=0;a!=N;++a)
    {
    for(int b=0;b!=N;++b)
    {
    cout<<setw(2)<<Sweeping[a][b].Logo;
    }
    cout<<endl;
    }
    }
    }
    }
    return 0;
    }


    int ExceptMine(int S,int T)
    {
    if(Sweeping[S][T].MineNum=='0')
    {
    Sweeping[S][T].Logo=Sweeping[S][T].MineNum;
    Sweeping[S][T].Flag='W';
    ++Iter;
    IfNotW(S-1,T-1);
    IfNotW(S-1,T);
    IfNotW(S-1,T+1);
    IfNotW(S,T-1);
    IfNotW(S,T+1);
    IfNotW(S+1,T-1);
    IfNotW(S+1,T);
    IfNotW(S+1,T+1);
    }

    else
    {
    Sweeping[S][T].Logo=Sweeping[S][T].MineNum;
    Sweeping[S][T].Flag='W';
    ++Iter;
    }
    return 0;
    }

    void AddMineNum(int XX,int YY)
    {
    if(XX>=0&&XX<n&&yy>=0&&YY<N)
    ++Sweeping[XX][YY].MineNum;
    }

    void IfNotW(int XXX,int YYY)
    {
    if((XXX>=0&&XXX<n&&yyy>=0&&YYY<N)&&Sweeping[XXX][YYY].Flag!='W')
    ExceptMine(XXX,YYY);
    }

  • 相关阅读:
    OAuth2.0协议封装类
    FFmpeg学习笔记
    mysql学习笔记(有待增补)
    使用cnpm国内淘宝镜像命令
    mongoDB中的聚合操作示例
    react的学习日常整理
    服务器防止访问超时的一些参数设置
    MongoDB基本语句操作
    CI框架配置多个数据库
    php前后台登录交互明文传输使用base64加密
  • 原文地址:https://www.cnblogs.com/mazhuang/p/1641658.html
Copyright © 2011-2022 走看看