问题标题: 我的扫雷,更新了!!!(1.2版更上层楼)

0
0
已解决
曹灿阳
曹灿阳
初级天翼
初级天翼

经过我这个晚上1.5个小时的奋斗,我的扫雷更新了!!!

输入时可能会有点麻烦,但是抱歉,我目前没有更好的解决方案。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <bits/stdc++.h>
#include <windows.h>
#include <fstream>
#include <iomanip>
#define INF 0x3f3f3f3f
using namespace std;
const int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int mmap[40][40],win,lose;
bool vis[40][40],fflag[40][40];
bool pd(int m,int n){
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(vis[i][j]==0&&mmap[i][j]!=INF)
				return false;
		}
	}
	return true;
}
bool valid(int x,int y,int m,int n){
	if(x>=1&&x<=m&&y>=1&&y<=n)
		return true;
	return false;
}
void fankai(int x,int y,int m,int n){
	for(int i=0;i<8;i++){
		int nx=x+dir[i][0],ny=y+dir[i][1];
		if(valid(nx,ny,m,n)&&vis[nx][ny]==0){
			if(mmap[nx][ny]!=INF)
				vis[nx][ny]=true;
			if(mmap[nx][ny]==0)
				fankai(nx,ny,m,n);
		}
	}
}
bool saolei(int m,int n){
	srand(time(NULL));
	memset(mmap,0,sizeof(mmap));
	memset(vis,0,sizeof(vis));
	memset(fflag,0,sizeof(fflag));
	system("cls");
	int cnt_b=m*(n+1)/10+1;
	for(int i=1;i<=cnt_b;i++){
		int x=rand()%m+1,y=rand()%n+1;
		mmap[x][y]=INF;
	}
	cnt_b=0;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(mmap[i][j]==INF){
				cnt_b++;
			}
		}
	}
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(mmap[i][j]!=INF){
				for(int k=0;k<8;k++){
					int nx=i+dir[k][0],ny=j+dir[k][1];
					if(valid(nx,ny,m,n)&&mmap[nx][ny]==INF){
						mmap[i][j]++;
					}
				}
			}
		}
	}
	while(!pd(m,n)){
		system("cls");
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				if(fflag[i][j]){
					cout<<"F ";
				}
				else if(vis[i][j]&&mmap[i][j]!=INF){
					cout<<mmap[i][j]<<" ";
				}
				else{
					cout<<"? ";
				}
			}
			cout<<left<<setw(2)<<i<<endl;
		}
		for(int j=1;j<=n;j++)
			cout<<left<<setw(2)<<j;
		cout<<"  ←列"<<endl;
		cout<<right<<setw(n*2+2)<<" ↑"<<endl;
		cout<<right<<setw(n*2+2)<<" 行"<<endl;
		Sleep(1000);
		cout<<"输入说明:\n";
		cout<<"先输入两个数,空格隔开,表示你要操作的坐标。\n";
		cout<<"接着,输入一个数,表示操作类型:\n\t1表示翻开,\n\t2表示插旗,\n\t3表示快捷翻开周围的格子(前提是正确插旗)\n\t4表示撤销插旗\n\n\n";
		int xa,xb,caozuo;
		cin>>xa>>xb>>caozuo;
		if(!valid(xa,xb,m,n)||(caozuo<1||caozuo>4)){
			cout<<"输入错误,请重新输入!";
			Sleep(1000);
			system("cls");
			continue;
		}
		if(caozuo==1){
			if(mmap[xa][xb]==INF){
				system("cls");
				cout<<"你踩到地雷了!!!扫雷失败!!!\n这是答案:\n";
				for(int i=1;i<=m;i++){
					for(int j=1;j<=n;j++){
						if(mmap[i][j]==INF){
							cout<<"* ";
						}
						else{
							cout<<mmap[i][j]<<" ";
						}
					}
					cout<<endl;
				}
				system("pause");
				return false;
			}
			vis[xa][xb]=true;
			if(mmap[xa][xb]==0)
				fankai(xa,xb,m,n);
		}
		if(caozuo==2){
			if(vis[xa][xb]){
				cout<<"操作失败!";
				Sleep(1000);
				system("cls");
				continue;
			}
			fflag[xa][xb]=true;
		}
		if(caozuo==3){
			if(!vis[xa][xb]){
				cout<<"操作失败!";
				Sleep(1000);
				system("cls");
				continue;
			}
			int cnt=0,tmp_flag=false;
			for(int i=0;i<8;i++){
				int nx=xa+dir[i][0],ny=xb+dir[i][1];
				if(valid(nx,ny,m,n)&&fflag[nx][ny]){
					cnt++;
					if(mmap[nx][ny]!=INF){
						tmp_flag=true;
					}
				}
			}
			if(cnt!=mmap[xa][xb]){
				cout<<"操作格子周围的雷数不对,请注意。";
				Sleep(1000);
				system("cls");
				continue;
			}
			else if(tmp_flag){
				system("cls");
				cout<<"插旗错误!!!扫雷失败!!!\n这是答案:\n";
				for(int i=1;i<=m;i++){
					for(int j=1;j<=n;j++){
						if(mmap[i][j]==INF){
							cout<<"* ";
						}
						else{
							cout<<mmap[i][j]<<" ";
						}
					}
					cout<<endl;
					system("pause");
					return false;
				}
			}
			else{
				for(int i=0;i<8;i++){
					int nx=xa+dir[i][0],ny=xb+dir[i][1];
					if(valid(nx,ny,m,n)&&mmap[nx][ny]!=INF){
						vis[nx][ny]=true;
						if(mmap[nx][ny]==0){
							fankai(nx,ny,m,n);
						}
					}
				}
			}
		}
		if(caozuo==4){
			if(fflag[xa][xb])
				fflag[xa][xb]=false;
			else{
				cout<<"操作失败!";
				Sleep(1000);
				continue;
			}
		}
		system("cls");
	}
	system("cls");
	cout<<"你完成了扫雷,真厉害!\n这是答案:\n";
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(mmap[i][j]==INF){
				cout<<"* ";
			}
			else{
				cout<<mmap[i][j]<<" ";
			}
			
		}
		cout<<endl;
	}
	system("pause");
	system("cls");
	return true;
}
void goto_saolei(){
	system("cls");
	int m,n;
	while(1){
		cout<<"请输入你要玩多少行,多少列的扫雷?\n";
		cin>>m>>n;
		if(!(m>=3&&m<=30&&n>=3&&n<=30)){
			cout<<"输入数据不合理,请重新输入!"<<endl;
			Sleep(1000);
			system("cls");
			continue;
		}
		else{
			break;
		}
	}
	if(saolei(m,n))
		win++;
	else
		lose++;
	system("cls");
}
int main(){
	MessageBox(NULL,"欢迎来到益智游戏大全1.1版(不负众望)!","欢迎",MB_OK);
	MessageBox(NULL,"输入是核对一下,输入的内容不要有字母或者\n其他奇奇怪怪的东西,否则会让程序崩溃!!!","注意!",MB_OK);
	bool cd;
	cout<<"请问您是否使用上一次的存档???(输入1或0)";
	cin>>cd;
	if(cd){
		cout<<"好的,恢复存档。"<<endl;
		ifstream fin("益智游戏大全.txt");
		fin>>win>>lose;
		fin.close();
		Sleep(1000);
	}
	while(1){
		system("cls");
		cout<<"你要玩什么游戏?\n1. 扫雷\n输入-1退出游戏。\n其余在开发中,敬请期待!";
		int g;
		cin>>g;
		if(g==-1)
			break;
		switch(g){
			case 1:goto_saolei();break;
			default:cout<<"输入错误,请重新输入!";Sleep(1000);continue; 
		}
	}
	system("cls");
	bool bc;
	cout<<"你赢了"<<win<<"局,输了"<<lose<<"局。\n";
	Sleep(1500);
	cout<<"是否保存???(输入1或0)";
	cin>>bc;
	if(bc){
		cout<<"好的,保存后请立即退出。"<<endl;
		ofstream fout("益智游戏大全.txt");
		fout<<win<<" "<<lose;
		fout.close();
		Sleep(1000);
	}
	else{
		system("cls");
		cout<<"再见!!!";
		ofstream fout("益智游戏大全.txt");
		fout<<0<<" "<<0;
		fout.close();
		Sleep(1000);
	}
	return 0;
}

