扫雷游戏(C语言详解)

扫雷游戏(C语言详解)

  • 放在最前面的
  • 1、前言(扫雷游戏的简介)
  • 2、扫雷游戏的规则(简易版)
  • 3、代码实现
    • (3.1)提醒一下:
        • ( i ) 提醒1:
        • ( ii ) 提醒2:
    • (3.2) 上代码
        • **game.h** 头文件
        • **game.c** 头文件
        • **test.c** 头文件
  • 4、结果展示
    • (4.1)输入的坐标是非法的(即不在坐标的范围)
    • (4.2)输入的坐标是雷,则游戏提前结束
    • (4.3)输入的坐标 不是雷,打印四周(八个坐标)有几个雷
    • (4.4)成功避免所有布置的雷,游戏完美结束
  • 5、END

放在最前面的

🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼
🎉🎉我的C语言初阶合集:C语言初阶合集,希望能帮到你!!!😍 😍
👋🏼🎉🎊创作不易,欢迎大家留言、点赞加收藏!!! 🥳😁😍

1、前言(扫雷游戏的简介)

《扫雷》中玩家的目标是在最短时间内识别出所有非雷区的格子,同时避免触碰到地雷。
游戏区域由多个隐藏格子组成,每个格子可能隐藏着地雷或数字,数字表示周围八个格子中地雷的数量
玩家通过点击格子揭示内容,使用逻辑推理逐步排除雷区。
游戏考验玩家的观察力和推理能力,任何一次误点地雷都会导致游戏失败

2、扫雷游戏的规则(简易版)

1. 第一次点击不会是雷。
2. 格子里的数字表示它周围有几个雷。
3. 游戏目标是找出所有雷,如果 “触雷” 则输。

3、代码实现

(3.1)提醒一下:

( i ) 提醒1:

我在代码注释中对每一行代码进行了 详细的 解释,保证 0基础小白能看得懂!

( ii ) 提醒2:

我写了三个文件,分别是
game.h、 game.c、test.c


game.h 里面存放着与game相关函数的声明 的 头文件

game.c里面存放着与扫雷游戏有关的函数的实现即定义
如:初始化函数 Init()函数、布置雷 set_mine 函数等 的
源文件

test.c 里面存放着 主函数(main)和 测试运行整个扫雷游戏的代码块头文件

(3.2) 上代码

