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

扫雷游戏(C语言)

目录

一、前言:

二、游戏规则:

三、游戏前准备

四、游戏实现

1、打印菜单

2、初始化棋盘

3、打印棋盘

4、布置雷

5、排雷

五、完整代码


一、前言:

用C语言完成扫雷游戏对于初学者来说,难度并不是很大,而且通过编程这个小游戏,会让你对函数调用,分支循环,连续输入等有很好的掌握,该过程并不涉及指针及以后的内容。

二、游戏规则:

扫雷游戏规则十分简单,比如9*9网格中,就是在81个网格中找到其中的10颗雷,并不被雷炸死。

三、游戏前准备

我们为了让代码更加简洁,将代码分成三个文件中编写,如图所示,在test.c文件中放主函数,

在game.h中放所需的头文件,在gam.c中放调用的函数。

四、游戏实现

为了方便下面的讲解,我先把主函数和头文件放出来

#include<stdio.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_count 10
void Initboard(char board[ROWS][COLS], int rows,int cols,char set);
void Printboard(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.h文件中放入头文件,并定义全文所需的宏变量,这样方便改动,比如本篇讲述的是9*9网格的,你只需将定义的9改成其他数据,就可以得到一个10*10或其他的网格


#include"game.h"
void game()
{char mine[ROWS][COLS];char show[ROWS][COLS];//第一步,初始化棋盘Initboard(mine, ROWS, COLS,'0');Initboard(show, ROWS, COLS,'*');//第二步,打印棋盘Printboard(show, ROW, COL);//第三步,布置雷Setmine(mine, ROW, COL);//Printboard(mine, ROW, COL);//第四步,排雷Finemine(mine, show, ROW, COL);
}
void menu()
{printf("****************\n");printf("**** 1 play ****\n");printf("**** 0 exit ****\n");printf("****************\n");
}
int main()
{int count = 0;srand((unsigned int)time(NULL));do{menu();printf("请输入你的选择:");scanf("%d", &count);switch (count){case 1:game();break;case 0:printf("你已选择退出游戏\n");break;default:printf("这是一个不规范的选择,请重新选择\n");break;}} while (count);return 0;
}

通过主函数,你应该能看出来我们实现这个游戏的逻辑是先打印出菜单,告诉你不同的选择,然后通过你的选择来判断是否进入游戏,所以游戏大体分成以下几步:

1、打印菜单

2、初始化棋盘

3、随机布置十颗雷

5、打印棋盘

4、排雷

下面我们逐步实现这几点:

1、打印菜单

void menu()
{printf("****************\n");printf("**** 1 play ****\n");printf("**** 0 exit ****\n");printf("****************\n");
}

运行后可以打印出菜单

2、初始化棋盘

在game()函数中,我们定义了两个字符数组

char mine[ROWS][COLS];
char show[ROWS][COLS];
//第一步,初始化棋盘
Initboard(mine, ROWS, COLS,'0');
Initboard(show, ROWS, COLS,'*');

其中第一个数组是雷盘,布置雷在上面,第二个数组是展示的,告诉玩家游戏进行情况,我们用0表示无雷,可以先把雷盘全部初始化为‘0’,展示盘全部初始化为‘*’

具体函数如下:

void Initboard(char board[ROWS][COLS], int rows, int cols,char set)
{for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){board[i][j] = set;}}
}

3、打印棋盘

在主函数中,我们就提到了初始化后打印棋盘,其实打印棋盘和布置雷两步可以互换先后顺序,但是这里打印棋盘还可以用来检测上面初始化是否成功

//第二步,打印棋盘Printboard(show, ROW, COL);

代码如下:

void Printboard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (i = 0; i <=row; i++)printf("%d ", i);printf("\n");for (i = 1; i <= col; i++){printf("%d ", i);for (j = 1; j <= row; j++){printf("%c ", board[i][j]);}printf("\n");}
}

运行后结果如下:

4、布置雷

//第三步,布置雷Setmine(mine, ROW, COL);//Printboard(mine, ROW, COL);//这步可以用来检测雷是否布置成功,如果怕出错可以用上

初始化棋盘之后,就要在雷盘中随即找十个位置放雷,也就是说要放进去十颗雷

void Setmine(char board[ROWS][COLS], int row, int show)
{int num = mine_count;while (num){int i = rand() % 9 + 1;int j = rand() % 9 + 1;if (board[i][j] == '0'){board[i][j] = '1';num--;}}
}

用‘1’表示雷,就是将mine数组中随即找十个位置,将‘0’换成‘1’,表示在这里埋雷

5、排雷

排雷过程中只有两种结果,一种是正好是雷,那么就会炸死,另一种则是不是雷,如果不是雷,我们应该把它周围有几个雷判断出来,不然几乎不可能通关