目前有奖悬赏:

1. O3优化怎么写?(我绝对不会把它用在刷题上的,否则我就是*)(回答好的话赏金可以加到30)

2. 如何将同一个屏幕中不同的字设置不同的颜色(回答的好的话赏金可以加到150)

3. 请指出不少于1处bug(每一处有意义的bug可以给30~50豆)

请你们尊重一下我的劳动成果,不要刷“666”“NB”之类的无聊的没有价值的话,请给出客观、真实的评价。

请勿在回答中喷人、骂人,否则我一律举报!!!

曹灿阳在2021-02-10 20:56:46追加了内容

刚刚忘了说了,每个客观、真实的评价,我可以给10~20豆

曹灿阳在2021-02-10 20:57:58追加了内容

dingding

曹灿阳在2021-02-10 22:19:57追加了内容

我要关电脑了,有什么是明天再说(明天大年三十!!!

无奖竞答:有谁和我一起守岁???电脑(上问答)或手机(对我比较熟悉的人)或电话手表(对我比较熟悉的人)联系我

曹灿阳在2021-02-11 11:50:15追加了内容

今天是大年三十,我更新了我的扫雷!

又是一年扫雷热,依然十里爆炸红。

二话不说,上代码!!!

顺便说一下,1.0版扫雷的名称是初出茅庐,1.1版是不负众望,1.2版是更上层楼

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <bits/stdc++.h>
#include <windows.h>
#include <fstream>
#include <iomanip>
#define INF 0x3f3f3f3f
using namespace std;
void color(int corcorcor){
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),corcorcor+64);
}
const int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int mmap[40][40],win,lose;
bool vis[40][40],fflag[40][40];
bool pd(int m,int n){
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(vis[i][j]==0&&mmap[i][j]!=INF)
				return false;
		}
	}
	return true;
}
bool valid(int x,int y,int m,int n){
	if(x>=1&&x<=m&&y>=1&&y<=n)
		return true;
	return false;
}
void fankai(int x,int y,int m,int n){
	for(int i=0;i<8;i++){
		int nx=x+dir[i][0],ny=y+dir[i][1];
		if(valid(nx,ny,m,n)&&vis[nx][ny]==0){
			if(mmap[nx][ny]!=INF)
				vis[nx][ny]=true;
			if(mmap[nx][ny]==0)
				fankai(nx,ny,m,n);
		}
	}
}
bool saolei_p1(int m,int n){
	memset(vis,0,sizeof(vis));
	while(!pd(m,n)){
		system("cls");
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				if(fflag[i][j]){
					color(11);
					cout<<"F ";
				}
				else if(vis[i][j]&&mmap[i][j]!=INF){
					if(mmap[i][j]==0){
						color(13);
					}
					else{
						color(15);
					}
					cout<<mmap[i][j]<<" ";
				}
				else{
					color(12);
					cout<<"? ";
				}
			}
			color(9);
			cout<<left<<setw(2)<<i<<endl;
		}
		color(9);
		for(int j=1;j<=n;j++)
			cout<<left<<setw(2)<<j;
		cout<<"  ←列"<<endl;
		cout<<right<<setw(n*2+2)<<" ↑"<<endl;
		cout<<right<<setw(n*2+2)<<" 行"<<endl;
		Sleep(1000);
		color(14);
		cout<<"输入说明:\n";
		cout<<"先输入两个数,空格隔开,表示你要操作的坐标。\n";
		cout<<"接着,输入一个数,表示操作类型:\n\t1表示翻开,\n\t2表示插旗,\n\t3表示快捷翻开周围的格子(前提是正确插旗)\n\t4表示撤销插旗\n\n\n";
		int xa,xb,caozuo;
		cin>>xa>>xb>>caozuo;
		if(!valid(xa,xb,m,n)||(caozuo<1||caozuo>4)){
			cout<<"输入错误,请重新输入!";
			Sleep(1000);
			system("cls");
			continue;
		}
		if(caozuo==1){
			if(mmap[xa][xb]==INF){
				system("cls");
				cout<<"你踩到地雷了!!!扫雷失败!!!\n这是答案:\n";
				for(int i=1;i<=m;i++){
					for(int j=1;j<=n;j++){
						if(mmap[i][j]==INF){
							color(11);
							cout<<"* ";
						}
						else{
							if(mmap[i][j]==0)
								color(13);
							else
								color(15);
							cout<<mmap[i][j]<<" ";
						}
					}
					cout<<endl;
				}
				color(14);
				system("pause");
				return false;
			}
			vis[xa][xb]=true;
			if(mmap[xa][xb]==0)
				fankai(xa,xb,m,n);
		}
		if(caozuo==2){
			if(vis[xa][xb]){
				cout<<"操作失败!";
				Sleep(1000);
				system("cls");
				continue;
			}
			fflag[xa][xb]=true;
		}
		if(caozuo==3){
			if(!vis[xa][xb]){
				cout<<"操作失败!";
				Sleep(1000);
				system("cls");
				continue;
			}
			int cnt=0,tmp_flag=false;
			for(int i=0;i<8;i++){
				int nx=xa+dir[i][0],ny=xb+dir[i][1];
				if(valid(nx,ny,m,n)&&fflag[nx][ny]){
					cnt++;
					if(mmap[nx][ny]!=INF){
						tmp_flag=true;
					}
				}
			}
			if(cnt!=mmap[xa][xb]){
				cout<<"操作格子周围的雷数不对,请注意。";
				Sleep(1000);
				system("cls");
				continue;
			}
			else if(tmp_flag){
				system("cls");
				cout<<"插旗错误!!!扫雷失败!!!\n这是答案:\n";
				for(int i=1;i<=m;i++){
					for(int j=1;j<=n;j++){
						if(mmap[i][j]==INF){
							color(11);
							cout<<"* ";
						}
						else{
							if(mmap[i][j]==0)
								color(13);
							else
								color(15);
							cout<<mmap[i][j]<<" ";
						}
					}
					cout<<endl;
				}
				color(14);
				system("pause");
				return false;
			}
			else{
				for(int i=0;i<8;i++){
					int nx=xa+dir[i][0],ny=xb+dir[i][1];
					if(valid(nx,ny,m,n)&&mmap[nx][ny]!=INF){
						vis[nx][ny]=true;
						if(mmap[nx][ny]==0){
							fankai(nx,ny,m,n);
						}
					}
				}
			}
		}
		if(caozuo==4){
			if(fflag[xa][xb])
				fflag[xa][xb]=false;
			else{
				cout<<"操作失败!";
				Sleep(1000);
				continue;
			}
		}
		system("cls");
	}
	system("cls");
	cout<<"你完成了扫雷,真厉害!\n这是答案:\n";
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(mmap[i][j]==INF){
				color(11);
				cout<<"* ";
			}
			else{
				if(mmap[i][j]==0)
					color(13);
				else
					color(15);
				cout<<mmap[i][j]<<" ";
			}
		}
		cout<<endl;
	}
	color(14);
	system("pause");
	system("cls");
	return true;
}
bool saolei(int m,int n){
	srand(time(NULL));
	memset(mmap,0,sizeof(mmap));
	memset(vis,0,sizeof(vis));
	memset(fflag,0,sizeof(fflag));
	system("cls");
	int cnt_b=m*(n+1)/10+1;
	for(int i=1;i<=cnt_b;i++){
		int x=rand()%m+1,y=rand()%n+1;
		mmap[x][y]=INF;
	}
	cnt_b=0;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(mmap[i][j]==INF){
				cnt_b++;
			}
		}
	}
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(mmap[i][j]!=INF){
				for(int k=0;k<8;k++){
					int nx=i+dir[k][0],ny=j+dir[k][1];
					if(valid(nx,ny,m,n)&&mmap[nx][ny]==INF){
						mmap[i][j]++;
					}
				}
			}
		}
	}
	system("cls");
	bool tmp=saolei_p1(m,n);
	system("cls");
	while(tmp==0){
		lose++;
		color(14);
		bool a;
		cout<<"是否重新开始相同的地图?(1表示是,0表示否)";
		cin>>a;
		if(a){
			cout<<"好的,重新开始。";
			system("cls");
			tmp=saolei_p1(m,n);
		}
		else
			break;
	}
	return tmp;
}
void goto_saolei(){
	system("cls");
	int m,n;
	while(1){
		cout<<"请输入你要玩多少行,多少列的扫雷?\n";
		cin>>m>>n;
		if(!(m>=3&&m<=30&&n>=3&&n<=30)){
			cout<<"输入数据不合理,请重新输入!"<<endl;
			Sleep(1000);
			system("cls");
			continue;
		}
		else{
			break;
		}
	}
	if(saolei(m,n))
		win++;
	else
		lose++;
	system("cls");
}
int main(){
	system("cls");
	color(0);
	system("cls");
	color(14);
	MessageBox(NULL,"欢迎来到益智游戏大全1.2版(更上层楼)!","欢迎",MB_OK);
	MessageBox(NULL,"输入是核对一下,输入的内容不要有字母或者\n其他奇奇怪怪的东西,否则会让程序崩溃!!!","注意!",MB_OK);
	system("cls");
	bool cd;
	cout<<"请问您是否使用上一次的存档???(输入1或0)";
	cin>>cd;
	if(cd){
		cout<<"好的,恢复存档。"<<endl;
		ifstream fin("益智游戏大全.txt");
		fin>>win>>lose;
		fin.close();
		Sleep(1000);
	}
	while(1){
		system("cls");
		cout<<"你要玩什么游戏?\n1. 扫雷\n输入-1退出游戏。\n其余在开发中,敬请期待!";
		int g;
		cin>>g;
		if(g==-1)
			break;
		switch(g){
			case 1:goto_saolei();break;
			default:cout<<"输入错误,请重新输入!";Sleep(1000);continue; 
		}
	}
	system("cls");
	bool bc;
	cout<<"你赢了"<<win<<"局,输了"<<lose<<"局。成功率:";
	printf("%.1f",win*100/(double)(win+lose));
	cout<<"%\n";
	Sleep(1500);
	cout<<"是否保存???(输入1或0)";
	cin>>bc;
	if(bc){
		cout<<"好的,保存后请立即退出。"<<endl;
		ofstream fout("益智游戏大全.txt");
		fout<<win<<" "<<lose;
		fout.close();
		Sleep(1000);
	}
	else{
		system("cls");
		cout<<"再见!!!";
		ofstream fout("益智游戏大全.txt");
		fout<<0<<" "<<0;
		fout.close();
		Sleep(1000);
	}
	return 0;
}

