#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
const int nans[8][2]={{1,0},{0,1},{-1,0},{0,-1},{1,-1},{-1,-1},{-1,1},{1,1}};//判断九宫格内是否有雷用的数组
const int awsd[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//展开用的数组
int n,l;//规格
string qp[1010][1010];//用于展示当前的情况
bool un[1010][1010]={0};//标记雷的位置
map<pair<int,int>,bool>pd;//判断是否重复
void dfs(int x,int y){
pd[make_pair(x,y)]=1;
int ans=0;//统计雷的个数
for(int i=0;i<8;i++){
int a=x+nans[i][0],b=y+nans[i][1];
if(un[a][b])ans++;
}
l--;
qp[x][y]=ans+'0';
if(ans>0)return;
for(int i=0;i<4;i++){
int p=x+awsd[i][0],q=y+awsd[i][1];
if(p<1||q<1||p>n||q>n||pd[make_pair(p,q)])continue;
dfs(p,q);
pd[make_pair(p,q)]=1;
}
return;
}
int main(){
system("color B");
int x,y;
cout<<"请输入方阵边长:";
cin>>n;
l=n*n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
qp[i][j]="■";
srand((unsigned)time(NULL));//随机数种子
for(int i=1;i<=l/6;i++){
int a=rand()%n+1,b=rand()%n+1;//随机生成雷的位置
if(!un[a][b])un[a][b]=1;
else i--;
}
while(true){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
system("color B");
cout<<qp[i][j];
if(qp[i][j]!="■")cout<<' ';
}
cout<<endl;
}//输出处理后的状态
cout<<l<<endl;//输出没有揭开的方块个数
if(l<=n*n/6)break;
cout<<"请输入你要排查的坐标:";
cin>>y>>x;
system("cls");//清屏
if(pd[make_pair(x,y)])continue;
if(un[x][y]){
cout<<"Game Over!";
return 0;
}
dfs(x,y);
}
cout<<"Perfect!!!";
return 0;
}
然后就是加了个map pair判断坐标重复,加了一些界面优化现在交互做的不是很好,见谅!!!