来了来了,Bug修复了,成品来喽
  • 板块灌水区
  • 楼主bluebear619
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/3/26 09:00
  • 上次更新2023/10/23 20:28:09
查看原帖
来了来了,Bug修复了,成品来喽
940602
bluebear619楼主2023/3/26 09:00

大家一定不要犯我这种低级错误

上个帖子我的扫雷出了个bug,就是该展开的时候会爆掉,因为重复的原因;

还有一个就是输出慢,是因为在生成雷的时候把随机数种子放进循环了,现在移出来就好了;

代码如下

#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判断坐标重复,加了一些界面优化现在交互做的不是很好,见谅!!!

2023/3/26 09:00
加载中...