• 控制台扫雷程序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);
    }

  • 相关阅读:
    NET设计模式 第三部分 结构型模式(7):适配器模式(Adapter Pattern)
    NET设计模式 第二部分 创建型模式(6):创建型模式专题总结(Creational Pattern)
    NET设计模式 第二部分 创建型模式(5):原型模式(Prototype Pattern)
    NET设计模式 第二部分 创建型模式(4):工厂方法模式(Factory Method)
    .NET设计模式 第二部分 创建型模式(3)—建造者模式(Builder Pattern)
    .NET设计模式 第二部分 创建型模式(2)—抽象工厂模式(Abstract Factory)
    .NET设计模式 第二部分 创建型模式(1)—:单件模式(Singleton Pattern)
    .NET设计模式系列文章
    转:Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
    转:Python字典与集合操作总结
  • 原文地址:https://www.cnblogs.com/mazhuang/p/1641658.html
Copyright © 2020-2023  润新知