C语言 扫雷游戏

写了这么长时间的关于C语言的基础知识,相信大家已经学会了使用C语言书写一些基础的代码,上次还编写了三子棋游戏的代码,这次我将编写一个基础版的扫雷游戏。
首先,创建三个文件,两个源文件,一个头文件,
源文件test.c是主页面,调用头文件game.h测试游戏,
源文件game.c是根据要求编写函数的代码,
头文件game.h调用引用函数所需要的头文件,声明编写的函数。
一、test.c文件
1.引用game.h头文件
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
2.自定义menu函数
自定义一个menu函数打印出一个菜单,是否开始玩游戏,
选1是开始游戏,选0退出游戏
void menu()
{printf("**********************************\n");printf("*********** 1.play ***********\n");printf("*********** 0.exit ***********\n");printf("**********************************\n");
}

3.自定义game函数
自定义一个game函数,用于存放布置与排查的雷的信息
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(show, ROW, COL);//DisplayBoard(mine,ROW,COL);//排查雷FineMine(mine, show, ROW, COL);
}

4.编写主函数
用于判断是否开始游戏,是否结束,并设置随机数的生成起点
int main()
{int input = 0;//定义一个input变量以便于选择是否开始游戏srand((unsigned int)time(NULL));//设置随机数的生成起点do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新输入\n");break;}} while (input);return 0;
}
二、game.h
1.引用头文件
这里引用了time和srand函数
#pragma once
#include <stdio.h>
#include <time.h>//引用了time函数
#include <stdlib.h>//引用了srand函数
2.定义宏
在这里定义了几个宏,用于随时改动行和列,以及雷的数量,可以凭借这个提升游戏的难度。
#define ROW 9 //排查雷的行量
#define COL 9 //排查雷的列量#define ROWS ROW+2 //行的总量
#define COLS COL+2 //列的总量#define EASY_COUNT 10 //雷的数量
3.声明函数
//初始化数组,使得‘0’和‘1’都可以初始化
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//布置雷的信息
void SetMine(char board[ROWS][COLS], int row, int col);
//排查雷
void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
三、game.c
1.初始化数组的内容为指定的内容,这里初始化0和1
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}
2.打印9*9的行和列
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("------扫雷游戏-----\n");//把两个界面分隔开来,使得界面更直观for (j = 0; j <= col; j++){printf("%d ", j);//打印y轴0~9}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);//打印x轴0~9for (j = 1; j <= col; j++){printf("%c ", board[i][j]);//打印9*9的行和列}printf("\n");}printf("------扫雷游戏-----\n");//把两个界面分隔开来,使得界面更直观
}
3.在9*9中随机埋下雷
void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;//确定雷的个数//1~9//1~9while (count){int x = rand() % row + 1;//在1~9中随机生成坐标int y = rand() % col + 1;if (board[x][y] == '0')//判断是否为‘0’{board[x][y] = '1';//布置雷count--;}}
}
4.把雷的ASCII码值转化为雷的数量
int get_mine_count(char board[ROWS][COLS], int x, int y)
{return board[x - 1][y - 1] +board[x - 1][y] +board[x - 1][y+1] +board[x][y - 1] +board[x][y + 1] +board[x + 1][y - 1] +board[x + 1][y] +board[x + 1][y + 1] - 8*'0';//计算x,y周围元素的个数,开始算的是ASCII值,后来减去8*‘0’,转换成数字
}
5.编写FineMine函数用于排查雷
判断所选坐标是否是雷,避免重复输入,并且统计出输入坐标周围的雷的数量,
如果排除了所有雷,还能告知玩家,并显示所有界面
void FineMine(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 > 0 && x <= row && y > 0 && y <= col){if (show[x][y] != '*'){printf("该坐标已经被排查过了,不能重复排查\n");}else{//如果是雷if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}else//如果不是雷{win++;//统计mine数组中x,y坐标周围有几个雷int count = get_mine_count(mine, x, y);show[x][y] = count + '0';DisplayBoard(show, ROW, COL);}}}else{printf("输入坐标非法,请重新输入\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功!\n");DisplayBoard(mine, ROW, COL);}
}
四、下面是所有文件的总代码
1.test.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//首先自定义一个menu函数打印出一个菜单,是否开始玩游戏
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(show, ROW, COL);//DisplayBoard(mine,ROW,COL);//排查雷FineMine(mine, show, ROW, COL);
}int main()
{int input = 0;//定义一个input变量以便于选择是否开始游戏srand((unsigned int)time(NULL));//设置随机数的生成起点do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新输入\n");break;}} while (input);return 0;
}
2.game.h
#pragma once
#include <stdio.h>
#include <time.h>//引用了time函数
#include <stdlib.h>//引用了srand函数#define ROW 9 //排查雷的行量
#define COL 9 //排查雷的列量#define ROWS ROW+2 //行的总量
#define COLS COL+2 //列的总量#define EASY_COUNT 10 //雷的数量//初始化数组,使得‘0’和‘1’都可以初始化
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//布置雷的信息
void SetMine(char board[ROWS][COLS], int row, int col);
//排查雷
void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
3.game.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}
//打印9*9的行和列
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("------扫雷游戏-----\n");//把两个界面分隔开来,使得界面更直观for (j = 0; j <= col; j++){printf("%d ", j);//打印y轴0~9}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);//打印x轴0~9for (j = 1; j <= col; j++){printf("%c ", board[i][j]);//打印9*9的行和列}printf("\n");}printf("------扫雷游戏-----\n");//把两个界面分隔开来,使得界面更直观
}
//在9*9中随机埋下雷
void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;//确定雷的个数//1~9//1~9while (count){int x = rand() % row + 1;//在1~9中随机生成坐标int y = rand() % col + 1;if (board[x][y] == '0')//判断是否为‘0’{board[x][y] = '1';//布置雷count--;}}
}int get_mine_count(char board[ROWS][COLS], int x, int y)
{return board[x - 1][y - 1] +board[x - 1][y] +board[x - 1][y+1] +board[x][y - 1] +board[x][y + 1] +board[x + 1][y - 1] +board[x + 1][y] +board[x + 1][y + 1] - 8*'0';
}
//排查雷
void FineMine(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 > 0 && x <= row && y > 0 && y <= col){if (show[x][y] != '*'){printf("该坐标已经被排查过了,不能重复排查\n");}else{//如果是雷if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}else//如果不是雷{win++;//统计mine数组中x,y坐标周围有几个雷int count = get_mine_count(mine, x, y);show[x][y] = count + '0';DisplayBoard(show, ROW, COL);}}}else{printf("输入坐标非法,请重新输入\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功!\n");DisplayBoard(mine, ROW, COL);}
}
五、效果图

相关文章:
C语言 扫雷游戏
写了这么长时间的关于C语言的基础知识,相信大家已经学会了使用C语言书写一些基础的代码,上次还编写了三子棋游戏的代码,这次我将编写一个基础版的扫雷游戏。 首先,创建三个文件,两个源文件,一个头文件&…...
HTML学习:图片格式——超链接
一、图片格式 1.jpg格式 概述:扩展名为.jpg 或.jpeg ,是一种有损的压缩格式(把肉眼不容易观察出来的细节丢弃了)。 主要特点:支持的颜色丰富、占用空间较小、不支持透明背景、不支持动态图。 使用场景:对图片细节没有极高要求的场景,例如:网站的产品…...
工业级5g路由器使用案例(5g智慧安防解决方案)
项目背景: 现代化智慧安防需要满足远程可视化监控、设备联网管理、数据加密传输等多重需求,对通信网络的带宽、时延、安全性等提出了很高要求。业内急需一款高可靠、高性能、易管理的通信网关设备,来确保安防系统的顺利运行。 安装部署: SR800-D路由器采用紧凑型全金属机箱…...
sentinel熔断降级
熔断降级 Slot 责任链上的最后一环:熔断降级 DegradeSlot,熔断降级作为保护系统的一种强大手段,可以根据慢调用、异常比例和异常数进行熔断,并自定义持续时间以实现系统保护 规则配置 规则类中属性解析 与控制面板对应 // 其中资源名称在 AbstractRule 里。 pu…...
Redis的安装和部署教程(Windows环境)
一、安装Redis服务 1、下载Redis压缩包 以下这个是我网盘里面的(这个是v8.0版本的,支持导入.rdb数据文件) 链接:百度网盘 请输入提取码 提取码:x0f1 --来自百度网盘超级会员V5的分享 2、解压到文件夹 将下载的压缩…...
MNN Session::resize 之流水线编码(五)
系列文章目录 MNN createFromBuffer(一) MNN createRuntime(二) MNN createSession 之 Schedule(三) MNN createSession 之创建流水线后端(四) MNN Session::resize 之流水线编码&am…...
2. IS-IS 基础实验
2.1 IS-IS 配置实验 2.1.1 实验介绍 2.1.1.1 学习目标 1. 实现 IS-IS 协议基本配置 2. 实现 IS-IS 协议 DIS 优先级修改 3. 实现 IS-IS 协议网络类型修改 4. 实现 IS-IS 协议外部路由引入 5. 实现 IS-IS 接口 cost 修改 6. 实现 IS-IS 路由渗透配置 2.1.1.2 实验组网介…...
Rust 并行库 crossbeam 的 Channel 示例
示例1 一个不完整的示例: let (tx, rx) channel::unbounded::<Task>(); let mut handlers vec![];for _ in 0..number {let rx rx.clone();let handle thread::spawn(move || {while let Some(task) rx.recv() {task.call_box();}});handlers.push(han…...
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级的理解
一:缓存雪崩 我们可以简单的理解为:由于原有缓存失效,新缓存未到期间 (例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了ÿ…...
springcloud gateway
一、 predicate : 就是你定义一些规则,如果满足了这些规则,就去找到对应的路由。 对于strip 二、自定义过略器和全局过滤器 约定大于配置,后缀不变,只改前缀 sentinel持久化 三、sentinel quick-start | Sentinel 信号量虽然简…...
JAVA八股day1
遇到的问题 相比于包装类型(对象类型), 基本数据类型占用的空间往往非常小为什么说是几乎所有对象实例都存在于堆中呢?静态变量和成员变量、成员变量和局部变量的区别为什么浮点数运算的时候会有精度丢失的风险?如何解…...
探索拓展坞的奥秘:提升电脑接口的无限可能
在数字化时代的浪潮中,电脑已成为我们日常生活和工作中不可或缺的一部分。然而,随着外接设备的日益增多,电脑接口的数量和类型往往无法满足我们的需求。这时,拓展坞便应运而生,以其强大的扩展能力和便捷的使用方式&…...
Linux中执行脚本报错(脚本乱码问题)
主要原因是在windows中编译文件格式导致 linux下解决: 方案一: Linux下打开shell文件,用vi/vim命令打开脚本文件,输入“:set fileformatunix”,回车,保存退出。 方案二: yum install -y dos2uni…...
el-table按钮获取当前行元素
el-table按钮获取当前行元素 vue2 <el-table-column label"操作" width"240px"><template slot-scope"scope"><el-button size"mini" click"toItem(scope.row)">用户详情</el-button><el-butto…...
MySQL数据导入的方式介绍
MySQL数据库中的数据导入是一个常见操作,它涉及将数据从外部源转移到MySQL数据库表中。在本教程中,我们将探讨几种常见的数据导入方式,包括它们的特点、使用场景以及简单的示例。 1. 命令行导入 使用MySQL命令行工具mysql是导入数据的…...
构建部署_Docker常用命令
构建部署_Docker常见命令 启动命令镜像命令容器命令 启动命令 启动docker:systemctl start docker 停止docker:systemctl stop docker 重启docker:systemctl restart docker 查看docker状态:systemctl status docker 开机启动&…...
Spring Boot Actuator介绍
大家在yaml中经常见到的这个配置 management: endpoints: web: exposure: #该配置线上需要去掉,会有未授权访问漏洞 include: "*" 他就是Actuator! 一、什么是 Actuator Spring Boot Actuator 模块提供了生产级别…...
数据库中DQL、DML、DDL、DCL的概念与区别
目录 DQL (Data Query Language) DML (Data Manipulation Language) DDL (Data Definition Language) DCL (Data Control Language) 数据库语言可以根据其功能被分为几个不同的类别:DQL(数据查询语言)、DML(数据操纵语言&…...
MacOS---设置Java环境变量
介绍 在MacOS系统配置Java环境变量。 操作步骤 第一步:打开.bash_profile文件 vim ~/.bash_profile第二步:添加或修改配置 如果是第一次配置需要添加配置如果是已经配置过想更换其他版本需要修改配置 在文件末尾添加或修改下面的配置 export JAVA…...
使用 Boot Camp 助理查明您的 Mac 需不需要 Windows 安装介质
使用 Boot Camp 助理查明您的 Mac 需不需要 Windows 安装介质 当前的 Mac 机型无需介质即可安装 Windows,也就是说,您不需要用到外置驱动器。较早的 Mac 机型需要用到 USB 驱动器或光盘驱动器。使用 Boot Camp 助理可查明您需要用到什么。 Boot Camp 助…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
