扫雷(初阶)

2023-11-13

细节决定成败!

目录

打印菜单

创建棋盘并打印

埋雷

排雷

 判断输赢


 

扫雷游戏规则

当棋盘内除去有地雷的格子,全被排除那么就会胜利,反之当玩家排到一颗雷就会被炸西

根据三子棋的写法,扫雷程序也是需要分为几个文件,声明函数的文件,定义函数的文件和游戏实现的文件

首先还是思考出一个大方向之后在慢慢优化

第一步还是打印一个菜单

第二部创建棋盘并打印

第三步随机埋雷

第四步排雷并判断

第五步判断输赢

大方向就这样,其余细节在程序中优化

打印菜单

创建棋盘并打印

1.创建两个二维数组,一个负责存放雷的信息,一个负责与放雷盘进行比对

2.初始化两个数组,雷盘初始化全 '0',雷用 ’1‘表示,排雷盘初始化全 '*',后续需要在输入的坐标中显示周围地雷的个数

3.由于输入坐标可能在棋盘边界,后续扫描周围八个坐标会造成数组越界,所以让行和列都加上2

创建一个11*11的棋盘,排雷,放雷,打印棋盘都只使用9*9的数组

4.定义行,列为常量,方便更改棋盘大小

5.添加行号,列号方便输入坐标

6.一切都可以创建为函数封装,使程序模块化

当然后续不会打印雷盘。

埋雷

1.随机生成地雷放入雷盘当中,通过rand函数实现

2.地雷的个数也创建为常量,方便后续更改地雷个数

这样地雷就布置好了

排雷

 1.玩家输入坐标排雷,判断坐标是否有雷,扫描周围八个坐标标是否存在地雷,并在输入坐标中显示地雷个数

2.判断地雷,输入坐标有地雷,跳出循环,并打印雷盘

3.扫描周围八个坐标,有雷就加加,最后返回,因为创建的数组是11*11而使用的是9*9棋盘所以不会发生数组越界

 判断输赢

1.当整个数组的元素减去雷的个数就是需要排掉的个数,每排掉一个坐标计数器就会加加,然后判断,直到排完地雷判断条件符合跳出循环,宣布胜利

更多细节尽在程序中

游戏实现.c文件

#include"test.h"//自定义头文件中包含了其它头文件
void game()
{
	//创建棋盘(数组)
	//存放字符创建字符二维数组数组
	//创建两个棋盘put放地雷get排雷
	char put[ROWS][COLS] = { 0 };
	char get[ROWS][COLS] = { 0 };
	使用初始化数组函数
	//雷阵初始化为全零
	init(put, ROWS, COLS, '0');
	//排雷阵初始化为全*
	init(get, ROWS, COLS, '*');
	//使用打印数组函数
	print(get, ROW, COL);
	//使用埋地雷函数
	bur(put, ROW, COL);
	//使用排雷判断函数
	jud(put, get, ROW, COL);//判断地雷盘是否是地雷,周围八个数有几个雷,后再传给排雷盘
}
void test()
{
	int a = 0;
	do//先打印一遍菜单
	{
		menu();
		printf("请选择\n");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
		{
			game();
			break;
		}
		case 0:
		{
			printf("退出游戏\n");
			break;
		}
		default:
		{
			printf("选择错误\n");
			break;
		}
		}
	} while (a);

}
int main()
{
	//创建随机值起点
	srand((unsigned int)time(NULL));
	test();
	return 0;
}

游戏函数声明文件

//此文件用来声明函数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//行,列
#define ROW 9
#define COL 9
//行列各加2防止查找周围八个数时数组越界
//不要太依赖标识符常量,尽量传参
#define ROWS ROW+2
#define COLS COL+2
#define lei 10//创建雷的个数,方便后期修改个数
//声明菜单函数
void menu();
//声明初始化数组
void init(char arr[ROWS][COLS], int row, int col, char ch);
//声明打印数组,传11*11打印9*9
void print(char arr[ROWS][COLS], int row, int col);
//声明埋地雷函数
void bur(char arr[ROWS][COLS], int row, int col);
//声明判断排雷
void jud(char put[ROWS][COLS], char get[ROWS][COLS], int row, int col);

