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

原文地址:https://www.cnblogs.com/mazhuang/p/1641658.html