首页 > 其他分享 >简单扫雷代码详解

简单扫雷代码详解

时间:2024-08-15 18:26:21浏览次数:9  
标签:int 代码 详解 扫雷 数组 printf 2.1 col row

目录

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,个人感觉写的比前面的好了,但离优质文章还有很长一段路要走,希望大佬多多给点建议,多多指点,小编在此感激不尽!谢谢!

标签:int,代码,详解,扫雷,数组,printf,2.1,col,row
From: https://blog.csdn.net/m0_69282950/article/details/141226061

相关文章

  • C语言最后一讲——预处理超详解
    文章目录1.预定义符号2.`#define`定义常量3.`#define`定义宏4.带有副作用的宏参数5.宏替换的规则6.宏函数的对比7.#和##7.1#运算符7.2##运算符8.命名约定9.`#undef`10.命令行定义11.条件编译12.头文件的包含12.1头文件被包含的方式:12.1.1本地文......
  • 代码随想录算法训练营 | 动态规划 part01
    509.斐波那契数509.斐波那契数状态转移方程:F(0)=0,F(1)=1F(n)=F(n-1)+F(n-2),其中n>1递归,太多重复计算classSolution{public:intfib(intn){if(n==0||n==1){returnn;}returnfib(n-1)......
  • 025集——CAD中块(Block)和块参照——vba代码实现
    VBA类名AcadBlock 创建方法Blocks.Add 访问途径Blocks.ItemLayout.Block 块有三种类型:简单块,XRef块和布局块。简单块是可以联合在一起形成单个对象或块定义的对象集合。用户可以在图形中插入、旋转对象以及调整对象的比例。用户可以把简单块炸开成组成对......
  • 代码随想录算法训练营第一天 | 704. 二分查找,27. 移除元素
     704.二分查找题目链接:https://leetcode.cn/problems/binary-search/1,左闭右闭publicintsearch(int[]nums,inttarget){intlow=0;inthigh=nums.length-1;while(low<=high){intmid=(high+low)/2;if(num......
  • 【问题解决】PageOffice打开word文档报错:Office运行时错误,部分系统文件可能丢失或已损
    打开wps,右上角配置和修复工具取消勾选,确定再打开,重新勾选,确定,退出重启电脑,验证。--PS:本人自测成功,有些人的机器安装有MicrosoftOffice,取消之后(不需要重新勾选)就可以了;本人机器只安装了WPS适合这种操作。......
  • 2024年Cisco思科认证体系详解
    思科作为全球领先的网络设备供应商,其认证体系在全球范围内被广泛认可;但是大部分了解的朋友都只知道CCNA、CCNP和CCIE,但对思科的整个系统不是很清楚。随着Cisco产品线的扩大和市场份额的不断提升,Cisco认证产品从当初仅有的路由交换发展到现在的多个方向。思科认证共分为五......
  • 【微调大模型参数详解】以chatGLM为例
    微调chatGLM3-6b-base时涉及的一些重要参数的详细解释batch_size:批量大小,默认为4,每个GPU的训练批量大小。增加该值可以提高训练速度,但可能需要更多的显存。lora_r:LoraR维度,默认为64,指定Lora训练中用于调节的R维度大小。该参数影响Lora模块的复杂度和模型的表现。......
  • 代码审计(文件读取、下载、写入)
    一、梦想CMS1.4后台任意文件读取漏洞复现国家信息安全漏洞共享平台(cnvd.org.cn)通过找关键词file_get_contents1、进入后台观察url,是通传参地址来进行访问的,猜测通过文件读取;2、分析读取的原理通过搜索文件读取的函数找一下实现的位置发现有path参数的,判断是否是可控传......
  • 在C/C++中嵌入Lua代码及使用VS Code调试
     Lua在设计之初就是为了嵌入到应用程序中,为这些应用程序提供灵活的扩展和定制功能。Lua的核心是用C语言编写的,所以Lua脚本可以很容易地与C/C++代码进行交互,通过Lua脚本,用户可以在不修改原有C/C++代码的基础上,实现功能的扩展和定制。 在C/C++程序中可以使用Lua来编写一些需......
  • mysql数据库 行级锁,间隙锁和临键锁详解
    目录准备查看锁命令演示普通的select语句共享锁与排他锁无索引行锁升级为表锁间隙锁&临键锁索引上的等值查询(索引为唯一索引)索引上的等值查询(索引为普通索引)索引上的范围查询(唯一索引)准备我的mysql版本是8。CREATETABLE`user`(`id`intunsignedN......