问题标题: 自编扫雷游戏

0
1
已解决
董子墨
董子墨
中级天翼
中级天翼

扫雷2.1版本上线!

#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int x1,x2,cnt=0,xx,c,d,cs_;
char a[10][10];
char w[10][10];
bool tw[10][10];
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int nx,ny,t;
void out(string);
bool pd();
void xz(int,int);
int main(){
	system("color 2E");
	out("您已进入扫雷游戏,是否继续?\n1.继续 2.不继续\n"); 
	cin>>t;
	if(t==2)
		return 0;
	int sl,tt;
	system("cls");
	out("请输入你要玩几次(不能超过100):");
	cin>>cs_;
	system("cls");
	if(cs_>100)cs_=1;
	while(cs_--){
		memset(a,'?',sizeof(a));
		memset(w,' ',sizeof(w));
		out("请输入你需要地雷的数量(不能超过63个,不能低于5个):");
		cin>>sl;
		if(sl<5||sl>63){
			system("cls");
			out("您的地雷数量不符合要求,请重新输入(不能超过63个,不能低于5个):");
			cin>>sl;
			if(sl<5||sl>63){
				out("看不懂中文的不要玩我的游戏!!!");
				Sleep(2000);
				return 0;
			}
		}
		srand(time(0));
		system("cls");
		out("请稍后.");
		Sleep(29);
		while(sl){
			sl--;
			nx=rand()%8+1;
			ny=rand()%8+1;
			if(w[nx][ny]!='h')w[nx][ny]='h';
			else sl++;
		}
		cout<<".";
		Sleep(30);
		cout<<'.';
		system("cls");
		while(1){
			if(pd())break;
			for(int i=1;i<=8;i++){
				cout<<"第"<<i<<"行 "; 
				for(int j=1;j<=8;j++)
					cout<<' '<<a[i][j];
				cout<<endl;
			}
			cout<<"       ";
			for(int i=1;i<=8;i++){
				cout<<i;
				cout<<' ';
			}
			cout<<endl;
			out("请确定一个你选中的格子\n");
			Sleep(1000);
			out("请输入这个格子所在的行:");
			cin>>x1;
			cout<<"\n";
			out("请输入这个格子所在的列:");
			cin>>x2;
			if(w[x1][x2]=='h'){
				system("cls");
				out("地雷爆炸了!!!");
				Sleep(3000);
				break;
			}
			else{
				memset(tw,0,sizeof(tw));
				xz(x1,x2);
			}
			system("cls");
		}
		out("成功啦!!!");
		Sleep(3000);
		system("cls");
	} 
	out("你成功的完成了扫雷游戏,欢迎下次再来!!!"); 
	return 0;
}//30

void out(string cut){
	for(int i=0;i<cut.size();i++){
		cout<<cut[i];
		Sleep(30);
	}
}
bool pd(){
	for(int i=1;i<=8;i++)
		for(int j=1;j<=8;j++)
			if(a[i][j]=='?'&&w[i][j]==' ')return 0;
	return 1;
}
void xz(int x,int y){
	cnt=0;
	for(int i=0;i<8;i++){
		nx=x+dir[i][0];
		ny=y+dir[i][1];
		if(w[nx][ny]=='h')cnt++;
	}
	a[x][y]=cnt+'0';
	if(cnt!=0)
		return ;
	tw[x][y]=1;
	for(int i=0;i<8;i++){
		nx=x+dir[i][0];
		ny=y+dir[i][1];
		if(nx>=1&&nx<=8&&ny>=1&&ny<=8&&!tw[nx][ny])
			xz(nx,ny);
	}
}

请大家提出建议,以便改进。

董子墨在2019-12-27 16:53:26追加了内容

2.2版本上线!