呵呵


1
已采纳
沙宸安
沙宸安
中级启示者
中级启示者

我先回答您的第二个问题:

可以参考我在开发XA-codingtang和XACRAFT时调用的函数:

头文件:

#include<windows.h>

调用:

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
//其中a代表色号
    前景色
	1	深蓝色
	2	深绿色
	3	深青色 
	4	深红色
	5	深粉色
	6	黄色
	7	深白色
	8	灰色
	9	浅蓝色
	10	浅绿色 
	11	浅青色 
	12	浅红色 
	13	浅粉色 
	14	浅黄色 
	15	浅白色 
	
	背景色
	1~15		黑色 
	16~31		深蓝色 
	32~47		深绿色
	48~63		深青色
	64~79		深红色
	80~95		深粉色
	96~111		深黄色
	112~127 	深白色
	128~143 	灰色
	144~159 	浅蓝色
	160~175 	浅绿色
	176~191 	浅青色
	192~207 	浅红色
	208~223 	浅粉色
	224~239 	浅黄色
	240~255 	浅白色
前景与背景共用时,色号为:(前景色+背景色范围的第一个数)
如:前景灰色,背景浅蓝。色号:(8+144)

具体还可以参考吴庞茂旭的帖子:https://wenda.codingtang.com/questions/11177/

