简单的扫雷程序的实现

2023-11-06

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <string.h>
#define MAX_ROW 9
#define MAX_COL 9
#define MINECOUNT 10

int Menu() {
	printf("===================\n");
	printf("欢迎来到扫雷游戏\n");
	printf("1:开始游戏\n");
	printf("0:结束游戏\n");
	printf("===================\n");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}

void Init(char showMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL]) {
	//1 针对showMap 初始化全为*
	memset(showMap, '*', MAX_ROW * MAX_COL);
	//2 针对mineMap 初始化10个地雷(根据位置随机摆放)
	//然后随机找出十个位置设成地雷
	srand((unsigned int)time(0));
	memset(mineMap, '0', MAX_ROW * MAX_COL);
	int count = MINECOUNT;
	while (count > 0) {
		int row = rand() % MAX_ROW;
		int col = rand() % MAX_COL;
		if (mineMap[row][col] == '1') {
			//已经是雷,重新随机
			continue;
		}
		mineMap[row][col] = '1';
		count--;
	}
}

void Print( char showMap[MAX_ROW][MAX_COL]) {
	//先打印最上方一行坐标
	printf("  | ");
	for (int col = 0; col < MAX_COL; col++) {
		printf("%d ", col);
	}
	printf("\n");
	printf("--+--------------------\n");
	for (int row = 0; row < MAX_ROW; row++) {
		printf(" %d| ", row);
		for (int col = 0; col < MAX_COL; col++) {
			printf("%c ", showMap[row][col]);
		}
		printf("\n");
	}
}
//row col都为输出型参数
void Input(char showMap[MAX_ROW][MAX_COL],int* row, int* col) {
	while (1) {
		printf("请输入翻开位置坐标,先行后列:\n");
		//int a = 0;
		//int b = 0;
		scanf("%d %d", row, col);
		if (*row < 0 || *row >= MAX_ROW || *col < 0 || *col >= MAX_COL) {
			printf("您的输入有误\n");
			continue;
		}
		if (showMap[*row][*col] != '*') {
			//当前位置已经翻开
			printf("当前位置已经翻开\n");
			continue;
		}
		break;
	}
}


int CheckMine(char mineMap[MAX_ROW][MAX_COL], int row, int col) {
	if (mineMap[row][col] == '1') {
		return 1;
	}
	return 0;
}

int CheckLastBlank(int* count) {
	//记录当前翻开格子数量,若格子数量为71,游戏胜利
	//进入函数就应该增加 count
	*count += 1;
	if (*count == 71) {
		return 1;
	}
	return 0;

}

void Update(char showMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL],
	int row, int col) {
	//翻开指定位置之后的要把指定位置的*替换为数字
	//1.先统计这个位置周围8个格子中有几个地雷
	int count = 0;
	//if (mineMap[row - 1][col - 1] == '1') {
	//	count++;
	//}
	for (int r = row - 1; r <= row + 1; r++) {
		for (int c = col - 1; c <= col + 1; c++) {
			if (r <0 || r >MAX_ROW || c <0 || c>MAX_COL) {
				continue;
			}
			if (r == row || c == col)
				continue;
			if (mineMap[r][c] == '1') {
				count++;
			}
		}
	}
	//把数字转成对应字符
	showMap[row][col] = count + '0';
}

void Game() {
	//1.	先创建地图(两个地图), 并初始化
	char showMap[MAX_ROW][MAX_COL] = { 0 };
	char mineMap[MAX_ROW][MAX_COL] = { 0 };
	int count = 0;
	Init(showMap, mineMap);
	while (1) {
		//2.	打印地图 showMap
		Print(mineMap);
		printf("==============================\n");
		Print(showMap);

		//3.	提示玩家输入要翻开位置的坐标, 并进行校验
		int row = 0;
		int col = 0;
		Input(showMap,&row, &col);

		//4.	判定当前位置是否是雷, 若果是雷, 游戏结束
		if (CheckMine(mineMap, row, col)) {
			Print(mineMap);
			printf("你踩雷了,游戏结束!\n");
			break;
		}
		//5.	如果当前位置是最后一个’不是雷的格子’, 那么游戏结束

		if (CheckLastBlank(count)) {
			printf("恭喜你成功了!\n");
			break;
		}
		//6.	若不是雷, 就把showMap中对应位置的* 改为一个具体的数字, 这个数组要根据当前位置周围8个格子的地雷数目来确定
		Update( showMap, mineMap, row, col);
	}

}