#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int x1,x2,cnt=0,xx,c,d,cs_;
char a[10][10];
char w[10][10];
bool tw[10][10];
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int nx,ny,t;
void out(string);
bool pd();
void xz(int,int);
bool k=1;
int main(){
	system("color 2E");
	out("您已进入扫雷游戏,是否继续?\n1.继续 2.不继续\n"); 
	cin>>t;
	if(t==2)
		return 0;
	int sl,tt;
	system("cls");
	out("请输入你要玩几次(不能超过100):");
	cin>>cs_;
	system("cls");
	if(cs_>100||cs_<1)cs_=1;
	while(cs_--){
		memset(a,'?',sizeof(a));
		memset(w,' ',sizeof(w));
		out("请输入你需要地雷的数量(不能超过63个,不能低于5个):");
		cin>>sl;
		if(sl<5||sl>63){
			system("cls");
			out("您的地雷数量不符合要求,请重新输入(不能超过63个,不能低于5个):");
			cin>>sl;
			if(sl<5||sl>63){
				out("看不懂中文的不要玩我的游戏!!!");
				Sleep(2000);
				return 0;
			}
		}
		srand(time(0));
		system("cls");
		out("请稍后.");
		Sleep(29);
		while(sl){
			sl--;
			nx=rand()%8+1;
			ny=rand()%8+1;
			if(w[nx][ny]!='h')w[nx][ny]='h';
			else sl++;
		}
		cout<<".";
		Sleep(30);
		cout<<'.';
		system("cls");
		k=1;
		while(1){
			if(pd())break;
			for(int i=1;i<=8;i++){
				cout<<"第"<<i<<"行 "; 
				for(int j=1;j<=8;j++)
					cout<<' '<<a[i][j];
				cout<<endl;
			}
			cout<<"       ";
			for(int i=1;i<=8;i++){
				cout<<i;
				cout<<' ';
			}
			cout<<endl;
			out("请确定一个你选中的格子\n");
			Sleep(1000);
			out("请输入这个格子所在的行和列(格式:行 列):");
			cin>>x1>>x2;
			if(x1>8||x1<1||x2>8||x2<1){
				cout<<"超出了地图范围!!!";
				Sleep(1500);
				system("cls");
				continue;
			}
			if(w[x1][x2]=='h'){				
				system("cls");
				for(int i=1;i<=8;i++){
					for(int j=1;j<=8;j++){
						if(w[i][j]=='h') 
							cout<<"雷";
						else cout<<"  ";
					}
					cout<<endl;
				}
				Sleep(3000);
				break;
			}
			else{
				memset(tw,0,sizeof(tw));
				xz(x1,x2);
			}
			system("cls");
		}
		if(pd()){
			out("成功啦!!!");
			Sleep(3000);
		}
		system("cls");
	} 
	out("你成功的完成了扫雷游戏,欢迎下次再来!!!"); 
	return 0;
}//30

void out(string cut){
	for(int i=0;i<cut.size();i++){
		cout<<cut[i];
		Sleep(30);
	}
}
bool pd(){
	for(int i=1;i<=8;i++)
		for(int j=1;j<=8;j++)
			if(a[i][j]=='?'&&w[i][j]==' ')return 0;
	return 1;
}
void xz(int x,int y){
	cnt=0;
	for(int i=0;i<8;i++){
		nx=x+dir[i][0];
		ny=y+dir[i][1];
		if(w[nx][ny]=='h')cnt++;
	}
	a[x][y]=cnt+'0';
	if(cnt!=0)
		return ;
	tw[x][y]=1;
	for(int i=0;i<8;i++){
		nx=x+dir[i][0];
		ny=y+dir[i][1];
		if(nx>=1&&nx<=8&&ny>=1&&ny<=8&&!tw[nx][ny])
			xz(nx,ny);
	}
}

 


1
已采纳
乔俊驰
乔俊驰
资深守护
资深守护

给个建议:
1.输入以确定位置的时候,建议用空格一起写上去,举个例子,比如说5 5(Enter)而不是5(Enter)5(Enter)
2扫雷扫雷就得“扫”,但这个只是把没有雷的格子点完就行了

3第一次点击的格子不能有雷!!!(这个走不能忍,扫雷最基本规则)

总的来说还是挺不错的

0
0
许金夫
许金夫
初级天翼
初级天翼

董子墨,你在我4831那道题的回答里评论了啥,我看不见

0
我要回答