使用效果:

色号:240、249、252

沙宸安在2021-02-10 21:26:22追加了内容

那比如像我这一段: 

system("cls");
		color(9);
		cout<<"操作系统:XA-codingtang 2021特别版"<<endl;
		color(7);
		string time=getTime();
		cout<<time<<endl;
		color(14);
		cout<<"文件夹路径:";
		color(7);
		findesktop(cmmd);
		cout<<endl;	
		for(i=1;i<=filestd[cmmd];i++){
			if(1){
				cout<<i<<" : "<<file[cmmd][i]<<endl;
			}
		}
		color(14);
		cout<<"基本操作:"<<endl;
		color(7);
		cout<<"C-打开功能栏"<<endl<<"O-打开小工具"<<endl<<"A-打开应用"<<endl<<"I-应用商店"<<endl<<"T-投诉&反馈"<<endl;
		color(14);
		cout<<"XA应用:"<<endl;
		color(7);

沙宸安在2021-02-10 21:30:09追加了内容

建议:

1、引入判断机制,首次选择格子一定不会踩雷,要不然开头雷岂不尴尬吗

2、添加计分板功能,统计成功局数、失败局数、成功率等

3、如果不慎踩雷,可以选择重新玩这一张地图

0
曹灿阳
曹灿阳
初级天翼
初级天翼