游戏定义文件

//此文件用来定义函数
#include"test.h"
//菜单定义
void menu()
{
	printf("****************\n");
	printf("***1.开始游戏***\n");
	printf("***0.结束游戏***\n");
	printf("****************\n");
}
//定义初始化数组
void init(char arr[ROWS][COLS], int row, int col, char ch)
{
	//遍历数组初始化字符
	int i = 0;
	int n = 0;
	for (i = 0; i < row; i++)
	{
		for (n = 0; n < col; n++)
		{
			//没必要再写一个函数初始化排雷数组
			//只有复制的符号不同
			arr[i][n] = ch;
		}
	}
}
//定义打印数组
void print(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	int n = 0;

	printf("--------------------\n");
	//打印行列号方便输入
	for (n = 0; n <= col; n++)
	{
		printf("%d ", n);
	}
	printf("\n");
	//只打印9*9的符号
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (n = 1; n <= col; n++)
		{
			printf("%c ", arr[i][n]);
		}
		printf("\n");
	}
}
//定义埋雷函数
void bur(char arr[ROWS][COLS], int row, int col)
{
	//创建随机下标,十颗地雷
	int j = lei;
	while (j)
	{
		int i = rand() % row + 1;
		int n = rand() % col + 1;
		if (arr[i][n] == '0')
		{
			arr[i][n] = '1';
			j--;
		}
	}
}
//定义周围地雷个数
int ret(char arr[ROWS][COLS], int i, int n)
{	//'0'的阿斯克码值是48'1'是49,'1'-'0'=1 当有2个字符0就是98两个字符0是96相减等于2
	//就表示周围一圈有2个雷
	return (arr[i + 1][n + 1] + arr[i][n + 1] + arr[i - 1][n + 1] + arr[i - 1][n] +
		arr[i - 1][n - 1] + arr[i][n - 1] + arr[i + 1][n - 1] + arr[i + 1][n] - 8 * '0');
}
//定义排雷判断
void jud(char put[ROWS][COLS], char get[ROWS][COLS], int row, int col)
{
	//玩家输入下标
	int i = 0;
	int n = 0;
	int k = 0;
	while (k < (row * col - lei))//总数减去雷就是所有可以排的
	{
		printf("请输入坐标 :");
		scanf("%d %d", &i, &n);
		//判断输入是否合法
		if (1 <= i && row >= i && 1 <= n && col >= n)
		{
			//判断坐标是否重复
			if (get[i][n] != '*')
			{
				printf("已经排过\n");
				//直接重新再输入不向下输入
				continue;
			}
			//判断是否挖到雷
			if (put[i][n] == '1')
			{
				printf("恭喜你,被炸西啦!\n");
				//打印雷盘让你凉的明白
				print(put, row, col);
				break;
			}
			else
			{
				int p = 0;
				//使用ret函数计算周围八个坐标有没有雷,并返回个数
				p = ret(put, i, n);
				//数组是字符类型的,不能直接使用
				// '0''1'2'的ASCII值分别是48,49,50
				// 而p如果返回2,当p+'0'=50也就是'2'了
				get[i][n] = p + '0';
				print(get, ROW, COL);
				k++;//计数器
			}
		}
		else
		{
			printf("请重新输入\n");
		}

	}
	if (k == (row * col - lei))
	{
		printf("恭喜你赢了\n");
		print(get, row, col);

	}

此游戏还可以优化为输入坐标后展开一片,直到周围都有地雷,标记你认为的地雷……

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

扫雷(初阶) 的相关文章

  • Java中ASCII码与字符之间的相互转换

    ASCII码转字符 char word char 97 强制转换 字符转ASCII码 int value a 加
  • STM32 进阶教程 17 - ADC注入通道

    前言 STM32 的ADC的一个强大功能是支持触发注入功能 在103中每个ADC模块支持4个注入通道 每个注入通道具有独立的结果突存器 注入通道具有较规划通道更高的优先级 在实际工程应用中 注入通道更多地会使用外部触发方式进行触发转换 关于
  • 时序预测相关技术分享

    时序预测相关技术分享 时序预测是指对时间序列数据进行预测 以预测未来的趋势或行为 在实际生产和应用中 时序预测广泛应用于金融 电力 交通等领域 时序预测可以帮助人们更好地理解和掌握未来的趋势和规律 从而做出更明智的决策 时序预测技术的方法和
  • 两个虚拟机互相拷贝文件或者文件夹

    互相拷贝文件 scp root k8s images tar bz2 root 192 168 33 16 root 将mysql配置文件上传到16服务器相应文件夹内 scp root 192 168 33 16 etc mysql my
  • React + Ts 实现三子棋小游戏

    在这里阅读效果更佳 还记得当年和同桌在草稿纸上下三子棋的时光吗 今天我们就用代码来重温一下年少 假设你有react基础 没有也行 只要你会三大框架的任意一种 上手react不难 游戏规则 双方各执一子 在九宫格内一方三子连成线则游戏结束 九
  • 为什么程序员都想进互联网大公司,看看福利就知道了

    每年年的最后一个月 一年的辛苦不易除了放假就盼着年终奖了 一直以来被外行人称为 钱多话少 的程序员 到了年底也都能拿到不少的年终奖 毕竟都是996拼出来的 那么国内的互联网年终奖能拿到多少呢 年终奖只是一个平均的 因为每个人的入职时间不同

随机推荐

  • linux离线安装glibc.i686

    一 下载相关rpm包 链接 https pan baidu com s 1Of1myRZa2ClrlSYw43OR3Q 提取码 hlsq 二 将相关rpm包复制到服务器上 三 执行sh install sh即可
  • 如果当前node.js版本和项目需要版本不一样,卸载重装其他版本node.js的方法

    其实这种node js版本不一样的问题 可以选择用nvm来管理node js的不同版本 此处仅总结卸载当前版本node js 重新安装所需版本node js的方法 另 现在 用Vite官网里面的 yarn npm等 的方法 创建Vue3项目
  • DOPI EV200轻松跑debain+jupyter

    硬件 DOPI EV200开发板 一张16G的TF卡 一条usb线 安装好RNIDS驱动 并分配IP地址 详细参考玩转rtsp一文章 上电启动后 程序从Nand Flash启动后 文件系统制作在TF卡中 debain jupyter在1 3
  • ST-Link/v2驱动安装

    链接 https pan baidu com s 1ZXAxwZa46z6K8 U3HW0qvg 提取码 ofmu 从连接里拿到一个名为en stsw link009 v2 0 2 zip的压缩包 如上图所示 新建一个文件夹 ST Link
  • 【微信小程序】文章设置

    设置基本字体样式 行高 首行缩进 font size 32rpx line height 1 6em text indent 2em padding 20rpx 0 border bottom 1px dashed var themColo
  • rabbitmq基础7——队列和消息过期时间设置、死信队列、延迟队列、优先级队列、回调队列、惰性队列

    文章目录 一 过期时间 1 1 针对队列设置 1 2 针对消息设置 二 死信队列 2 1 死信交换器 2 2 死信队列原理 2 3 延迟队列 特殊用法 三 优先级队列 3 1 监控页面创建优先级队列 3 2 监控页面创建优先级消息 四 回调
  • 【有限元分析】网格形状和网格尺寸对结果的影响——以矩形杆的静力分析为例

    本文研究了网格形状和网格尺寸对计算结果的影响 现研究一个矩形截面的杆件 如图1 1 对其末端施加两种等效的载荷 在末端面施加remote force 100N的力 如图1 2所示 对杆件进行2种网格形状划分 分别是六面体网格和四面体网格 如
  • 金融术语总结

    洗钱 将犯罪或其他非法违法行为所获得的违法收入 通过各种手段掩饰 隐瞒 转化 使其在形式上合法化的行为 存量客户 某个时间段里原先已有的客户 与新增客户相对应 月活跃用户数量 MAU Monthly Active User MAU 是当月登
  • 网页常用小技巧(JavaScript)

    1 nc ntextmenu window event returnValue false 将彻底屏蔽鼠标右键 table border border td no td table 可用于Table 2 取消选取 防止复制 3 npaste
  • java日志框架详解

    一 日志的概念 日志文件是用于记录系统操作事件的文件集合 可分为事件日志和消息日志 具有处理历史数据 诊断 问题的追踪以及理解系统的活动等重要作用 二 现有的日志框架 JUL java util logging logback log4j
  • Swagger注解详解

    目录 1 Api 2 APiOperation 3 ApiImplicitParams 4 ApiResponses 5 ApiModel 6 ApiModelProperty 这里是说明常用注解的含义和基本用法 也就是说已经对swagge
  • 使用反射对单例模式进行攻击的讨论

    我们都知道在单例模式中 对构造函数进行私有化private修饰 保证了类不能使用new进行对象的实例化 但是如果使用反射获取构造函数 在进行实例化就会导致private失效 作者用中文作为类名 请读者勿怪 纯属喜好 工作中是不允许的哦 ja
  • 为什么我们要考虑线性规划的对偶问题?

    文章转自 https www zhihu com question 26658861 版权归原作者
  • 更改计算机bios密码怎么办,计算机BIOS通用密码的修改

    电脑信息的保密一直是一个重要的话题 众所周知 在BIOS设置菜单中 有两个密码设置栏目 Supervisor Password 超级用户密码 和User Password 一般用户密码 可以说是电脑资料保密的第一道防线 这两组密码搭配BIO
  • 2023届秋招,我重新认清了自己

    仅记录个人经历 充满主观感受 甚至纯属虚构 仅供参考 杠就是你对 本想毕业再写 但是考虑到等毕业了 24秋招的提前批就快开始了 大概就来不及了 正好现在有点时间 陆陆续续的写了出来 个人情况 学历 苏北二本 加南京某211 现在二本三本合并
  • 【转载】PMOS,NMOS

    NMOS保证截止 发生在G电位小于等于S PMOS保证截止 发生在G电位大于等于S 寄生二极管是因为基底与Source连接形成的PN结
  • JQuery获取多个name相同select/input框的value值

    JavaWeb jsp页面 使用c forEach 循环多个select下拉框 name相同获取被选中的值 jsp
  • 虚拟机连接不上网络,解决办法

    虚拟机连接不上网络解决思路 简单的介绍了VM虚拟机常用的三种网络连接方式 一般用NAT方式虚拟机就很容易上网的 所以一般没有特殊要求推荐用NAT方式 1 桥接 就是把虚拟机通过VMnet0桥接到主机的本地连接 现在虚拟机是通过VMnet0与
  • NestedScrollView RecycleView 嵌套 滑动冲突

    NestedScrollView RecycleView 嵌套 滑动冲突 场景描述 效果演示 实现思路 问题和优化 优化 参考文档 场景描述 使用NestedScrollView 内嵌RecycleView时 当用户上滑时 NestedSc
  • 扫雷(初阶)

    细节决定成败 目录 打印菜单 创建棋盘并打印 埋雷 排雷 判断输赢 扫雷游戏规则 当棋盘内除去有地雷的格子 全被排除那么就会胜利 反之当玩家排到一颗雷就会被炸西 根据三子棋的写法 扫雷程序也是需要分为几个文件 声明函数的文件 定义函数的文件