代码如下:

int lei_count(char mine[ROWS][COLS], int a, int b)
{int count = mine[a - 1][b - 1] + mine[a - 1][b] + mine[a - 1][b + 1] + mine[a][b - 1] + mine[a][b + 1]+ mine[a + 1][b - 1] + mine[a + 1][b] + mine[a + 1][b + 1] - 8 * '0';return count;
}
void Finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int a, b;int wulei = row * col - mine_count;while (wulei){printf("请输入你要检查的坐标:");scanf("%d %d", &a, &b);if (a > 0 && a <= row && b > 0 && b <= col){if (mine[a][b] == '1'){printf("抱歉,这是雷,你被炸死了\n");break;}else{//既然不是雷,那就统计雷的数量int count = lei_count(mine, a, b);show[a][b] = count + '0';Printboard(show, ROW, COL);wulei--;}}elseprintf("此坐标不存在,请重新输入\n");}
}

五、完整代码

game.h

#include<stdio.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_count 10
void Initboard(char board[ROWS][COLS], int rows,int cols,char set);
void Printboard(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);

test.c

#include"game.h"
void game()
{char mine[ROWS][COLS];char show[ROWS][COLS];//第一步,初始化棋盘Initboard(mine, ROWS, COLS,'0');Initboard(show, ROWS, COLS,'*');//第二步,打印棋盘Printboard(show, ROW, COL);//第三步,布置雷Setmine(mine, ROW, COL);//Printboard(mine, ROW, COL);//第四步,排雷Finemine(mine, show, ROW, COL);
}
void menu()
{printf("****************\n");printf("**** 1 play ****\n");printf("**** 0 exit ****\n");printf("****************\n");
}
int main()
{int count = 0;srand((unsigned int)time(NULL));do{menu();printf("请输入你的选择:");scanf("%d", &count);switch (count){case 1:game();break;case 0:printf("你已选择退出游戏\n");break;default:printf("这是一个不规范的选择,请重新选择\n");break;}} while (count);return 0;
}

game.c

#include"game.h"
void Initboard(char board[ROWS][COLS], int rows, int cols,char set)
{for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){board[i][j] = set;}}
}
void Printboard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (i = 0; i <=row; i++)printf("%d ", i);printf("\n");for (i = 1; i <= col; i++){printf("%d ", i);for (j = 1; j <= row; j++){printf("%c ", board[i][j]);}printf("\n");}
}
void Setmine(char board[ROWS][COLS], int row, int show)
{int num = mine_count;while (num){int i = rand() % 9 + 1;int j = rand() % 9 + 1;if (board[i][j] == '0'){board[i][j] = '1';num--;}}
}
int lei_count(char mine[ROWS][COLS], int a, int b)
{int count = mine[a - 1][b - 1] + mine[a - 1][b] + mine[a - 1][b + 1] + mine[a][b - 1] + mine[a][b + 1]+ mine[a + 1][b - 1] + mine[a + 1][b] + mine[a + 1][b + 1] - 8 * '0';return count;
}
void Finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int a, b;int wulei = row * col - mine_count;while (wulei){printf("请输入你要检查的坐标:");scanf("%d %d", &a, &b);if (a > 0 && a <= row && b > 0 && b <= col){if (mine[a][b] == '1'){printf("抱歉,这是雷,你被炸死了\n");break;}else{//既然不是雷,那就统计雷的数量int count = lei_count(mine, a, b);show[a][b] = count + '0';Printboard(show, ROW, COL);wulei--;}}elseprintf("此坐标不存在,请重新输入\n");}
}

用C语言解决扫雷游戏还是非常有意思的,上面这种还是最简单的,还有许多有趣的东西值得探索,比如如何搞一个20*20的棋盘,或如何用递归的方法实现快速展开,如果想了解更多,点击关注,去学习更多C语言的知识。

相关文章:

扫雷游戏(C语言)

目录 一、前言&#xff1a; 二、游戏规则&#xff1a; 三、游戏前准备 四、游戏实现 1、打印菜单 2、初始化棋盘 3、打印棋盘 4、布置雷 5、排雷 五、完整代码 一、前言&#xff1a; 用C语言完成扫雷游戏对于初学者来说&#xff0c;难度并不是很大&#xff0c;而且通…...

五、MySQL的备份及恢复

5.1 MySQL日志管理 在数据库保存数据时&#xff0c;有时候不可避免会出现数据丢失或者被破坏&#xff0c;这样情况下&#xff0c;我们必须保证数据的安全性和完整性&#xff0c;就需要使用日志来查看或者恢复数据了 数据库中数据丢失或被破坏可能原因&#xff1a; 误删除数据…...

使用dockers-compose搭建开源监控和可视化工具

简介 Prometheus 和 Grafana 是两个常用的开源监控和可视化工具。 Prometheus 是一个用于存储和查询时间序列数据的系统。它提供了用于监控和报警的数据收集、存储、查询和图形化展示能力。Prometheus 使用拉模型&#xff08;pull model&#xff09;&#xff0c;通过 HTTP 协议…...

浏览器——HTTP缓存机制与webpack打包优化

文章目录 概要强缓存定义开启 关闭强缓存协商缓存工作机制通过Last-Modified If-Modified-Since通过ETag If-None-Match 不使用缓存前端利用缓存机制&#xff0c;修改打包方案webpack 打包webpack 打包名称优化webpack 默认的hash 值webapck其他hash 类型配置webpack打包 web…...

STM32duino舵机控制-2

使用定时器进行精确延时&#xff0c;串口接收数据进行 50 0度 --十六进制32 250 180度 --十六进制FA 串口接收到AA 32两个字节&#xff0c;舵机转到0度&#xff1b;接收到AA FA&#xff0c;转到180度。请验证代码&#xff1a; const unsigned…...

【知识---如何创建 GitHub 个人访问令牌】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言登录到 GitHub 帐户。在右上角的头像旁边&#xff0c;点击用户名&#xff0c;然后选择 "Settings"。在左侧导航栏中&#xff0c;选择 "Develope…...

GBASE南大通用分享-ConnectionTimeout 属性

GBASE南大通用分享 获取或设置连接超时时间&#xff0c;值为‚0‛时没有限制。  语法 [Visual Basic] Public Overrides ReadOnly Property ConnectionTimeout As Integer Get [C#] public override int ConnectionTimeout { get; }  实现 IDbConnection.Connecti…...

ChatGPT 全域调教高手:成为人工智能交流专家

随着人工智能的快速发展&#xff0c;ChatGPT作为一种强大的文本生成模型&#xff0c;在各行各业中越来越受到重视和应用。想要利用ChatGPT实现更加智能、自然的交流&#xff0c;成为 ChatGPT 全域调教高手吗&#xff1f;本文将为您介绍如何通过优化ChatGPT的训练方法&#xff0…...

5.Hive表修改Location,一次讲明白

Hive表修改Loction 一、Hive中修改Location语句二、方案1 删表重建1. 创建表&#xff0c;写错误的Location2. 查看Location3. 删表4. 创建表&#xff0c;写正确的Location5. 查看Location 三、方案2 直接修改Location并恢复数据1.建表&#xff0c;指定错误的Location&#xff0…...

基于springboot校园台球厅人员与设备管理系统源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括校园台球厅人员与设备管理系统的网络应用&#xff0c;在外国管理系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。校园台球厅人员与设备管理系统具…...

MySQL(下)

四、事务 一、概念 对数据库的一次执行中有多条sql语句执行。这多条sql在一次执行中&#xff0c;要么都成功执行&#xff0c;要么都不执行。保证了数据完整性。MySQL中只有innodb引擎支持事务。 二、特性 事务是必须满足 4 个条件&#xff08;ACID&#xff09;&#x…...

如何搭建开源笔记Joplin服务并实现远程访问本地数据

文章目录 1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 Joplin 是一个开源的笔记工具&#xff0c;拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能&#xff0c;…...

免费分享一套微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) ,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现) &#xff0c;分享下哈。 项目视频演示 【免费】微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现)…...