int main(){
	while (1) {
		int choice = Menu();
		if (choice == 1){
			Game();
		}else if (choice == 0) {
			printf("goodbye!\n");
			break;
		}
			
		
	}
	system("pause");
	return 0;
}

 

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

简单的扫雷程序的实现 的相关文章

  • ajax地图显示不出来,vue2.0加载不出echarts引用的百度地图

    1 点击选择其中一个选项就会进行ajax请求echarts并更新 现在是echarts的中加载的百度地图出不来 2 点击选项都能够正确获取到json数据 3 图表只显示了echarts中的visualMap 实际的地图并没有显示 4 lis
  • 手机存储路径问题

    今天项目一个问题涉及了手机文件存储 特此记录一下 一般手机存储分为 内部存储 和外部存储 内部存储路径获取方式有两种 String url Environment getExternalStorageDirectory File separ
  • Ztree:改变指定节点的文本样式

    Ztree 改变指定节点的文本样式 需求 打开一个页面后 生产树节点 需要改变节点的ICON和Font样式 一 更改节点的Font样式 1 更改setting属性的view对象的fontCss属性 view selectedMulti fa
  • 解锁云原生虚拟数仓 PieCloudDB Database 『第一期』

    拓数派旗下旗舰产品 PieCloudDB 采用领先的数仓虚拟化技术 为企业构建高安全 高可靠 高在线 坚如磐石 的云原生虚拟数仓 本系列文章将为大家介绍 PieCloudDB Database 最新动态和全新功能 相关视频 链接 产品试用
  • sqli-labs (less18-less19)

    less 18 头部注入 user agent 这里不补充http头的知识了 直接看源码可以看到 uname和passwd都有check input函数检查 所以直接这两个参数注入是不行的了 然后再继续看下去 有句sql语句有ip addr
  • 【多模态】12、MM-OVOD

    文章目录 一 背景 二 方法 2 1 框架总览 2 1 1 Text based classifiers from language descriptions 2 1 2 Vision based Classifiers from Imag
  • 用python开发一个炸金花小游戏

    众所周知 扑克牌可谓是居家旅行 桌面交友的必备道具 今天我们用 Python 来实现一个类似炸金花的扑克牌小游戏 先来看一下基本的游戏规则 炸 诈 金花又叫三张牌 是在全国广泛流传的一种民间多人纸牌游戏 游戏使用一副除去大小王的扑克牌 共
  • Java面经

    说在前面 自己为了准备面试Java后端开发准备的面经 部分有摘自其他网站 还有平时面试总结的 分享一下 Java开发基础 0 抽象类和接口的区别 语法 构造器 抽象类可以 接口不可以 具体方法 抽象类可以有 接口全是抽象方法 但在1 8以后
  • word论文排版和写作07:基于Zotero的参考文献格式管理

    写在前面 参考文献的样式管理应该算得上是word相较于latex的一大劣势了 如果没有特别要求的话 直接使用谷歌学术或者百度学术的几个标准的引用格式就可以 然而 大部分投稿的期刊或者会议总会有他们自己格式要求 使用latex只需要统一使用b
  • 时钟抖动(Jitter)的基本概念 【转载】

    时钟抖动 Jitter 的基本概念 李倩 发表于 2018 03 13 10 21 08 电子说 随着通信系统中的时钟速率迈入GHz级 抖动这个在模拟设计中十分关键的因素 也开始在数字设计领域中日益得到人们的重视 在高速系统中 时钟或振荡器
  • AntDB-M数据库锁分析,不要错过!

    AntDB数据库始于2008年 在运营商的核心系统上 为全国24个省份的10亿多用户提供在线服务 具备高性能 弹性扩展 高可靠等产品特性 峰值每秒可处理百万笔通信核心交易 保障系统持续稳定运行近十年 并在通信 金融 交通 能源 物联网等行业
  • 华为7c手机怎么恢复出厂设置_华为荣耀畅玩7A/7C进recovery双清格机恢复出厂设置方法...

    华为荣耀畅玩7A 7C进recovery双清格机恢复出厂设置方法 双清操作虽然不是很复杂 但是有一部分华为荣耀畅玩7A 7C机友还是不太了解的 为了让华为荣耀畅玩7A 7C新手了解一下详细的操作方法 方便以后手机的日常使用 下面华为刷机网就
  • order by 用多个条件进行排序

    select from time order by location date 解读一下 只有在location 值相同的时候 才对第二个字段的数据进行排序 默认为asc 之后我又考虑 如果我们第一个字段希望是降序呢 测试一下 select
  • Kali - 靶系统 metasploitable2 初始化修改数据库

    原本都到了0202年了 该用3 或者更高的靶系统了 但是由于网络不通 所以找了2来凑合 常规的操作 下载系统 安装虚拟机软件 导入到虚拟机里面 修改虚拟机数据库配置文件 vi etc www mutillidae config inc 将
  • dubbo服务降级和服务容错

    什么是服务降级 当服务器压力剧增的情况下 根据实际业务情况及流量 对一些服务和页面有策略的不处理或换种简单的方式处理 从而释放服务器资源以保证核心交易正常运作或高效运作 可以通过服务降级功能临时屏蔽某个出错的非关键服务 并定义降级后的返回策
  • 把c++的函数导出为dll文件

    目录 什么是dll文件 把c 函数变为dll有什么好处 开始教程 打开Visual Studio 2022创建 调整编译器设置 创建头文件 DLL1 h 创建源文件编辑函数内容 DLL1 cpp 编译成dll文件 什么是dll文件 DLL
  • 模型训练损失,正确率绘制曲线图

    import matplotlib pyplot as plt from matplotlib pyplot import MultipleLocator 创建第一张画布 plt figure 0 绘制训练损失曲线 plt plot all
  • 快速了解链码是什么?

    链码是什么 链码也就是所谓的智能合约 智能合约是由事件驱动的 具有状态的存储和运行在区块链上的程序 它通过预置了一些条件和规则 在一定的事件下触发智能合约的执行 智能合约最终的目标是在区块上生成账本数据 也就是说所有对账本的操作都是由智能合
  • 【华为OD】

    目录 一 题目描述 二 输入描述 三 输出描述 四 题目解析 五 Java玩法 六 JavaScript玩法 一 题目描述 现在有 n 个容器服务 服务的启动可能有一定的依赖性 有些服务启动没有依赖 其 次服务自身启动加载会消耗一些时间 给
  • 编写shell脚本,判断输入的IP是否正确

    编写shell脚本 判断输入的IP是否正确 IP的规则是 n1 n2 n3 n4 其中1 bin bash checkip if echo 1 egrep q 0 9 1 3 0 9 1 3 0 9 1 3 0 9 1 3 then a e

