当前位置: 首页 > news >正文

C语言实战——扫雷游戏

目录

  • 1. 扫雷游戏分析和设计
  • 2.扫雷游戏的代码实现

1. 扫雷游戏分析和设计

1.1扫雷游戏的功能说明

  • 使用控制台实现经典的扫雷游戏
  • 游戏可以通过菜单实现继续玩或者退出游戏
  • 扫雷的棋盘是9*9的格子
  • 默认随机布置10个雷
  • 可以排查雷
    如果位置不是雷,就显示周围有几个雷
    如果位置是雷,就炸死游戏结束
    把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束。

游戏的界面:

  • 初始界面:
    在这里插入图片描述
  • 排雷界面:
    在这里插入图片描述
  • 排雷失败界面:
    在这里插入图片描述

1.2 游戏的分析和设计
1.2.1 数据结构的分析
扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。
因为我们需要在9* 9的棋盘上布置雷的信息和排查雷,我们首先想到的就是创建⼀个9*9的数组来存放信息。
在这里插入图片描述

那如果这个位置布置雷,我们就存放1,没有布置雷就存放0。
在这里插入图片描述

假设我们排查(2,5)这个坐标时,我们访问周围的⼀圈8个黄色位置,统计周围雷的个数是1。
假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个黄色位置,统计周围雷的个数时,最下面的三个坐标就会越界,为了防止越界,我们在设计的时候,给数组扩大一圈,雷还是布置在中间的9*9的坐标上,周围⼀圈不去布置雷就行,这样就解决了越界的问题。所以我们将存放数据的数组创建成11 *11是比较合适。

排雷的假设
在这里插入图片描述

周围加上⼀圈的棋盘
在这里插入图片描述

再继续分析,我们在棋盘上布置了雷,棋盘上雷的信息(1)和非雷的信息(0),假设我们排查了某⼀个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪里呢?如果存放在布置雷的数组中,这样雷的信息和雷的个数信息就可能或产生混淆和打印上的困难。

这里我们肯定有办法解决,比如:雷和非雷的信息不要使用数字,使用某些字符就行,这样就避免冲突了,但是这样做棋盘上有雷和非雷的信息,还有排查出的雷的个数信息,就比较混杂,不够方便。

这里我们采用另外⼀种方案,我们专门给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不干扰了,把雷布置到mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期排查参考。

同时为了保持神秘,show数组开始时初始化为符’*‘,为了保持两个数组的类型⼀致,可以使用同⼀套函数处理,mine数组最开始也初始化为字符’0’,布置雷成’1’。如下如:

mine数组布置雷后的状态
在这里插入图片描述

show输出初始化的状态
在这里插入图片描述

对应的数组应该是:

char mine[11][11] = {0};//⽤来存放布置好的雷的信息 
char show[11][11] = {0};//⽤来存放排查出的雷的个数信息

1.2.2 文件结构设计
使用多文件的形式对函数的声明和定义,我们设计三个文件:

1.test.c //文件中写游戏的测试逻辑
2. game.c //文件中写游戏中函数的实现等
3. game.h //文件中写游戏需要的数据类型和函数声明等

2.扫雷游戏的代码实现

