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++扫雷源程序https://download.csdn.net/download/m0_48463380/85551552

  • 25
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值