ok,感谢xiaozhao_的提醒,把随机修好了
#include<bits/stdc++.h>
using namespace std;
int Map[101][101],cover[101][101];
int n,m,x,y,a,b,cz,lose=0,cnt,cnt2;
void safe(int a,int b) {
cover[a-1][b-1]=0;
cover[a-1][b]=0;
cover[a-1][b+1]=0;
cover[a][b-1]=0;
cover[a][b+1]=0;
cover[a+1][b-1]=0;
cover[a+1][b]=0;
cover[a+1][b+1]=0;
// if(Map[a-1][b-1]==0)safe(a-1,b-1);
// if(Map[a-1][b]==0)safe(a-1,b);
// if(Map[a-1][b+1]==0)safe(a-1,b+1);
// if(Map[a][b-1]==0)safe(a,b-1);
// if(Map[a][b-1]==0)safe(a,b+1);
// if(Map[a+1][b-1]==0)safe(a+1,b-1);
// if(Map[a+1][b]==0)safe(a+1,b);
// if(Map[a+1][b+1]==0)safe(a+1,b+1);
}
int main() {
cout<<"请输入棋盘的长宽和雷的数量(长宽均小于100)"<<endl;
cin>>n>>m>>x;
cnt=n*m;
if(m*n<=x) {
cout<<"Error:雷数大于等于总方格数"<<endl;
return 0;
}
for(int i=0; i<=n; i++) {
for(int j=0; j<=m; j++) {
Map[i][j]=0;
cover[i][j]=1;
}
}
cout<<"请问你要手动布雷还是自动布雷?(输入1或2)"<<endl;
cin>>y;
if(y==1){
for(int i=0; i<x; i++) {
cout<<"请输入第"<<i+1<<"颗雷的位置(行/列)"<<endl;
cin>>a>>b;
if(Map[a][b]==-1) {
cout<<"Error:此处已有雷,请换个位置"<<endl;
i--;
}
Map[a][b]=-1;
}
}
else{
srand((unsigned)time(NULL));
for(int i=0; i<x; i++) {
a=rand()%n+1;
b=rand()%m+1;
if(Map[a][b]==-1) {
i--;
}
else Map[a][b]=-1;
}
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(Map[i][j]!=-1) {
if(Map[i-1][j-1]==-1)Map[i][j]++;
if(Map[i-1][j]==-1)Map[i][j]++;
if(Map[i-1][j+1]==-1)Map[i][j]++;
if(Map[i][j-1]==-1)Map[i][j]++;
if(Map[i][j+1]==-1)Map[i][j]++;
if(Map[i+1][j-1]==-1)Map[i][j]++;
if(Map[i+1][j]==-1)Map[i][j]++;
if(Map[i+1][j+1]==-1)Map[i][j]++;
}
}
}
cout<<" ";
for(int i=1; i<=n; i++) {
cout<<i;
if(i<10)cout<<" ";
}
cout<<endl<<endl;
for(int i=1; i<=n; i++) {
cout<<i;
if(i<10)cout<<" ";
else cout<<" ";
for(int j=1; j<=m; j++) {
cout<<"? ";
}
cout<<endl;
}
while(lose==0) {
cout<<"请输入操作(输入数字):"<<endl<<"1.翻看"<<endl<<"2.标记(标记为#)"<<endl<<"3.撤销标记"<<endl<<"输入其它数字均作为3处理"<<endl;
cin>>cz;
if(cz==1) {
cout<<"请输入要翻看的格子(行/列)"<<endl;
cin>>a>>b;
if(cover[a][b]==0)cout<<"此处已翻开"<<endl;
else if(cover[a][b]==2)cout<<"此处被标记"<<endl;
else{
cover[a][b]=0;
if(Map[a][b]==0)safe(a,b);
cnt--;
}
}
else if(cz==2) {
cout<<"请输入要标记的格子(行/列)"<<endl;
cin>>a>>b;
if(cover[a][b]==0)cout<<"此处已翻开"<<endl;
if(cover[a][b]==2)cout<<"此处已标记"<<endl;
else{
cover[a][b]=2;
cnt--;
cnt2++;
}
}
else {
cout<<"请输入要撤销标记的格子(行/列)"<<endl;
cin>>a>>b;
if(cover[a][b]==0){
cout<<"此处已翻开"<<endl;
}
else if(cover[a][b]==1){
cout<<"此处没有标记"<<endl;
}
else{
cover[a][b]=1;
cnt++;
}
}
cout<<" ";
for(int i=1; i<=n; i++) {
cout<<i;
if(i<10)cout<<" ";
}
cout<<endl<<endl;
for(int i=1; i<=n; i++) {
cout<<i;
if(i<10)cout<<" ";
else cout<<" ";
for(int j=1; j<=m; j++) {
if(cover[i][j]==0) {
if(Map[i][j]==-1) {
cout<<"! ";
lose=1;
} else if(Map[i][j]==0)cout<<" ";
else cout<<Map[i][j]<<" ";
} else if(cover[i][j]==2)cout<<"# ";
else cout<<"? ";
}
cout<<endl;
}
if(lose==1) {
cout<<"你 失 败 了";
return 0;
}
if(cnt==0&&cnt2==x) {
cout<<"你 赢 了";
return 0;
}
}
}