后端学习:数据库MySQL学习

数据库简介 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。   接下来&#xff0c;我们来学习Mysql的数据模型&#xff0c;数据库是如何来存储和管理数据的。在介绍 Mysql的数据模型之前&#xff0c;需要先了解一个概念&#xf…...

2024最新版IntelliJ IDEA安装使用指南

2024最新版IntelliJ IDEA安装使用指南 Installation and Usage Guide to the Latest JetBrains IntelliJ IDEA Community Editionn in 2024 By JacksonML JetBrains公司开发的IntelliJ IDEA一经问世&#xff0c;就受到全球Java/Kotlin开发者的热捧。这款集成开发环境&#xf…...

消息中间件及java线程池

1. ActiveMQ是什么&#xff1f; Apache ActiveMQ是一个开源的消息中间件&#xff08;Message Oriented Middleware, MOM&#xff09;&#xff0c;它遵循Java消息服务&#xff08;Java Message Service, JMS&#xff09;规范&#xff0c;提供高效、可靠和异步的消息传递功能。Ac…...

关于axios给后端发送数据的问题

这里需要用的插件&#xff1a;qs.js&#xff0c;是前端给后端发送的数组&#xff0c;需要序列化所以要用到这个插件&#xff0c;这里就提取连接在这里&#xff0c;需要的自提&#xff0c;需要导如进来&#xff0c;别忘记了 链接&#xff1a;https://pan.baidu.com/s/1qyD8v9wfd…...

