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 助…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
