简单扫雷代码详解

目录

1>>前言

2.1>>扫雷需要做,思路是怎么样的?

2.1.1>>第一步:菜单

2.1.2>>第二步:难度选择

2.1.3>>第三步:化繁为简,初始化棋盘

2.1.4>>第四步:显示棋盘看看

2.1.5>>第五步:插雷

2.1.6>>第六步:排雷代码

3>>总结

1>>前言

        感谢大家对之前文章的喜欢,非常感谢!昨天没更新是在写扫雷,我写了6h20m,今天我给大家带来的是扫雷,我也是个小白,代码写的有问题可以提出来我会吸取教训,做的更好,谢谢大家!后面会附上原代码!

2.1>>扫雷需要做,思路是怎么样的?

        首先,我们通常玩的扫雷是点击的,并且功能较为完善,点非炸弹就显示周围有多少炸弹,并且还有难度可以选择,有棋子可以标记,有时间正数。当我刚想写扫雷的时候,我感觉这太难了,至少我现在所学是比较困难的,所以我们现在只能写一个较为简单的版本,后面在优化。这是一个效果图,如果和我一样的小白想做可以尝试一下

2.1.1>>第一步:菜单

        菜单的操作就比较简单了,在前面的猜数字文章我也讲到过,我们在主函数连接一个名为menu的菜单,定义为无返回值,然后在里面进行printf操作即可。

菜单结束我们需要选择,这里选错还是选玩游戏都要重复进行操作,所以我们需要使用循环解决这类问题,然后在使用switch语句判断即可。这里的game是游戏内容的函数,可以自定义。

2.1.2>>第二步:难度选择

        前面的图可以看到我的难度有3个,分别是简单、中等、困难,它们对应着不同的行和列,所以我们这里要写if或switch语句判断,再接着数组里要用到不同数字,所以我们用宏定义来解决。

row代表行,col代表列,另外要使x1,y1都能使用在其他地方,就得将它们定义成全局变量!rows在下面解释

2.1.3>>第三步:化繁为简,初始化棋盘

        做初始化,我第一个想到的就是数组,这里我们需要用到二维数组,因为它有行和列,所以在这里先定义一个数组,然后写一个函数对该数组进行操作。我选择用两个二维数组,一个放地雷,一个放我们显示的*号和数字。将'1'字符1设置为地雷,字符'0'设置为非雷,我们显示就用'*'

这边直接叫初始化的中文全拼,其他我也是一样,数组1用雷,数组二用数作为名字,方便自己也方便大家读代码。这边数组行列用rows和cols是因为要加两行,这时候我们定义的非零就有用了,判断雷的时候在边角可能就会越界,所以加两行。这里初始化传参的时候,两个数组大差不差,所以用同一个函数,那要实现分别初始化,我们就得传字符0和字符*号。

这里要注意数组的类型为字符型,行列是整型,set是字符型。

2.1.4>>第四步:显示棋盘看看

        这里显示棋盘可以看到我们之前的代码有没有什么问题,并做出相应改变。显示这里比较简单,要注意的就是周围的数字可以一起打印,方便玩家看。

2.1.5>>第五步:插雷

        现在需要给第一个数组插上雷,因为我们需要的效果是雷的随机分布,所以也要用到我们前两章讲解的随机数,这边附上链接,不懂的可以看看猜数字完全体?还能优化不?-CSDN博客每插一个雷,就将需要的雷减减,直至归零

2.1.6>>第六步:排雷代码

        就这里要写的是最多的,大家放心食用,首先,输入要扫的位置,给上scanf输入函数,让玩家输入,然后进行判断(arr1表示雷,arr2表示数),这个坐标在arr1里是否是雷,若是则游戏结束,若不是则计算周围雷数。这里我们需要实现在第二个数组上显示周围雷的数字,就是我们需要判断周围有几个'1'已知这个字符1在ASCII码中是49,而字符0是48。我们只需要计算周围的坐标内容是否等于'1'也就是49就好,理论成立。这里就用函数计算jusuan。最后返回的值用字符s接收,因为我们算出来的是一个整形,所以加上'0'也就是48就可以得到字符型,在我们的字符数组就不会出错。此时已经完成大半,最终胜利条件满足就显示雷棋盘就好。

附:代码

#include<stdio.h>
#include<stdlib.h>//随机数头文件
#include<time.h>//时间头文件
#include<windows.h>

int x1=0;
int y1=0;
int L1=0;
void menu()//菜单 
{
	printf("******扫雷小游戏******\n");
	printf("******  1.play  ******\n");
	printf("******  2.eixt  ******\n");
	printf("**********************\n");
	printf("******作者:feng******\n");
}