重申一下:请勿在回答中喷人、骂人,否则我一律举报!!!

0
曹灿阳
曹灿阳
初级天翼
初级天翼

@沙宸安 

请问这是怎么回事?

请问color()函数到底怎么用?有什么头文件?

曹灿阳在2021-02-10 22:00:30追加了内容

为什么我的是这样的:

adsffa

请问出了什么问题?

曹灿阳在2021-02-10 22:03:37追加了内容

谢谢,这下好了:

曹灿阳在2021-02-10 22:07:33追加了内容

 

这下好了:

0
沙宸安
沙宸安
中级启示者
中级启示者

对不起,我大意了。

void color(int corcorcor){
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),corcorcor);
}

我用color只是为了方便不写那么一大堆,你应该要把这个加上

沙宸安在2021-02-10 22:02:21追加了内容

像你用的是win7的,最好在每次清屏的时候这么写:

system("cls");
color(?);
system("cls");

不然容易卡

沙宸安在2021-02-10 22:03:22追加了内容

就有可能出现你的那种情况

0
汪宇航
汪宇航
新手启示者
新手启示者

#include <iostream>

#include <cstdio>

#include <cstring>

#include <string>

#include <cstdlib>

#include <cmath>

#include <ctime>

#include <bits/stdc++.h>

