C++实现扫雷(最简单版)

Posted 吴同学132

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++实现扫雷(最简单版)相关的知识,希望对你有一定的参考价值。

大家好,这几天心血来潮想做一个扫雷程序,于是花费我20分钟时间做了一个,这可能是目前最简单的一个了(也是最简陋的),新手容易理解。

直接上代码

#include<cstdio>
#include<windows.h>
#include<cstdlib>
#include<ctime>
using namespace std;
char a[17][31],c[17][31];
int b[17][31];
int m,n,l,ch=5,flag,l1,l2,sl;
void kg(int x,int y)
	if(a[x][y]==*)
		return ;
	if(x-1!=0&&y-1!=0)
		if(c[x-1][y-1]==.)
			l2++;
			c[x-1][y-1]= ;
			if(b[x-1][y-1]==0)
				kg(x-1,y-1);
		
	if(x-1!=0)
		if(c[x-1][y]==.)
			l2++;
			c[x-1][y]= ;
			if(b[x-1][y]==0)
				kg(x-1,y);
		
	if(x-1!=0&&y!=m)
		if(c[x-1][y-1]==.)
			l2++;
			c[x-1][y-1]= ;
			if(b[x-1][y-1]==0)
				kg(x-1,y-1);
		
	if(y-1!=0)
		if(c[x][y-1]==.)
			l2++;
			c[x][y-1]= ;
			if(b[x][y-1]==0)
				kg(x,y-1);
		
	if(y!=m)
		if(c[x][y+1]==.)
			l2++;
			c[x][y+1]= ;
			if(b[x][y+1]==0)
				kg(x,y+1);
		
	if(x!=n&&y-1!=0)
		if(c[x+1][y-1]==.)
			l2++;
			c[x+1][y-1]= ;
			if(b[x+1][y-1]==0)
				kg(x+1,y-1);
		
	if(x!=n)
		if(c[x+1][y]==.)
			l2++;
			c[x+1][y]= ;
			if(b[x+1][y]==0)
				kg(x+1,y);
		
	if(x!=n&&y!=m)
		if(c[x+1][y+1]==.)
			l2++;
			c[x+1][y+1]= ;
			if(b[x+1][y+1]==0)
				kg(x+1,y+1);
		

int num(int x,int y)
	if(a[x][y]==*)
		return 0;
	int ans=0;
	if(x-1!=0&&y-1!=0)
		if(a[x-1][y-1]==*)
			ans++;
	if(x-1!=0)
		if(a[x-1][y]==*)
			ans++;
	if(x-1!=0&&y!=m)
		if(a[x-1][y+1]==*)
			ans++;
	if(y-1!=0)
		if(a[x][y-1]==*)
			ans++;
	if(y!=m)
		if(a[x][y+1]==*)
			ans++;
	if(x!=n&&y-1!=0)
		if(a[x+1][y-1]==*)
			ans++;
	if(x!=n)
		if(a[x+1][y]==*)
			ans++;
	if(x!=n&&y!=m)
		if(a[x+1][y+1]==*)
			ans++;
	return ans;

