- dulinfan2024's blog
扫雷
- 2024-10-8 15:54:41 @
记得加 -std=c++14
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
#define int long long
bool die[25][25];
int ci[25][25],n,m,cnt,vis[25][25],open;
const int dx[]={-1,0,0,1,1,1,-1,-1};
const int dy[]={0,1,-1,0,1,-1,1,-1};
void print(){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(vis[i][j]==1){
cout<<ci[i][j]<<" | ";
}
else if(vis[i][j]==2){
cout<<'*'<<" | ";
}
else cout<<'?'<<" | ";
}
cout<<"\n";
for(int i=1;i<=6*n;i++){
cout<<'-';
}
cout<<"\n";
}
}
void end_print(){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(die[i][j]){
cout<<"*"<<" | ";
}
else{
cout<<ci[i][j]<<" | ";
}
}
cout<<"\n";
for(int i=1;i<=6*n;i++){
cout<<'-';
}
cout<<"\n";
}
}
void dfs(int x,int y){
vis[x][y]=1;
open++;
if(ci[x][y]!=0)return ;
for(int i=0;i<8;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(vis[xx][yy])continue;
if(xx<1||xx>n||yy<1||yy>m)continue;
dfs(xx,yy);
}
}
signed main(){
mt19937 myrand(time(0));
cout<<"欢迎来到扫雷-----";
cout<<"\n请输入地图的行数(<=15):";
cin>>n;
cout<<"\n请输入地图的列数(<=15):";
cin>>m;
cout<<"\n请输入地图的雷数:";
cin>>cnt;
cout<<'\n';
memset(die,false,sizeof die);
for(int i=1;i<=cnt;i++){
int x,y;
do{
x=myrand()%n+1;
y=myrand()%m+1;
}while(die[x][y]);
die[x][y]=true;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(die[i][j])continue;
for(int k=0;k<8;k++){
int xx=i+dx[k];
int yy=j+dy[k];
if(xx<1||xx>n||yy<1||yy>m)continue;
if(die[xx][yy]){
ci[i][j]++;
}
}
}
}
bool win=false,lose=false;
int x,y,op,lx,ly;
while(!win&&!lose){
cout<<"1是插旗子/拆棋子,2是打开\n";
cin>>op;
cout<<"再输入两个数表示坐标\n";
cin>>x>>y;
if(x<1||x>n||y<1||y>m)continue;
if(op==1){
if(vis[x][y]==0)vis[x][y]=2;
else vis[x][y]=0;
system("cls");
print();
continue;
}
if(die[x][y]){
lose=true;
lx=x,ly=y;
break;
}
dfs(x,y);
if(open>=n*m-cnt){
win=true;
break;
}
system("cls");
print();
}
system("cls");
if(lose){
cout<<"你输了,("<<lx<<","<<ly<<")"<<"是雷\n";
}
else{
cout<<"你赢了!!\n";
}
end_print();
}
//ioi ak me