web前端之ES6的实用深度解构赋值方法、复杂的解构赋值

MENU 前言解构对象解构数组解构混用 前言 ES6中允许按照一定模式&#xff0c;从数组和对象中提取值&#xff0c;对变量进行赋值&#xff0c;这被称为解构(Destructuring)。 使用解构赋值可以将复杂的代码整理的更加干净整洁。 解构对象 在没有使用解构之前&#xff0c;想要确定…...

uni-app 接口封装,token过期,自动获取最新的token

一、文件路径截图 2、新建一个文件app.js let hosthttp://172.16.192.40:8083/jeecg-boot/ //本地接口 let myApi {login: ${host}wx/wxUser/login, //登录 } module.exports myApi 3、新建一个文件request.js import myApi from /utils/app.js; export const r…...

AWS免费套餐——云存储S3详解

文章目录 前言一、为什么选择S3二、费用估算三、创建S3云存储注册账户登录账户创建存储桶关于官网相关文档 总结 前言 不论个人还是企业&#xff0c;日常开发中经常碰到需要将文档、安装包、日志等文件数据存储到服务器的需求。往常最常用的是云服务器&#xff0c;但是仅仅承担…...

2723. 两个 Promise 对象相加

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 给定两个 promise 对象 promise1 和 promise2&#xff0c;返回一个新的 promise。promise1 …...

【方法论】费曼学习方法

费曼学习方法是由诺贝尔物理学奖得主理查德费曼提出的一种学习方法。这种方法强调通过将所学的知识以自己的方式解释给别人来提高学习效果。 费曼学习方法的步骤如下&#xff1a; 选择一个概念&#xff1a;选择一个要学习的概念或主题。 理解和学习&#xff1a;用自己的方式学…...

Transformer模型 | Pytorch实现Transformer模型进行时间序列预测

Transformer模型最初是为了处理自然语言处理任务而设计的,但它也可以用于时间序列预测。下面是将Transformer模型应用于时间序列预测的一般步骤: 数据准备:准备时间序列数据集,包括历史观测值和目标预测值。通常,你需要将时间序列转换为固定长度的滑动窗口序列,以便输入…...

Git推送大量内容导致http 413错误

Git推送大量内容导致服务端HTTP 413错误 问题描述 使用git push 大量变更内容&#xff08;超过60M&#xff09;时报 http 413错误&#xff0c;详细错误信息&#xff1a; Compressing objects: 100% (2907/2907), done. Writing objects: 100% (6760/6760), 64.18 MiB | 1.18…...

pytest框架的基本使用

1. 测试框架的作用 测试框架不关系用例的内容 它关心的是&#xff1a;用例编排和结果收集 2. pytest框架的特点 1. 适用于python语言 2. 用法符合python风格 3. 有丰富的生态 3. 安装pytest框架 1. 新建一个项目 2. 在项目终端窗口输入如下命令&#xff0c;用于安装py…...

C++STL之map、set的使用和模拟实现

绪论​&#xff1a; “我这个人走得很慢&#xff0c;但是我从不后退。——亚伯拉罕林肯”&#xff0c;本章是接上一章搜索二叉树中红黑树的后续文章&#xff0c;若没有看过强烈建议观看&#xff0c;否则后面模拟实现部分很看懂其代码原理。本章主要讲了map、set是如何使用的&am…...

100天精通鸿蒙从入门到跳槽——第18天:ArkTS组件状态管理装饰器

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》 — Go语言学习之旅!《100天精通鸿蒙》 — 从Web/安卓到鸿蒙大师!100天…...

【前端】防抖

防抖用于限制连续触发的事件的执行频率。当一个事件被触发时,防抖会延迟一定的时间执行对应的处理函数。如果在延迟时间内再次触发了同样的事件,那么之前的延迟执行将被取消,重新开始计时 场景 :用户输入 项目中遇到的场景,需要鼠标悬浮在图表的时候,将ToolsTip里的数据…...

python对图片或文件的操作

一. base64 与图片的相互转换 1. base64 转图片 import base64 from io import BytesIO from PIL import Image# base64 编码的图像数据&#xff08;示例&#xff09; base64_data "iVBn9DHASKJDjDsdSADSf8lgg"# 将 base64 编码的字符串解码为二进制数据 binary_d…...

架构篇19:单服务器高性能模式-Reactor与Proactor

文章目录 ReactorProactor小结上篇介绍了单服务器高性能的 PPC 和 TPC 模式,它们的优点是实现简单,缺点是都无法支撑高并发的场景,尤其是互联网发展到现在,各种海量用户业务的出现,PPC 和 TPC 完全无能为力。今天我将介绍可以应对高并发场景的单服务器高性能架构模式:Rea…...