int main()
	srand((unsigned)time(NULL));
	for(int i=1;i<=16;i++)
		for(int j=1;j<=30;j++)
			a[i][j]= ,c[i][j]=.;
	while(ch!=1&&ch!=2&&ch!=3&&ch!=4)
		printf("1、初级(9X9,10颗雷)\\n");
		printf("2、中级(16X16,40颗雷)\\n");
		printf("3、高级(30X16,99颗雷)\\n");
		printf("4、自定义\\n");
		printf("5、图例\\n");
		printf("请输入模式编号:");
		scanf("%d",&ch);
		if(ch==1)
			m=9,n=9,l=10;
		else if(ch==2)
			m=16,n=16,l=40;
		else if(ch==3)
			m=30,n=16,l=99;
		else if(ch==4)
			printf("请输入列数(9-30):");
			scanf("%d",&m);
			if(m>30)
				m=30;
			else if(m<9)
				m=9;
			printf("请输入行数(9-16):");
			scanf("%d",&n);
			if(n>16)
				n=16;
			else if(n<9)
				n=9;
			printf("请输入雷数(10-99):");
			scanf("%d",&l);
			if(l>99)
				l=99;
			else if(l<10)
				l=10;
			if(l==n*m)
				l--; 
		
		else if(ch==5)
			printf("加载中...\\n\\n");
			system("cls");
			printf("\\".\\"-->此格子未被点击过\\n");
			printf("\\"*\\"-->雷\\n");
			printf("\\" \\"-->空\\n");
			printf("\\"&\\"-->被标记为雷\\n");
			printf("\\"?\\"-->被标记为不知道\\n\\n\\n");
			Sleep(3000);
		
		else
			printf("\\n输入有误\\n请重新输入!");
			Sleep(500);
			system("cls");
		
	
	printf("加载中...\\n\\n");
	sl=l;
	system("cls");
	printf(" %d X %d , %d 颗雷\\n",m,n,l);
	for(int i=1;i<=l;i++)
		int x,y;
		x=rand()%n;
		if(x==0)
			x=n;
		y=rand()%m;
		if(y==0)
			y=m;
		if(a[x][y]==*)
			i--;
		a[x][y]=*;
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			b[i][j]=num(i,j);
	
	while(1)
		printf("剩余%d颗雷\\n\\n",sl);
		printf("   ");
		for(int i=1;i<=m;i++)
			printf("%d ",i/10);
		printf("\\n   ");
		for(int i=1;i<=m;i++)
			printf("%d ",i%10);
		printf("\\n  ┍");
		for(int i=1;i<=m-1;i++)
			printf("--");
		printf("\\n");
		for(int i=1;i<=n;i++)
			printf("%02d|",i);
			for(int j=1;j<=m;j++)
				if(flag==1)
					printf("%c|",a[i][j]);
					continue;
				
				if(c[i][j]==.||c[i][j]==?||c[i][j]==&)
					printf("%c|",c[i][j]);
				else if(b[i][j]!=0)
					printf("%d|",b[i][j]);
				else
					printf("%c|",a[i][j]);
			
			printf("\\n  |");
			for(int i=1;i<=m;i++)
				printf("--");
			printf("\\n");
		
		if(flag==1)
			printf("\\n\\n窗口在5秒后自动关闭\\r");
			for(int i=5;i>=0;i--)
				Sleep(1000);
				printf("窗口在%d秒后自动关闭\\r",i);
			
			Sleep(100);
			return 0;
		
		printf("\\n\\n");
		int x=100,y=100;
		while(x>n||x<1)
			printf("请输入进行操作的行:");
			scanf("%d",&x);
			if(x>n||x<1)
				printf("请重新输入!\\n");
		
		while(y>m||y<1)
			printf("请输入进行操作的列:");
			scanf("%d",&y);
			if(y>m||y<1)
				printf("请重新输入!\\n");
		
		ch=0;
		while(ch!=1&&ch!=2&&ch!=3)
			printf("请选择进行的操作:\\n1、探查\\n2、排雷\\n3、标记为不确定\\n输入操作:");
			scanf("%d",&ch);
			if(ch!=1&&ch!=2&&ch!=3)
				printf("请重新输入!\\n");
		
		if(ch==1)
			if(c[x][y]==&)
				sl++;
			c[x][y]= ;
			system("cls");
			if(a[x][y]==*)
				printf("游戏结束\\n恭喜您踩到雷了!\\n\\n");
				flag=1;
				continue;
			
			else
				l2++;
			if(n*m-l2==l)
				printf("游戏结束\\n恭喜您排完了所有雷!\\n\\n");
				sl=0;
				flag=1;
				continue;
			
			if(b[x][y]==0)
				kg(x,y);
			
		
		else if(ch==2)
			c[x][y]=&;
			system("cls");
			sl--;
			if(a[x][y]==*)
				l1++;
			if(l1==l)
				printf("游戏结束\\n恭喜您排完了所有雷!\\n\\n");
				sl=0;
				flag=1;
				continue;
			
		
		else if(ch==3)
			if(c[x][y]==&)
				sl++;
			c[x][y]=?;
			system("cls");
		
	
	return 0;

这里162行和165行随机生成雷时用到了随机数

x=rand()%n;
y=rand()%m;

什么意思呢,就是随机生成一个数并且对n或m取模,因为随机数会非常大,会超过格子的行和宽。

需要用到头文件:

#include<cstdlib>

还需要先播种随机种子

srand((unsigned)time(NULL));

这个需要用到头文件:

#include<cstdlib>
#include<ctime>

在多行还用到了清屏操作

system("cls");

这个需要用到头文件:

#include<cstdlib>

在多行还用到了暂停操作

Sleep(3000);     //注意这里“S”要大写,括号里面是暂停时间,单位毫秒(ms)

这个需要用到头文件:

#include<windows.h>    //这个头文件不包含在万能头文件里“#include<bits/stdc++.h>”

剩下的内容应该都通俗易懂

对了还有一个

printf("\\n\\n窗口在5秒后自动关闭\\r");
for(int i=4;i>=0;i--)
    Sleep(1000);
    printf("窗口在%d秒后自动关闭\\r",i);

Sleep(100);
return 0;

这里有个自动关闭窗口的程序,时间可以自行修改(注意for里面定义的$i$的初始值为时间$-1$)

这个程序需要在外面运行才有用,因为在编译器运行会有单击继续,只有在外面才会自动关闭

==最后,总体运行效果==

如果你觉得这篇文章写的很好,记得==关注,点赞,评论,转发==

==源程序==

C++扫雷源程序

以上是关于C++实现扫雷(最简单版)的主要内容,如果未能解决你的问题,请参考以下文章

C语言实现简易版扫雷

Java实现扫雷小游戏优化版

扫雷游戏(C语言实现)初级版和优化版(增加了自动展开标记地雷功能,同时排除了第一次排到地雷的情况)

扫雷游戏(C语言实现)初级版和优化版(增加了自动展开标记地雷功能,同时排除了第一次排到地雷的情况)

网页版jQuery扫雷小游戏源码

C | 简易版扫雷的实现