game.h

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2//雷的数量
#define EASY_COUNT 10//初始化棋盘
void InitBoard(char arr[ROWS][COLS], int rows, int cols,char set);//打印棋盘
void DisplayBoard(char arr[ROWS][COLS], int row, int col);//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS #include "game.h"void InitBoard(char arr[ROWS][COLS], int rows, int cols,char set)
{for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){arr[i][j] = set;}}
}void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{printf("------扫雷游戏------\n");//打印行号for (int i = 0; i <= col; i++){printf("%d ", i);}printf("\n");for (int i = 1; i <= row; i++){//打印列号printf("%d ", i);for (int j = 1; j <= col; j++){printf("%c ", arr[i][j]);}printf("\n");}
}void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y]=='0'){mine[x][y] = '1';count--;}}
}int FindMineCount(char mine[ROWS][COLS], int x, int y)
{int count = 0;for (int i = x - 1;i <= x + 1; i++){for (int j = y - 1; j <= y + 1; j++){count += (mine[i][j] - '0');//(易错点)}}return count;
}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win<row*col- EASY_COUNT){printf("请输入坐标:>");scanf("%d %d", &x, &y);//判断坐标的有效性if (x >= 1 && x <= row && y >= 1 && y <= col){//判断是否已经排查过了if (show[x][y] == '*'){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");DisplayBoard(mine, ROW, COL);break;}else{//不是雷,就要统计周围的雷的个数int count = FindMineCount(mine, x, y);show[x][y] = count + '0';  //(易错点)DisplayBoard(show, ROW, COL);win++;}}else{printf("该坐标已经被排查,请重新输入。\n");}}else{printf("坐标非法,请重新输入。\n");}}if (win == row * col - EASY_COUNT) //(易错点){printf("恭喜你,扫雷成功!\n");DisplayBoard(mine, ROW, COL);}
}

test.c

#define _CRT_SECURE_NO_WARNINGS #include "game.h"void menu()
{printf("******************\n");printf("*****  1.play ****\n");printf("*****  0.exit ****\n");printf("******************\n");
}void game()
{//建立棋盘//布置雷的信息的棋盘char mine[ROWS][COLS] = { 0 };//显示雷的个数的棋盘char show[ROWS][COLS] = { 0 };//初始化棋盘//mine棋盘初始化为‘0’InitBoard(mine, ROWS, COLS,'0');//show棋盘初始化为‘*’InitBoard(show, ROWS, COLS,'*');//布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//打印棋盘DisplayBoard(show, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);}void test()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏!\n");break;default:printf("选择错误,请重新选择。\n");break;}} while (input);
}int main()
{test();return 0;
}

相关文章:

C语言实战——扫雷游戏

目录 1. 扫雷游戏分析和设计2.扫雷游戏的代码实现 1. 扫雷游戏分析和设计 1.1扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格子默认随机布置10个雷可以排查雷 如果位置不是雷&#xff0c;就显示周围有几个雷 如果…...

.Net使用ElasticSearch

文章目录 前言主体内容一.Kibana中ElasticSearch的基础操作1.GET&#xff08;查询&#xff09;1.POST&#xff08;新增&#xff09;1.PUT&#xff08;修改&#xff09;1.DELET&#xff08;删除&#xff09; 二.在.Net中&#xff0c;对ElasticSearch进行基础操作1.DotNet连接Ela…...

HTML5、CSS3面试题(二)

上一章:HTML5、CSS3面试题&#xff08;一&#xff09; 哪些是块级元素那些是行内元素&#xff0c;各有什么特点 &#xff1f;&#xff08;必会&#xff09; 行内元素: a、span、b、img、strong、input、select、lable、em、button、textarea 、selecting 块级元素&#xff1…...

sqllab第十一关通关笔记

知识点&#xff1a; 发现登录框就可以尝试注入登录框一般都是字符型注入通过注入可以获取其他表的信息绕过手段 单引号闭合联合注入也可以进行错误注入 首先看界面是一个登录框&#xff1b;通过admin admin登录进去&#xff0c;发现页面会把用户名和密码的登录信息打印出来&am…...

机械女生,双非本985硕,目前学了C 基础知识,转嵌入式还是java更好?

作为单片机项目开发的卖课佬&#xff0c;个人建议&#xff0c;先转嵌入式单片机开发方向&#xff0c;哈哈。 java我也学过&#xff0c;还学过oracle、mysql数据库&#xff0c;只是当时没做笔记&#xff0c;找不好充分的装逼证据了。 从实习通过业余时间&#xff0c;学到快正式毕…...

Python之字符串操作大全(29种方法)

本章详细介绍了常用的29种字符串操作方法及代码示例。 1. 重复输出字符串 print(x * 20) 输出&#xff1a;xxxxxxxxxxxxxxxxxxxx 2. 通过索引获取字符串 print(hello world[2:5]) 输出&#xff1a;llo 3. in 判断字符是否在字符串内 print(e in hello world) 输出&…...

ArcGIS学习(十五)用地适宜性评价

ArcGIS学习(十五)用地适宜性评价 本任务给大家带来的内容是用地适宜性评价。 用地适宜性评价是大家在平时工作中最常接触到的分析场景之一。尤其是在国土空间规划的大背景下,用地适宜性评价变得越来越重要。 此外,我们之前的任务主要是使用矢量数据进行分析。本案例是主讲…...

【matlab】如何将.mat文件与.nii文件互转

【matlab】如何将.mat文件与.nii文件互转 .mat转为.nii文件 有时候代码需要读取的是.nii文件&#xff0c;但是如何现有的数据是.mat格式&#xff0c;需要将.mata转化为.nii文件 1、先加载.mat文件 % 加载.mat文件 load(your_mat_file.mat); % 请将your_mat_file.mat替换为实…...

Uni-app开发Canvas当子组件示例,点点绘制图形

前言 使用Uni-app 实现封装一个Canvas渲染的子组件&#xff0c;实现通过传入两点绘制一条完整的路程 具体逻辑看我发的后端和数据库设计 C# 根据两点名称&#xff0c;寻找两短路程的最优解&#xff0c;【有数据库设计&#xff0c;完整代码】 即使不了解具体逻辑&#xff0c;该…...

从金蝶云星空到钉钉通过接口配置打通数据

从金蝶云星空到钉钉通过接口配置打通数据 对接系统金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&#xff0c;旨在帮助企业打造面…...

Unreal发布Android在刘海屏手机上不能全屏显示问题

Unreal 4.27发布Android在刘海屏手机上不能全屏显示问题 Android设置全屏刘海屏全屏设置4.27设置刘海屏在部分手机不能显示问题 Android设置全屏 AndroidManifest.xml文件配置 ...<activity android:name"com.epicgames.ue4.GameActivity" android:label"st…...

hive库表占用空间大小的命令

1、查每个hive表占用的空间大小 hdfs dfs -du -h /user/hive/warehouse 2、按占用空间大小降序排列 hdfs dfs -du /user/hive/warehouse/ipms.db | sort -nr 3、查某一个分区占用空间大小&#xff08;单位G) hadoop fs -ls /user/hive/warehouse/ipms.db/dw_ft_se_nt_u_gen…...

关于go中的select

笔记仓库&#xff1a;gitee.com/xiaoyinhui 代码中的解释纯个人理解&#xff0c;有不对的望指出 package testsimport ("fmt""testing" )var uCnt int 0func TestSelece(t *testing.T) {// 对于 select 语句&#xff0c;在进入该语句时&#xff0c;会按源…...

【Node.js从基础到高级运用】十一、构建RESTful API

在本篇博客中&#xff0c;我们将综合之前讨论的内容&#xff0c;深入探索如何使用Node.js构建一个RESTful API。我们将重点讨论设计合理的API端点&#xff0c;展示如何通过代码实现这些端点&#xff0c;并指导如何使用Postman测试我们的API&#xff0c;确保其按预期工作。 前提…...

Python和MATLAB数字信号波形和模型模拟

要点 Python和MATLAB实现以下波形和模型模拟 以给定采样率模拟正弦信号&#xff0c;生成给定参数的方波信号&#xff0c;生成给定参数隔离矩形脉冲&#xff0c;生成并绘制线性调频信号。快速傅里叶变换结果释义&#xff1a;复数离散傅里叶变换、频率仓和快速傅里叶变换移位&am…...

华为OD技术C卷“测试用例执行计划”Java解答

描述 示例 算法思路1 整体思路是&#xff0c;先读取特性的优先级和测试用例覆盖的特性列表&#xff0c;然后计算每个测试用例的优先级&#xff0c;并将其与测试用例的索引存储到二维数组中。最后按照优先级和索引排序&#xff0c;输出测试用例的索引&#xff0c;即为执行顺序。…...

solana 入门 1

solana-co-learn Solana 开发学习笔记(一)——从 Hello World 出发 安装开发环境 windows下环境配置 wsl First start with installing WSL on your system. wsl --install wsl安装Ubuntu 列出可用的分发版 wsl.exe --list --online显示&#xff1a; 以下是可安装的有效…...

JavaEE之多线程(创建线程的五种写法)详解

&#x1f63d;博主CSDN主页: 小源_&#x1f63d; &#x1f58b;️个人专栏: JavaEE &#x1f600;努力追逐大佬们的步伐~ 目录 1. 前言 2. 操作系统"内核" 3. 创建线程的五种写法 (我们重点要掌握最后一种写法!!) 3.1 继承 Thread, 重写 run 3. 2 实现 Runnabl…...

ChatGPT国内能用吗?中国用户怎么才能使用ChatGPT?

与ChatGPT类似的国内网站&#xff0c;他们都能提供和ChatGPT相似的能力&#xff0c;而且可以在国内直接使用。 点击直达方式 百科GPT官网&#xff1a;baikegpt.cn ChatGPT是基于GPT-3.5架构的语言模型的一个实例&#xff0c;由OpenAI开发。以下是ChatGPT的发展历史&#xff1…...

集群保持集群负载均衡和hash一致性

集群保持负载均衡和一致性哈希是在构建分布式系统时经常涉及的两个重要概念。 负载均衡&#xff1a; - 在集群中&#xff0c;负载均衡是指将传入的请求有效地分发到不同的服务器上&#xff0c;以确保每台服务器都能够处理适量的流量&#xff0c;避免某些服务器过载而造成性能问…...

行业研究报告怎么选:看清咨询公司的“真本事”

一、为什么大家都在找“靠谱的行业研究报告”这几年&#xff0c;不论是创业公司做战略决策&#xff0c;还是大型企业布局新业务&#xff0c;几乎都有一个共识——决策要有数据、有研究、有趋势支撑。于是&#xff0c;“行业研究报告”成了商业决策的必备工具&#xff0c;但市场…...

tao-8k Embedding模型部署教程:支持中文长文本的高兼容性向量服务

tao-8k Embedding模型部署教程&#xff1a;支持中文长文本的高兼容性向量服务 你是不是遇到过这样的问题&#xff1f;想把一段很长的中文文档&#xff0c;比如一篇技术报告、一份产品说明书&#xff0c;甚至是一本小说的章节&#xff0c;转换成计算机能理解的向量&#xff0c;…...

Tencent Hunyuan3D-1.0日志轮转配置:防止磁盘空间耗尽的日志管理方案

Tencent Hunyuan3D-1.0日志轮转配置&#xff1a;防止磁盘空间耗尽的日志管理方案 【免费下载链接】Hunyuan3D-1 腾讯开源的Hunyuan3D-1项目&#xff0c;创新提出两阶段3D生成方法&#xff0c;实现快速、高质量的文本到3D和图像到3D转换&#xff0c;融合Hunyuan-DiT模型&#xf…...

Qwen3.5-9B开源可部署实践:国产昇腾910B适配方案(CANN+PyTorch NPU移植)

Qwen3.5-9B开源可部署实践&#xff1a;国产昇腾910B适配方案&#xff08;CANNPyTorch NPU移植&#xff09; 1. 项目概述 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型&#xff0c;具备强大的逻辑推理、代码生成和多轮对话能力。该模型特别针对国产昇腾910B处理器进行了优化…...

ROS2开发环境搭建避坑指南:Win11 + WSL2 + Ubuntu 22.04 从安装到测试的完整记录

ROS2开发环境搭建实战&#xff1a;Win11与WSL2深度适配指南 环境准备与系统调优 在Windows 11上搭建ROS2开发环境&#xff0c;选择WSL2作为Linux子系统是最佳实践方案。不同于传统虚拟机方案&#xff0c;WSL2提供了接近原生Linux的性能表现&#xff0c;同时完美集成Windows桌…...

AI读脸术如何对接API?Flask服务封装部署教程

AI读脸术如何对接API&#xff1f;Flask服务封装部署教程 1. 为什么需要把“读脸术”变成API&#xff1f; 你可能已经试过这个AI读脸术镜像&#xff1a;上传一张照片&#xff0c;几秒内就能看到人脸框、性别和年龄段标签&#xff0c;效果干净利落。但如果你正开发一个用户管理…...

AI赋能开发:让快马平台智能生成基于contextmenumanager的动态条件式右键菜单代码

最近在做一个电商项目时&#xff0c;遇到了一个有趣的交互需求&#xff1a;需要为不同类型的商品卡片实现智能化的右键菜单。这个需求让我发现了InsCode(快马)平台的AI辅助开发功能特别实用&#xff0c;尤其是对于contextmenumanager这种需要动态逻辑的场景。 需求分析 页面上有…...

Neosegment库:面向七段数码管式NeoPixel的嵌入式驱动框架

1. Neosegment库概述&#xff1a;面向七段数码管式NeoPixel模块的嵌入式驱动框架Neosegment是一个专为Neosegment Digit模块设计的Arduino兼容嵌入式驱动库&#xff0c;其核心目标是将WS281x/SK6812系列智能LED的底层时序控制与七段数码管&#xff08;7-segment display&#x…...

3步实现GitHub资源精准提取:开发者必备的效率工具

3步实现GitHub资源精准提取&#xff1a;开发者必备的效率工具 【免费下载链接】DownGit github 资源打包下载工具 项目地址: https://gitcode.com/gh_mirrors/dow/DownGit 你是否曾遇到这样的困境&#xff1a;急需从GitHub仓库中获取一个特定文件夹&#xff0c;却不得不…...

ChatBI怎么在BI试点中用?3个低门槛落地场景亲测有效

ChatBI试点的前置门槛&#xff1a;先搞定最小可行数据集&#xff0c;不用全量建设 ChatBI是观远数据推出的自然语言分析产品&#xff0c;用户可以通过口语化的提问直接获取数据结果、可视化图表甚至分析结论&#xff0c;无需掌握复杂的报表制作或SQL查询技能。在BI试点阶段引入…...