void nandu()//难度 
{

	int m=0;
	printf("**      设置游戏难度    **\n");
	printf("** 1.简单9乘9,10颗雷   **\n");
	printf("** 2.中等16乘16,40颗雷 **\n");
	printf("** 3.困难30乘16,99颗雷 **\n");
	printf("******  作者:feng  ******\n");
	printf("请选择:>") ;
	scanf("%d",&m);
	if (m==1) 
	{
		x1=9;
		y1=9;
		L1=10;
	 } 
	else if (m==2)
	{
		x1=16;
		y1=16;
		L1=40;
	}
	else if (m==3)
	{
		x1=30;
		y1=16;
		L1=99;
	}
	else 
	{
		printf("输入错误,吴迪了孩纸,返回主菜单\n");
	 } 
	#define row x1
	#define col y1
	#define rows x1+2
	#define cols y1+2
}

void chushihua(char arr[rows][cols],int x,int y,char set)//初始化函数 
{

	int i=0;
	for (i=1;i<=x;i++)
	{
		int j=0;
		for (j=1;j<=y;j++)
		{
			arr[i][j]=set;
		}
	}
}
void xianshi(char arr[rows][cols],int x,int y)//显示函数 
{
	
	int i=0;
	printf("00  ");
	for (i=1;i<=y;i++)
	{
		printf("%02d ",i);
	 } 
	 printf("\n\n");
	for (i=1;i<=x;i++)
	{
		printf("%02d  ",i);
		int j=0;
		for (j=1;j<=y;j++)
		{
			printf("%c  ",arr[i][j]);
		}
		printf("\n");
	}
}
void chalei(char arr[rows][cols],int x,int y)
{
	int xx=L1;
	while (xx)
	{
		int h=rand() % x+1;
		int l=rand() % y+1;
		if (arr[h][l] != '1')
		{
			 arr[h][l] = '1';
			 xx--;
		}
	}
}
int jisuan(char arr1[rows][cols],int h,int l)
{
	int i=0;
	int sum=0;
	for (i=h-1;i<h+2;i++)
	{
		int j=0;
		for (j=l-1;j<l+2;j++)
		{
			if (arr1[i][j] == '1')
			{
				sum++;
			}
		}
	}
	return sum;
}
void pailei(char arr1[rows][cols],char arr2[rows][cols],int x,int y)
{
	int win=x*y-L1;
	do 
	{
		 
		int h=0,l=0;
		printf("请输入你要扫的位置,如\"2 3\":>");
		scanf("%d %d",&h,&l);
		if (arr1[h][l]=='1')
		{
			printf("你踩雷了,游戏结束\n");
			printf("————————————————————————————\n") ;
			xianshi(arr1,row,col);
			printf("————————————————————————————\n") ;
			break; 
		 } 
		else 
		{
			char s=jisuan(arr1,h,l)+'0';
			arr2[h][l]=s;
			win--;
			xianshi(arr2,row,col);
		}
	}while (win);
	if (win==0)
	{
		printf("游戏胜利,太nb啦\n");
		printf("这是雷区分布:\n");
		printf("————————————————————————————\n") ;
		xianshi(arr1,row,col); 
		printf("————————————————————————————\n") ;
	}
}
void game()//游戏内容 
{
	nandu();
	//分为四步:1.初始化棋盘
	//		   	2.显示棋盘
	//			3.插雷进去
	//			4.排雷开始
	//定义两个数组,一个放雷,一个放数字
	char lei[rows][cols];
	char shu[rows][cols]; 
	chushihua(lei,row,col,'0');
	chushihua(shu,row,col,'*');
//	xianshi(lei,row,col);
//	xianshi(shu,row,col);
	chalei(lei,row,col);
//	xianshi(lei,row,col);
	xianshi(shu,row,col);
	pailei(lei,shu,row,col);

}

int main()//主函数 
{
	srand((unsigned int)time(NULL));  
	int n=0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d",&n); 
		switch (n) 
		{
			case 1:
				printf("扫雷小游戏开始\n"); 
				game();
				break;
			case 2:
				printf("爱玩不玩,退出游戏\n");
				n=0;
				break;
			default:
				printf("输入错误,请重新输入\n");
				break;
		}
	} while (n);	
	return 0;
}

3>>总结

        简单扫雷到这里也就结束了,没写感觉挺难,但是思路清晰感觉也还可以,没有想象中的那么难,希望这篇文章能给小白一点帮助。这篇文章耗时1h34m,个人感觉写的比前面的好了,但离优质文章还有很长一段路要走,希望大佬多多给点建议,多多指点,小编在此感激不尽!谢谢!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫の大一

谢谢大佬,我会三连你的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值