随机推荐

  • 编程高手是如何炼成的?1024页Python学习教程

    有人说Python入门一个月足矣 但也仅仅是入门 要想精通甚至成为编程高手 一个月显然不够 网络上五花八门的Python教程让编程学习者挑花了眼 但大多都是强调入门和基础 无法满足更进一步的需求 要想加深自身竞争力和增加技能傍身 更高层次的
  • Python实验——tkinter 电子时钟

    实验说明 编写程序 实现如下图所示的电子时钟 要求 1 不显示标题栏 总是顶端显示 不被其他窗口覆盖 2 实时显示日期和时间 3 可以用鼠标左键按住拖动 在电子时钟上右击可以结束程序 4 拖动时透明度变大 鼠标左键抬起时恢复半透明状态 时钟
  • Linux设备驱动程序中常用的ioctl方法和read/write方法的异同点

    ioctl是iocontrol的缩写 就是IO控制 行为上 简单来说 如果你在写驱动程序时zhi候 碰到一些IO操作 在逻辑上不能归类到read 不能归类到write 那就可以认为是ioctl的部分 read和write应该是写入和读出数据
  • 05_1_Qt工程实践_Qt开发串口通讯软件中的数据转换问题:读取时QByteArray转str;发送时格式;int转16进制格式str;string中截取字符;16进制数加法;str转BytAr

    在利用Qt进行串口程序开发过程中 除了与串口通讯的功能实现以外 数据的转换也是比较麻烦的一件事 本篇主要介绍串口通讯中数据转换的问题 关于功能实现大家在网上搜索就能找到相关案例 在完成串口的初始化等功能之后 实现数据的读取转换 参考博文 Q
  • LightGBM学习笔记

    LightGBM简介 LightGBM是GBDT算法地实现框架之一 设计的初衷是并行 高效 特点是训练速度快 内存消耗小 可并行运算 支持类别变量 LightGBM优化点 直方图算法 不同于XGBoost的预排序 LightGBM将区间离散
  • 长时间使用 Python 会降低程序员的编程能力吗?

    在编程领域 Python 是一种流行的语言 它易于学习和使用 也有很多功能强大的库和框架 但是 有些人认为长时间使用 Python 会降低程序员的编程能力 首先 编程能力不是与语言相关的 编程能力是指能够设计和实现高质量的软件解决方案的能力
  • Activiti源码分析

    Activiti是业界很流行的java工作流引擎 关于Activiti与JBPM5的关系和如何选择不是本文要讨论的话题 相关内容可以baidu一下 Activiti从架构角度看是比较优秀的 是很面向对象的 是我所阅读过的代码结构很棒的开源软
  • Element ui table获取当前索引值 index

    使用 scope index来获取当前索引值
  • CSS/HTML静态购物网站项目源码解析(品优购)——该项目包含主页、注册页、列表页三个网页

    注 该项目所涉及的素材文件请QQ联系作者 Etui 3416252112 首先 上图 index html 主页 register html 注册页 list html 列表页 摘要 作为一个前端初学者 这是我学完html和css基础后做的
  • [Rpackage]R无法安装包的终极解决方法,附详细步骤

    作为R的新使用者 我曾经也经常碰上某些R包死活无法安装的问题 例如机器学习调参的caret包等 网上很多方法也都没法解决 除却少数个别包之外 大部分的包都支持最新的R版本 一 下载最新的R包 https cran r project org
  • Hooks API 在 Vue 中的实现分析

    作者 长峰 初次听到 React Hooks 是在其刚发布的那几天 网上铺天盖地的文章介绍它 看字面意思是 React 钩子 就想当然地理解应该是修改 React 组件的钩子吧 React 延伸的概念非常多 高阶组件 函数式 Render
  • BearPi-IoT Std学习笔记9——使用I2C读取BH1750光强度传感器数据

    1 BH1750模块 E53 SC1扩展板 BH1750FV1是两线式串行总线接口 IIC 的16位数字输出型环境光强度传感器 利用它的高分辨率可以探测较大范围内的光照强度变化 1lx 65535lx BH1750的原理图如下 2 配置 首
  • 解决XShell和Xftp远程连接Ubuntu失败,报找不到匹配的key exchange算法的错误

    我下载的linux系统是当前最新的Ubuntu 20 04的 使用的远程连接工具是XShell 5和Xftp 4 XShell可以连上 但是Xftp就一直报下图这个错误 尝试了删除ssh host的各种key 然后重新生成 重启ssh服务
  • 个人wiki搭建资料整理

    个人wiki搭建 一 大型企业级wiki Confluence Confluence是一个专业的企业知识管理与协同软件 也可以用于构建企业wiki 使用简单 但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息 文档协作 集体讨论 信息
  • Java中NIO和IO的比较

    NIO是为了弥补IO操作的不足而诞生的 NIO的一些新特性有 非阻塞I O 选择器 缓冲以及管道 管道 Channel 缓冲 Buffer 选择器 Selector 是其主要特征 概念解释 Channel 管道实际上就像传统IO中的流 到任
  • m3u8格式的视频链接怎么在自己电脑上播放

    本文接上篇文章 网页播放器 CKplayer 的视频怎么下载 m3u8简单探索 上篇文章提到 怎么到视频网站通过浏览器抓包分析 得到视频的源地址 看这篇文章之前 最好可以去先看一看上篇博文的介绍 上篇文章我们介绍到我们能够得到视频的源地址
  • SpringBoot 之数据源配置

    文章目录 市面上的几种数据源比对 SpringBoot自动装配DataSource原理 HiKariCP 数据源配置 Druid 数据源配置 SpringBoot集成Druid连接池 Druid 多数据源配置 不同Mapper操作不同数据源
  • 初等模型---光盘的数据容量

    问题分析 光盘的外观尺寸是由些大公司成立的联盟决定的 如CD DVD等盘片的外径为120mm 并且沿外边缘留有2mm宽的环形区域不存储信息 CLV光盘存储信息的内圈直径为45mm 在内外圈之间的环形区域 经过编码的数字信息 以一定深度和宽度
  • MySQL 8用户及权限管理

    文章目录 参考文档 查看权限 安装后 登录测试 添加帐户 分配特权和删除帐户 扩展 创建远程访问新用户并授权 参考文档 官方链接 https dev mysql com doc refman 8 0 en create user html
  • 简单的扫雷程序的实现

    define CRT SECURE NO WARNINGS include