扫雷-C语言
一、前言:
众所周知,扫雷是一款大众类的益智小游戏,它的游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。
今天,我们的目的就是通过C语言来实现一个简单扫雷游戏。
主要操作有:
1.初始化棋盘;
2.打印棋盘;
3.统计周围雷的个数;
4.排雷;
5.判断输赢;
我这里是通过三个文件:源文件(Test.c)源文件(Game.c)头文件(Game.h)来实现的它们分别有各自的分工:
1.源文件-Test.c:主要用于调用定义的函数来实现扫雷操作。
2.源文件-Game.c:主要用于定义头文件-Game.h声明的函数。
3.头文件-Game.h:主要用于声明所需要的操作的函数。
二、头文件-Game.h:
2.1-目的:
这里我们需要的操作是声明所需要的头文件,将所需要的操作声明成一个函数并在源文件-Game.c中定义所声明的函数。
2.2-代码:
#pragma once#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9
#define COL 9#define ROWS 11
#define COLS 11
#define COUNT 10//选单
void menu(); //扫雷游戏
//用于整理函数,实现扫雷所有操作
void game();//初始化棋盘
void InitBoard(char board[ROWS][COLS],int rows,int cols,char tem);//打印棋盘
void PrintBoard(char board[ROWS][COLS], int row, int col);//布置雷
void SetBoard(char board[ROWS][COLS], int row, int col);//排除雷
void FindBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//统计周围雷的个数
int get_mine_count(char mine[ROWS][COLS],int x,int y); //判断是否获胜
int If_win(int win);
三、源文件-Game.c:
3.1-目的:
将上述头文件-Game.h中所声明的操作函数通过自我实现给定义了。
3.2-操作函数的定义:
3.2.1-选单:
目的:
为了使函数操作在执行时更美观,更便于用户使用。
代码:
//设置选单
void menu()
{printf("*************************************\n");printf("********** 1.play *********\n");printf("********** 0.exit *********\n");printf("*************************************\n");
}
效果图:

3.2.2-初始化棋盘:
目的:
将定义的二维数组给初始化,便于用户在打印时观察以及后续的操作。
代码:
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char tem)
{for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){board[i][j] = tem;}}
}
效果图:
我们可以在初始化后打印来检查初始化是否成功。

3.2.3-打印棋盘:
目的:
打印扫雷棋盘,便于自我检查自我定义的函数,以及用户进行扫雷时的操作及观看。
代码:
//打印棋盘
void PrintBoard(char board[ROWS][COLS], int row, int col)
{printf("----------------扫雷------------------\n");for (int j = 0; j <= col; j++){printf(" %d ",j);}printf("\n");for (int i = 1; i <= row; i++){printf(" %d ",i);for (int j = 1; j <= col; j++){printf(" %c ", board[i][j]);}printf("\n");}printf("----------------扫雷------------------\n");
}
效果图:

3.2.4-布置雷:
目的:
在二维数组中随机生成雷,来便于后续的扫雷操作。
代码:
//在布雷数组中布置雷
void SetBoard(char board[ROWS][COLS], int row, int col)
{int count = COUNT;while (count){int x = rand() % col + 1;int y = rand() % row + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}
效果图:

3.2.5-进行排雷:
目的:
用户进行扫雷游戏。注意:这里需判断是否将没雷的位置全部点出,如果全部点出则需要提示用户获胜,并且如果用户输入的坐标已经排过一次雷了我们还需提示用户。
代码:
//在排雷数组中排雷
void FindBoard(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{int x, y;int win = 0;while (1){printf("请输入坐标:");scanf("%d %d", &x, &y);if (show[x][y] != '*'){printf("该坐标已被排查过!\n");continue;}if (mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");PrintBoard(mine, ROW, COL); //打印布雷数组break;}if (mine[x][y] == '0'){int num = get_mine_count(mine, x, y);show[x][y] = num + '0';win++;//判断是否获胜if (If_win(win)){printf("恭喜你赢了!\n");PrintBoard(show, ROW, COL); //打印排雷数组return;}PrintBoard(show, ROW, COL); //打印排雷数组}}
}
效果图:

3.2.6-统计周围雷的个数:
目的:
统计输入坐标格子周围8个位置中雷的总数,以便于用户进行排雷操作。
代码:
//统计周围雷的个数
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{int count = 0;if (mine[x - 1][y - 1] == '1'){count++;}if (mine[x - 1][y] == '1'){count++;}if (mine[x - 1][y + 1] == '1'){count++;}if (mine[x][y - 1] == '1'){count++;}if (mine[x][y + 1] == '1'){count++;}if (mine[x + 1][y - 1] == '1'){count++;}if (mine[x + 1][y] == '1'){count++;}if (mine[x + 1][y + 1] == '1'){count++;}return count;
}
效果图:
3.2.7-判断是否获胜:
目的:
如果排除位置个数与总数-雷的个数相同则说明用户获胜,我们需要判断用户是否获胜并提示用户。
代码:
//判断是否获胜
int If_win(int win)
{if (win == (ROW * COL - COUNT)){return 1;}return 0;
}
四、源文件-Test.c:
4.1-目的:
主要用于调用定义的函数通过分工来实现扫雷操作,并定义扫雷时所需要的两个数组。
4.2-思路:
首先,我们需要知道扫雷需要通过两个二维数组来实现,一个用于布置雷,一个用于进行排雷游戏。接着,我们需要对定义的两个二维数组进行初始化,便于后继的操作以及用户的观察。在初始化后我们也可以通过自我定义的打印函数来检查初始化是否正确。然后,在完成上述操作后,我们需要对布雷数组进行随机布置雷。最后,我们进行排雷操作,从而实现扫雷游戏。
4.3-代码:
#define _CRT_SECURE_NO_WARNINGS 1#include "Game.h"void game()
{char mine[ROWS][COLS] = { 0 }; //布雷的二维数组char show[ROWS][COLS] = { 0 }; //排雷的二维数组InitBoard(mine, ROWS, COLS, '0'); //初始化布雷数组//PrintBoard(mine, ROW, COL); //打印布雷数组InitBoard(show, ROWS, COLS, '*'); 初始化排雷数组PrintBoard(show, ROW, COL); //打印排雷数组SetBoard(mine, ROW, COL); //布置雷//PrintBoard(mine, ROW, COL); //打印布雷数组FindBoard(mine, show, ROW, COL); //排雷
}int main()
{srand((unsigned int)time(NULL));int intput=1;do{menu();printf("请选择选项:>");scanf("%d", &intput);switch (intput){case 1:{game();break;}case 0:{printf("退出游戏!");break;}default:{printf("选择错误,重新选择!");break;}}} while (intput);return 0;
}
五、结语:
上述内容,即是我个人对扫雷游戏-C语言的个人见解以及自我实现。若有大佬发现哪里有问题可以私信或评论指教一下我这个小萌新。非常感谢各位uu们的点赞,关注,收藏,我会更加努力的学习编程语言,还望各位多多关照,让我们一起进步吧!

相关文章:
扫雷-C语言
一、前言: 众所周知,扫雷是一款大众类的益智小游戏,它的游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。 今天,我们的目的就是通过C语言来实现一个简…...
RockyLinux 9 PXE Server bios+uefi 自动化部署 RockLinux 8 9
pxe server 前言 PXE(Preboot eXecution Environment,预启动执行环境)是一种网络启动协议,允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器,它提供了启动镜像和引导加载程序,…...
接口测试基础
一、认识接口测试 接口测试 接口:系统之间数据交互的通道。 硬件接口 软件接口 接口测试:基于不同的输入参数,校验接口响应数据与预期数据是否一致。 为什么要学接口测试? 提前介入测试、尽早发现问题 中级测试工程师必备技能 接口测试学…...
为什么 from . import * 不会导入子模块
为什么 from . import * 不会导入子模块 在 Python 中,from . import * 并不会自动导入子模块。这是因为 import * 的行为是由模块的 __all__ 变量决定的。如果没有定义 __all__,它只会导入当前模块中定义的顶层变量和函数,而不会递归地导入…...
LangGPT结构化提示词编写实践
langGPT提示词 # Role: 浮点数比较助手 ## Profile - author: LangGPT - version: 1.0 - language: 中文 - description: 一个专门帮助用户进行浮点数比较的助手,确保LLM能够准确识别和对比浮点数。## Skills 1. 理解浮点数的结构和数值意义。 2. 精…...
React: class 和 style
一、class 1、在react中使用className属性来绑定类名 <div className"header flex-middle-middle">添加2个类名 </div>2、动态添加类名 <div className{item ${nameactive ? active : }}>动态添加active类名 </div>二、style 1、react中…...
【数据结构】包装类、初识泛型
🎇🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…...
TCP客户端connect断线重连
文章目录 TCP客户端connect断线重连1、为什么要断线重连2、实现代码 TCP客户端connect断线重连 1、为什么要断线重连 客户端会面临服务器崩溃的情况,我们可以试着写一个客户端重连的代码,模拟并理解一些客户端行为,比如游戏客户端等. 考虑到…...
细说MCU用DMA改变DAC输出信号频率和改善输出波形质量的方法
目录 一、参考硬件 二、修改定时器参数改变输出波形频率 三、改善波形质量 四、代码修改 五、查看结果 一、参考硬件 本项目的软件硬件工程参考作者的其他文章:细说MCU用DMA实现DAC输出的方法-CSDN博客 https://wenchm.blog.csdn.net/article/details/14065…...
Java高级面试题
文章目录 Java高级特性Java 8 中的新特性有哪些?Lambda 表达式的用途是什么?Stream API 的工作原理是什么?Optional 类的作用是什么?什么是函数式接口?Java 9 之后的新特性有哪些? 并发编程Java中的线程池是…...
USART串口理论知识总结
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 USART串口理论知识总结 1、通讯的串行和并行1.串口采用发送数据代码并用printf重代码 1、通讯的串行和并行 1.串口采用发送数据代码并用printf重代码 #include <stdint.h…...
基于 HTML+ECharts 实现智慧景区数据可视化大屏(含源码)
构建智慧景区数据可视化大屏:基于 HTML 和 ECharts 的实现 随着旅游业的蓬勃发展,智慧景区的概念逐渐深入人心。通过数据可视化,景区管理者可以实时监控游客流量、设施使用情况以及环境状况,从而提升游客体验和管理效率。本文将详…...
vxe-table——实现切换页码时排序状态的回显问题(ant-design+elementUi中table排序不同时回显的bug)——js技能提升
之前写的后台管理系统,都是用的antdelement,table组件中的【排序】问题是有一定的缺陷的。 想要实现的效果: antv——table组件一次只支持一个参数的排序 如下图: 就算是可以自行将排序字段拼接到列表接口的入参中,…...
SQL
SQL全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 。 SQL通用语法 SQL语句可以单行或多行书写,以分号结尾。SQL语句可以使用空格/缩进来增强语句的可读性。MySQL数据库的…...
maven archetype
1.简介 maven脚手架是为了创建一个项目模板,以后新建项目都能够复用该模板 maven中模板引擎使用的是velocity,在文件中可以使用它的语法获取变量等操作 2.实现 单模块脚手架实现 pom.xml <?xml version"1.0" encoding"UTF-8"?> &…...
浏览器打开抽奖系统html
<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>在线抽奖 随机选取 自动挑选</title> <script src"https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script> <style> body {…...
微信小程序-使用Component方法代替Page方法构造页面
一.使用Component方法的前提条件 在小程序js文件里使用Component方法代替Page方法需要在json文件里面定义usingComponents属性 {"usingComponents": {} }二.注意事项 1.在page页面里使用的钩子函数和事件监听方法都需要写在methods对象里面 methods:{update(){thi…...
Spark SQL----DISTRIBUTE BY子句
Spark SQL----DISTRIBUTE BY子句 一、描述二、语法三、参数四、例子 一、描述 DISTRIBUTE BY子句用于根据输入表达式对数据进行重新分区。与CLUSTER BY子句不同,这不会对每个分区内的数据进行排序。 二、语法 DISTRIBUTE BY { expression [ , ... ] }三、参数 e…...
HTML5-canvas1
1、canvas:创建画布 <canvas id"canvas"></canvas>2、画一条直线 var canvasdocument.getElementById(cancas); canvas.width800; canvas.height800; var contextcanvas.getContext(2d); //获得2d绘图上下文环境 //画一条直线 c…...
【NOI-题解】1009 - 数组逆序1162 - 数组元素的删除1211 - 数组元素的插入1161. 元素插入有序数组1159. 数组元素的移动
文章目录 一、前言二、问题问题:1009 - 数组逆序问题:1162 - 数组元素的删除问题:1211 - 数组元素的插入问题:1161. 元素插入有序数组问题:1159. 数组元素的移动 三、感谢 一、前言 本章节主要对数组问题中数组元素移…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