game.h 头文件
//标准输出输出调用的头文件
#include<stdio.h>
// rand 函数 和 srand 函数调用的头文件
#include<stdlib.h>
// time()时间戳函数调用的头文件
#include<time.h>//定义一个宏定义常量 ROW 数值是 9
#define ROW 9
//定义一个宏定义常量 COL 数值是 9
#define COL 9
//定义一个宏定义常量 ROWS 数值是 9+2 = 11
#define ROWS ROW+2
//定义一个宏定义常量 COLS 数值是 9+2 = 11
#define COLS COL+2
定义一个宏定义常量 NUM(用作存储 放置雷的个数) 数值是 76
#define NUM 76//初始化函数 Init() 的声明
void Init(char board[ROWS][COLS], int rows, int cols, char set);
//打印函数 Print() 的声明
void Print(char board[ROWS][COLS], int row, int col);
//布置雷 set_mine() 的声明
void set_mine(char mine[ROWS][COLS], int row, int col);
//排雷 clear_mine() 的声明
void clear_mine(char mine[ROWS][COLS], char show[ROWS][COLS] , int row, int col);
game.c 头文件
#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"//引用 game.h 头文件//初始化扫雷棋盘函数 Init() 的调用
void Init(char board[ROWS][COLS], int rows, int cols, char set)
{// 定义一个整型变量 i,// 并且初始化为 0int i = 0;//外层 for 循环for (i = 0; i < rows; i++){// 定义一个整型变量 j,// 并且初始化为 0int j = 0;//内层 for 循环for (j = 0; j < cols; j++){//将字符set的值,赋值给 board[i][j]board[i][j] = set;}}}//打印函数 Print() 的定义
void Print(char board[ROWS][COLS], int row, int col)
{// 定义一个整型变量 i,// 并且初始化为 0int i = 0;//输出打印 提示信息printf("\n------扫雷游戏------\n");// 定义一个整型变量 j,// 并且初始化为 0int j = 0;//for 循环 //用于 输出列数for (j = 0; j <= col; j++){//打印列数printf("%d列\t", j);}//换行printf("\n");//外层 for 循环for (i = 1; i <= row; i++){//打印行数printf("%d行\t", i);//内层 for 循环for (j = 1; j <= col; j++){//输出打印 board[i][j] 对应的内容// \t 是转义字符,含义是 制表符//并按照%c\t的格式 进行打印printf("%c\t", board[i][j]);}//换行printf("\n");}//输出打印 提示信息printf("------扫雷游戏------\n\n");
}//布置雷 set_mine() 的定义
void set_mine(char mine[ROWS][COLS], int row, int col)
{//定义一个整型变量 n//并将 放置雷的个数 NUM 赋值给 nint n = NUM;// while 循环while (n){//定义两个整型变量 x y,//并将 rand() --随机数字的生成 函数 % row//生成的结果 分别 赋值给 x yint x = rand() % row + 1;int y = rand() % col + 1;//如果 mine[x][y] 的 内容 等于 ‘0’(字符0), 则执行下面的语句块if (mine[x][y] == '0'){//将 ‘1’(字符1) 赋值给 board[x][y]mine[x][y] = '1';//雷的个数 - 1(减1)n--;}}
}//排雷 clear_mine() 的定义
void clear_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{//输出打印 提示信息printf("一共有%d 个雷\n", NUM);//定义两个整型变量 x y,//并进行初始化,赋值为 0int x = 0;int y = 0;//定义两个整型变量 count,//用作计算第几次排雷次数 即避开了多少雷int count = 0;// while 循环,// 循环判断的条件是 count < NUM while (count < NUM){//输出打印 提示信息printf("\n欢迎您,请输入要排查的坐标\n");printf("提示1:(横、纵坐标中间用空格隔开)\n");printf("提示2:(横、纵坐标都是[1~9]):>");//输入 两个整型数字 int n2 = scanf("%d %d", &x, &y);//if 条件判断语句// 如果函数 x > 0 && x <= row && y > 0 && y <= col,执行下面的语句块// 即 if 条件判断条件是 输入的坐标是否有效if (x > 0 && x <= row && y > 0 && y <= col){// if 条件判断语句// 如果函数 board[x][y]的 内容 不等于 ‘1’(字符1),执行下面的语句块if (mine[x][y] != '1'){// if 条件判断语句// 如果函数 board[x][y]的 内容 等于 ‘*’(字符*),执行下面的语句块if (show[x][y] == '*'){//输出打印 提示信息printf("\n第%d次 排查!\n", count + 1);// 将mine[x - 1][y] + mine[x - 1][y - 1]// +mine[x][y - 1] + mine[x + 1][y - 1]// + mine[x + 1][y] + mine[x + 1][y + 1]// + mine[x][y + 1] + mine[x - 1][y + 1] 即统计求和 show[x][y] 四周 七个坐标的雷数// 并将结果以字符的形式赋值给 show[x][y] // (因为 mine[x][y]、show[x][y] 都是字符数组,元素必须是字符的形式!!!)show[x][y] = (mine[x - 1][y] + mine[x - 1][y - 1]+ mine[x][y - 1] + mine[x + 1][y - 1]+ mine[x + 1][y] + mine[x + 1][y + 1]+ mine[x][y + 1] + mine[x - 1][y + 1]) - 7 * '0';//输入的坐标有效,// 并且不是雷,// 还有没有被排查过// (三个条件同时满足!!!),// 则用作计算第几次排雷次数 即避开了多少雷的变量 count自增 1count++;//打印函数 Print() 的调用Print(show, ROW, COL);//如果用作计算第几次排雷次数 即避开了多少雷的变量 count//等于 ROW * COL -NUM 即(没有放置雷的个数),执行下面的语句块if (count == ( ROW * COL -NUM) ) {//输出打印 提示信息printf("恭喜您,你成功避开 %d个雷!\n", NUM);printf("棒棒哒!游戏结束!\n");//跳出循环break;}}//else{//输出打印 提示信息printf("\n该坐标已经排查过了,请重新输入!\n");}}// mine[x][y] == '1',即 mine[x][y] 里面的内容是雷。else{//输出打印提示信息printf("\n非常遗憾!你被炸死了!游戏结束!\n");//输出打印 提示信息printf("\n雷区布置展示:>\n");//打印函数 Print() 的调用Print(mine, ROW, COL);//跳出循环break;}}//else{//输出打印 提示信息printf("坐标非法,请输入有效坐标\n");}}
}
test.c 头文件
#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"//引用 game.h 头文件//定义菜单 menu() 函数
void menu()
{//输出打印 提示信息printf("\n********************\n");printf("*****  1.play  *****\n");printf("*****  0.exit  *****\n");printf("********************\n\n");
}//
void game()
{// 定义一个二维的字符型数组,// 数组名字是 mine,// 有 ROWS 行、COLS 列char mine[ROWS][COLS];// 定义一个二维的字符型数组,// 数组名字是 show,// 有 ROWS 行、COLS 列char show[ROWS][COLS];//初始化函数 Init() 的调用Init(mine, ROWS, COLS,'0');//初始化函数 Init() 的调用Init(show, ROWS, COLS,'*');//输出打印 提示信息printf("\n扫雷游戏页面:>\n");//打印函数 Print() 的调用Print(show, ROW, COL);//布置雷 set_mine() 的调用set_mine(mine, ROW, COL);//输出打印 提示信息printf("\n雷区布置展示:>\n");//打印函数 Print() 的调用Print(mine, ROW, COL);//排雷 clear_mine() 的调用clear_mine(mine, show, ROW, COL);
}//定义测试函数 test()
void test()
{// rand 函数(随机数的生成函数)使用前,// 必须要提前引用 srand 函数,// time() 函数是时间戳函数srand((unsigned int)time(NULL));//定义一个整型变量 input//并且初始化为0int input = 0;//使用 do while 循环语句do{//调用 菜单函数menu();//打印提示信息printf("请选择:>");// n1 来接受 scanf 函数的返回值,// 输入一个整数int n1 = scanf("%d", &input);//使用 switch 分支语句switch (input){// 如果 input = 1// 执行 case 1:后面的语句case 1://调用 game()函数game();//break 语句用来跳出 switch 分支语句 break;case 0://打印提示信息printf("退出游戏\n");//break 语句用来跳出 switch 分支语句 break;default:// 如果 input 不等于 0 也不等于 1// 执行 default:后面的语句printf("选择错误,请重新选择\n");//break 语句用来跳出 switch 分支语句 break;}} while (input);//跳出 do-while 循环的条件是 input 等于 0
}//主函数
int main()
{//调用测试函数 test()test();return 0;
}

4、结果展示

提示:我写的是9*9的扫雷简易版游戏

(4.1)输入的坐标是非法的(即不在坐标的范围)

(4.2)输入的坐标是雷,则游戏提前结束

(4.3)输入的坐标 不是雷,打印四周(八个坐标)有几个雷

(4.4)成功避免所有布置的雷,游戏完美结束

5、END

每天都在学习的路上!
On The Way Of Learning

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/57507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

影刀RPA自动化按钮参数详解

文章目录 一、基础识别参数1. 文本内容&#xff08;Text&#xff09;2. ID属性3. Name属性4. Class属性 二、高级定位参数1. XPath路径2. CSS选择器3. 图像识别 三、动态等待参数1. 等待超时2. 重试间隔 四、操作参数1. 点击类型2. 点击位置 五、最佳实践1. 按钮定位优先级2. 常…

WPF+MVVM案例实战(十四)- 封装一个自定义消息弹窗控件(下)

文章目录 1、案例效果2、弹窗控件使用1.引入用户控件2、按钮命令实现 3、总结4、源代码获取 1、案例效果 2、弹窗控件使用 1.引入用户控件 打开 Wpf_Examples 项目&#xff0c;在引用中添加用户控件库&#xff0c;在 MainWindow.xaml 界面引用控件库&#xff0c;代码如下&…

C++(类继承、虚函数、多重继承)

类继承 &#xff08;1&#xff09;当创建一个类时&#xff0c;不需要重新编写新的成员变量和成员函数&#xff0c;只需要新建的类继承了一个已有的类的成员。已有的类称为基类或父类&#xff0c;新建的类称为派生类或子类。 &#xff08;2&#xff09;一个类可以有多个…

深度学习基础—循环神经网络(RNN)

引言 从本系列博客开始&#xff0c;我们将来一起学习一下NLP领域的相关基础知识&#xff0c;NLP领域重要的模型是RNN&#xff0c;在此之前&#xff0c;先来了解一些符号的含义。 1.符号定义 &#xff08;1&#xff09;符号定义 假设建立一个能够自动识别句中人名位置的序列模型…

Web测试和APP测试的区别

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 最近听到有些朋友说&#xff0c;移动端要比web端稍微难一些&#xff0c;涉及到的细节笔记要多&#xff0c;有转去做web测试的想法&#xff0c;看看在具体测试的时…

Linux TCP CC状态机

万字详文&#xff1a;TCP 拥塞控制详解 - 知乎bcc/tools/tcpcong.py at master iovisor/bccbcc/tools/tcpcong_example.txt at master iovisor/bcc 1.状态机 2.tcp map 拥塞算法历史 1974年&#xff0c;3次握手被提出&#xff1b;1978年&#xff0c;TCP和IP拆分成TCP/IP&…

视频设备一体化监控运维方案

随着平安城市、雪亮工程等项目建设的号召&#xff0c;视频监控系统的建设如火如荼地开展。无论在公共场所、企业单位、住宅小区、矿山工地还是交通枢纽&#xff0c;视频监控系统已成为保障安全、维护秩序和提升管理效率的重要工具。但由于对视频监控系统中的前端设备&#xff0…

深度数据修复软件哪个好?盘点2024年好用的4个数据恢复工具。

深度数据修复软件可以帮助用户深入存储设备&#xff0c;找回丢失的数据。它们可以有效解决很多场景下的数据丢失问题&#xff0c;如果大家平时会有数据丢失的情况&#xff0c;可以用这几个工具去尝试一些自己进行数据恢复。 1、福昕深度恢复软件 直通车&#xff1a;http://www…

leetcode-73-矩阵置零

题解&#xff1a; 1、初始化变量ls_row与ls_col分别用来存储元素0的所在行与列&#xff1b; 2、获取矩阵的行数M与列数N&#xff1b; 3、遍历矩阵matrix的每一个元素。如果这个元素为0&#xff0c;则将该元素所在行数append到ls_row&#xff0c;所在列append到ls_col。 4、…

树莓派基本设置--2. raspi-config工具介绍

raspi-config是树莓派操作系统Raspberry Pi OS中预装的配置工具&#xff1b;raspi-config提供了一种简单便捷的命令行界面来管理树莓派系统的配置&#xff0c;使用户可以轻松地定制和优化其系统设置。 如果使用的是树莓派桌面系统&#xff0c;可以直接在桌面左上角的应用菜单&…

五、鸿蒙开发-组件状态管理

提示&#xff1a;本文根据b站尚硅谷2024最新鸿蒙开发HarmonyOS4.0鸿蒙NEXT星河版零基础教程课整理 链接指引 > 尚硅谷2024最新鸿蒙开发HarmonyOS4.0鸿蒙NEXT星河版零基础教程 文章目录 一、状态管理入门1.1 State1.2 Prop1.3 Link1.4 Provide和Consume 二、状态管理深入2.1 …

STM32学习笔记-GPIO

参考江科大32单片机学习相关知识 GPIO基本构造 APB2&#xff08;Advanced Peripheral Bus 2&#xff09;是STM32微控制器架构中的一个外设总线&#xff0c;用于连接一些高性能外设&#xff0c;如定时器、USART、ADC和GPIO等。这些外设通常对性能要求较高&#xff0c;需要更快的…

java陕西民俗网源码(springboot)

项目简介 陕西民俗网实现了以下功能&#xff1a; 中国陕西民俗网的主要使用者分为&#xff1a; 管理员增删改查商品信息和商品信息资料&#xff0c;审核商品信息预订订单&#xff0c;查看订单评价和评分&#xff0c;通过留言功能回复用户提问。 &#x1f495;&#x1f495;作…

【python】OpenCV—WaterShed Algorithm

文章目录 1、功能描述2、代码实现3、完整代码4、效果展示5、涉及到的库函数5.1、cv2.pyrMeanShiftFiltering5.2、cv2.morphologyEx5.3、cv2.distanceTransform5.4、cv2.normalize5.5、cv2.watershed 6、更多例子7、参考 1、功能描述 基于分水岭算法对图片进行分割 分水岭分割…

选择最佳SCRM系统的综合指南

内容概要 在如今竞争激烈的市场中&#xff0c;企业不能仅仅依靠传统的客户管理方式&#xff0c;需要借助现代化的SCRM系统来提升效率和服务水平。SCRM系统&#xff0c;就是“社交客户关系管理”系统&#xff0c;旨在通过社交媒体等渠道与客户进行更深层次的互动。在选择合适的…

学习threejs,导入OBJ格式的模型

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.OBJLoader OBJ模型加…

动态规划 —— 路径问题-下降路径最小和

1. 下降路径最小和 题目链接&#xff1a; 931. 下降路径最小和 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/minimum-falling-path-sum/description/ 2. 算法原理 状态表示&#xff1a;以莫一个位置位置为结尾 dp[i&#xff0c;j]表示&#xff1a;到…

ubuntu20.04 加固方案-设置限制su命令用户组

一、编辑/etc/pam.d/su配置文件 打开终端。 使用文本编辑器&#xff08;如vim&#xff09;编辑/etc/pam.d/su文件。 vim /etc/pam.d/su 二、添加配置参数 在打开的配置文件的中&#xff0c;添加以下参数&#xff1a; auth required pam_wheel.so 创建 wheel 组 并添加用户 …

ElementUI学习笔记

一、ElementUI概述 官网&#xff1a;https://element.eleme.cn/#/zh-CN &#xff08;一&#xff09;定义 Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。是基于Vue的一个UI框架&#xff0c;该框架基于Vue开发了很多相关组件&#xf…

JS面试八股文(四)

&#x1f60a;JS面试八股文&#xff08;四&#xff09; 31.精灵图和base64的区别是什么&#xff1f;32.svg格式了解多少&#xff1f;33.了解过JWT吗&#xff1f;34.npm的底层环境是什么&#xff1f;35.HTTP协议规定的协议头和请求头有什么&#xff1f;36.说一下浏览器的缓存策略…