#include <windows.h>

#include <fstream>

#include <iomanip>

#define INF 0x3f3f3f3f

using namespace std;

const int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};

int mmap[40][40],win,lose;

bool vis[40][40],fflag[40][40];

bool pd(int m,int n){

    for(int i=1;i<=m;i++){

        for(int j=1;j<=n;j++){

            if(vis[i][j]==0&&mmap[i][j]!=INF)

                return false;

        }

    }

    return true;

}

bool valid(int x,int y,int m,int n){

    if(x>=1&&x<=m&&y>=1&&y<=n)

        return true;

    return false;

}

void fankai(int x,int y,int m,int n){

    for(int i=0;i<8;i++){

        int nx=x+dir[i][0],ny=y+dir[i][1];

        if(valid(nx,ny,m,n)&&vis[nx][ny]==0){

            if(mmap[nx][ny]!=INF)

                vis[nx][ny]=true;

            if(mmap[nx][ny]==0)

                fankai(nx,ny,m,n);

        }

    }

}

bool saolei(int m,int n){

    srand(time(NULL));

    memset(mmap,0,sizeof(mmap));

    memset(vis,0,sizeof(vis));

    memset(fflag,0,sizeof(fflag));

    system("cls");

    int cnt_b=m*(n+1)/10+1;

    for(int i=1;i<=cnt_b;i++){

        int x=rand()%m+1,y=rand()%n+1;

        mmap[x][y]=INF;

    }

    cnt_b=0;

    for(int i=1;i<=m;i++){

        for(int j=1;j<=n;j++){

            if(mmap[i][j]==INF){

                cnt_b++;

            }

        }

    }

    for(int i=1;i<=m;i++){

        for(int j=1;j<=n;j++){

            if(mmap[i][j]!=INF){

                for(int k=0;k<8;k++){

                    int nx=i+dir[k][0],ny=j+dir[k][1];

                    if(valid(nx,ny,m,n)&&mmap[nx][ny]==INF){

                        mmap[i][j]++;

                    }

                }

            }

        }

    }

    while(!pd(m,n)){

        system("cls");

        for(int i=1;i<=m;i++){

            for(int j=1;j<=n;j++){

                if(fflag[i][j]){

                    cout<<"F ";

                }

                else if(vis[i][j]&&mmap[i][j]!=INF){

                    cout<<mmap[i][j]<<" ";

                }

                else{

                    cout<<"? ";

                }

            }

            cout<<left<<setw(2)<<i<<endl;

        }

        for(int j=1;j<=n;j++)

            cout<<left<<setw(2)<<j;

        cout<<" ←列"<<endl;

        cout<<right<<setw(n*2+2)<<" ↑"<<endl;

        cout<<right<<setw(n*2+2)<<" 行"<<endl;

        Sleep(1000);

        cout<<"输入说明:\n";

        cout<<"先输入两个数,空格隔开,表示你要操作的坐标。\n";

        cout<<"接着,输入一个数,表示操作类型:\n\t1表示翻开,\n\t2表示插旗,\n\t3表示快捷翻开周围的格子(前提是正确插旗)\n\t4表示撤销插旗\n\n\n";

        int xa,xb,caozuo;

        cin>>xa>>xb>>caozuo;

        if(!valid(xa,xb,m,n)||(caozuo<1||caozuo>4)){

            cout<<"输入错误,请重新输入!";

            Sleep(1000);

            system("cls");

            continue;

        }

        if(caozuo==1){

            if(mmap[xa][xb]==INF){

                system("cls");

                cout<<"你踩到地雷了!!!扫雷失败!!!\n这是答案:\n";

                for(int i=1;i<=m;i++){

                    for(int j=1;j<=n;j++){

                        if(mmap[i][j]==INF){

                            cout<<"* ";

                        }

                        else{

                            cout<<mmap[i][j]<<" ";

                        }

                    }

                    cout<<endl;

                }

                system("pause");

                return false;

            }

            vis[xa][xb]=true;

            if(mmap[xa][xb]==0)

                fankai(xa,xb,m,n);

        }

        if(caozuo==2){

            if(vis[xa][xb]){

                cout<<"操作失败!";

                Sleep(1000);

                system("cls");

                continue;

            }

            fflag[xa][xb]=true;

        }

        if(caozuo==3){

            if(!vis[xa][xb]){

                cout<<"操作失败!";

                Sleep(1000);

                system("cls");

                continue;

            }

            int cnt=0,tmp_flag=false;

            for(int i=0;i<8;i++){

                int nx=xa+dir[i][0],ny=xb+dir[i][1];

                if(valid(nx,ny,m,n)&&fflag[nx][ny]){

                    cnt++;

                    if(mmap[nx][ny]!=INF){

                        tmp_flag=true;

                    }

                }

            }

            if(cnt!=mmap[xa][xb]){

                cout<<"操作格子周围的雷数不对,请注意。";

                Sleep(1000);

                system("cls");

                continue;

            }

            else if(tmp_flag){

                system("cls");

                cout<<"插旗错误!!!扫雷失败!!!\n这是答案:\n";

                for(int i=1;i<=m;i++){

                    for(int j=1;j<=n;j++){

                        if(mmap[i][j]==INF){

                            cout<<"* ";

                        }

                        else{

                            cout<<mmap[i][j]<<" ";

                        }

                    }

                    cout<<endl;

                    system("pause");

                    return false;

                }

            }

            else{

                for(int i=0;i<8;i++){

                    int nx=xa+dir[i][0],ny=xb+dir[i][1];

                    if(valid(nx,ny,m,n)&&mmap[nx][ny]!=INF){

                        vis[nx][ny]=true;

                        if(mmap[nx][ny]==0){

                            fankai(nx,ny,m,n);

                        }

                    }

                }

            }

        }

        if(caozuo==4){

            if(fflag[xa][xb])

                fflag[xa][xb]=false;

            else{

                cout<<"操作失败!";

                Sleep(1000);

                continue;

            }

        }

        system("cls");

    }

    system("cls");

    cout<<"你完成了扫雷,真厉害!\n这是答案:\n";

    for(int i=1;i<=m;i++){

        for(int j=1;j<=n;j++){

            if(mmap[i][j]==INF){

                cout<<"* ";

            }

            else{

                cout<<mmap[i][j]<<" ";

            }

            

        }

        cout<<endl;

    }

    system("pause");

    system("cls");

    return true;

}

void goto_saolei(){

    system("cls");

    int m,n;

    while(1){

        cout<<"请输入你要玩多少行,多少列的扫雷?\n";

        cin>>m>>n;

        if(!(m>=3&&m<=30&&n>=3&&n<=30)){

            cout<<"输入数据不合理,请重新输入!"<<endl;

            Sleep(1000);

            system("cls");

            continue;

        }

        else{

            break;

        }

    }

    if(saolei(m,n))

        win++;

    else

        lose++;

    system("cls");

}

int main(){

    MessageBox(NULL,"欢迎来到益智游戏大全1.1版(不负众望)!","欢迎",MB_OK);

    MessageBox(NULL,"输入是核对一下,输入的内容不要有字母或者\n其他奇奇怪怪的东西,否则会让程序崩溃!!!","注意!",MB_OK);

    bool cd;

    cout<<"请问您是否使用上一次的存档???(输入1或0)";

    cin>>cd;

    if(cd){

        cout<<"好的,恢复存档。"<<endl;

        ifstream fin("益智游戏大全.txt");

        fin>>win>>lose;

        fin.close();

        Sleep(1000);

    }

    while(1){

        system("cls");

        cout<<"你要玩什么游戏?\n1. 扫雷\n输入-1退出游戏。\n其余在开发中,敬请期待!";

        int g;

        cin>>g;

        if(g==-1)

            break;

        switch(g){

            case 1:goto_saolei();break;

            default:cout<<"输入错误,请重新输入!";Sleep(1000);continue;

        }

    }

    system("cls");

    bool bc;

    cout<<"你赢了"<<win<<"局,输了"<<lose<<"局。\n";

    Sleep(1500);

    cout<<"是否保存???(输入1或0)";

    cin>>bc;

    if(bc){

        cout<<"好的,保存后请立即退出。"<<endl;

        ofstream fout("益智游戏大全.txt");

        fout<<win<<" "<<lose;

        fout.close();

        Sleep(1000);

    }

    else{

        system("cls");

        cout<<"再见!!!";

        ofstream fout("益智游戏大全.txt");

        fout<<0<<" "<<0;

        fout.close();

        Sleep(1000);

    }

    return 0;

}

main.cpp:9:21: fatal error: windows.h: No such file or directory
 #include <windows.h>
                     ^
compilation terminated.

what>?
 

我要回答