C语言---扫雷游戏的实现
1.扫雷游戏的分析和设计
需要创建3个文件夹
test.c----扫雷游戏的测试
game.c----扫雷游戏的实现
game.h----扫雷游戏的实现
雷的信息使用二维数组存放
• 使⽤控制台实现经典的扫雷游戏
• 游戏可以通过菜单实现继续玩或者退出游戏
• 扫雷的棋盘是9*9的格⼦
• 默认随机布置10个雷
• 可以排查雷
◦ 如果位置不是雷,就显⽰周围有⼏个雷◦ 如果位置是雷,就炸死游戏结束◦ 把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束
扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息
创建两个数组,一个存放雷,1是雷,0不是雷
第二个数组就存放排查出的雷的信息,避免太过混乱,
越界访问会导致程序崩溃
把存放雷的数组扩大一圈,防止越界,上下左右多一行和列,
1.使用两个二维数组来实现
2.如果棋盘的大小是99,数组的大小就给1111
因为要扩大一圈后的大小就是11*11
3.数组使用字符数组就行
2.扫雷游戏的代码实现
game.h
#pragma once#include <stdio.h>//直接把头文件放在.h文件里面
#include <stdlib.h>
#include <time.h>
#pragma once
#define ROW 9//行
#define COL 9//列#define ROWS ROW+2//11
#define COLS COL+2#define EASY_count 10//简单版本设置的雷为10
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//11//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);//9//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
test.c
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"//包含自己的头文件,就能引用game.h中自己定义的一些条件
void menu()
{//打印菜单printf("**********************************************\n");printf("*************** 1 . play ***************\n");printf("*************** 0 . exit ***************\n");printf("**********************************************\n");
}
void game()
{//游戏逻辑 11 * 11char mine[ROWS][COLS] = {0};//存放雷的信息char show[ROWS][COLS] = {0};//存放排查出的雷的信息//初始化棋盘,初始化的是11*11的规格,因为最外面的外围要保证咱们得程序不越界InitBoard(mine,ROWS,COLS,'0');//把11行11列传过去InitBoard(show, ROWS, COLS,'*');//打印棋盘,就只打印9*9的部分DisplayBoard(show, ROW, COL);//DisplayBoard(mine, ROW, COL);测试一下//布置雷,只在9*9的部分布置雷SetMine(mine, ROW, COL);//把雷放到mine数组内,因为mine数组就是存放雷的信息的数组//DisplayBoard(mine, ROW, COL);//排查雷,在9*9的部分排查雷FindMine(mine,show,ROW,COL);
}void test()
{int input = 0;//这个变量必须放外面,如果放里面的话,//每次循环进行就会将input重新赋值为0srand((unsigned int)time(NULL));//要包含头文件,使rand产生随机值,就是产生随机的雷do{menu();//打印菜单printf("请选择:");scanf("%d",&input);//判断输入的值switch (input){case 1:game();//输入1之后进入游戏printf("扫雷\n");break;case 0:printf("退出游戏\n");break;default://输入错误printf("选择错误,重新选择\n");break;}}while (input);//一直玩的情况,玩完一把接着玩,输入input,是1就接着玩}int main()
{test();return 0;
}
game.c
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"//包含自己的头文件
//初始化棋盘,规格是11*11
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;//想初始化什么就初始化什么,初始化的值就是传过来的字符}}
}//只打印9*9
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("温馨提示:");printf("在输入数据的时候不要输入逗号\n");printf("应该在输入一个坐标值后按一下空格\n");printf("再输入另一个坐标值\n");printf("不听话你就等着出乱码吧\n");printf("--------扫雷-------\n");int i = 0;for (i = 0; i <=col; i++)//从0开始保证对其{printf("%d ", i);//打印列数}printf("\n");for (i = 1; i <= row; i++)//为什么从1开始,因为最外围有一圈是空的,为了防止越界{printf("%d ", i);//打印行数int j = 0;for (j = 1; j <=col; j++){printf("%c ", board[i][j]);}printf("\n");//打印完一行就换行}printf("--------扫雷-------\n");
}
//布置的雷是在棋盘上随机的找啊10个坐标布置的
void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_count;//给出雷的个数,每布置一个雷就减少一个雷int x = 0, y = 0;while (count)//当count为0的时候就不再进入循环了,雷已经布置好了{//x,y生成的坐标范围都是1~9x = rand()%row+1;//行y = rand()%col+1;//列//如果这个坐标已经放雷就不需要重复放雷,如果没放就放雷if (mine[x][y] != '1')//如果这个位置不是字符一{mine[x][y] = '1';//就放一个字符一//布置一个雷count--;//减少一个雷}}
}
//'1'-'0'=1, '1'的ASCLL值是49
// '2'-'0'=2
//统计周围雷的个数
int Get_Mine_Count(char mine[ROWS][COLS],int x,int y)//返回雷的个数
{//将你输入的坐标周围的8个坐标的原有的字符相加起来,这些原有的字符可能是'1'或者是'0'//有雷或者没有雷//第一种写法/*return 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]-8*'0';//坐标上面的值减去字符0就是他们坐标上面有的数字,//在你输入的坐标周围总共有8个坐标,所以直接8*'0'*///第二种写法使用循环的方式int i = 0,count=0;for (i = -1; i <= 1; i++){int j = 0;for (j = -1; j <= 1; j++){count+=mine[x + i][y + j] - '0';//因为你输入的坐标不是雷,所以将他加进去也无所谓//要排查周围雷的信息//将这8个坐标上的字符数字累加在count内}//mine[x + i][y + j]随之i和j的变化,模拟了你输入的坐标周围的8个坐标的值}return count;
}//排查雷思路:
//1.输入一个坐标
//2.判断这个坐标是否越界
//3.判断这份位置是否是雷
//如果是雷,就炸死
//如果不是雷,就统计这个周围雷的个数,显示出来
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0, y = 0;int win = 0;while (win<col*row- EASY_count)//总共的方格数-雷的数量,直到这个值为0,是不会停下的,除非你提前踩雷了{printf("请输入排查的坐标");scanf("%d %d", &x, &y);if (x >= 1 && x < row && y >= 1 && y <= col)//输入的坐标是合法的{//接下来就判断这个坐标上面是不是雷if (mine[x][y] =='1')//输入的位置是雷{printf("很遗憾,你踩雷了,游戏结束");DisplayBoard(mine, ROW, COL);//让玩家死得瞑目,知道雷的位置break;//让循环停下来}else//输入的位置不是雷,我们就要统计这个坐标周围的8个坐标雷的数量{int count = Get_Mine_Count(mine, x, y);//统计类雷的个数,//将算出的雷的数量放到show数组show[x][y] = count + '0';//转化为字符放到数组里面DisplayBoard(show, ROW, COL);//打印show数组内的信息//不是雷的话win++;//}}else{printf("输入的坐标有误,x(1~9),y(1~9),应该重新输入");}}//如果我们把所有不是雷的位置都排查完了,那我们排雷就成功了if (win == row * col - EASY_count)//所有的雷都被排完了{printf("恭喜你,排雷成功了");//把雷的信息打印出来DisplayBoard(mine, ROW, COL);}
}
3.扫雷游戏的拓展
是否可以选择游戏难度
简单:9*9棋盘,10个雷
中等:16*16棋盘,40个雷
困难:30*16棋盘,99个雷
点开一个坐标,周围不是雷的就都显现出来了
在线扫雷游戏:扫雷游戏网页版 - Minesweeper
相关文章:
C语言---扫雷游戏的实现
1.扫雷游戏的分析和设计 需要创建3个文件夹 test.c----扫雷游戏的测试 game.c----扫雷游戏的实现 game.h----扫雷游戏的实现 雷的信息使用二维数组存放 • 使⽤控制台实现经典的扫雷游戏 • 游戏可以通过菜单实现继续玩或者退出游戏 • 扫雷的棋盘是9*9的格⼦ • 默认…...
《征服数据结构》块状链表
摘要: 1,块状链表的介绍 2,块状链表的代码实现(Java和C) 1,块状链表的介绍 前面我们讲过数组和链表,数组具有 O(1)的查询时间,O(N)的删除,O(N)的插入,而链表具…...
leetCode.86. 分隔链表
leetCode.86. 分隔链表 题目思路: 代码 class Solution { public:ListNode* partition(ListNode* head, int x) {auto lh new ListNode(-1), rh new ListNode(-1);auto lt lh, rt rh;for(auto p head; p; p p->next ) {if(p->val < x) {lt lt->…...
Java进阶学习笔记5——Static应用知识:单例设计模式
设计模式: 架构师会使用到设计模式,开发框架,就需要掌握很多设计模式。 在Java基础阶段学习设计模式,将来面试笔试的时候,笔试题目会经常靠到设计模式。 将来会用到设计模式。框架代码中会用到设计模式。 什么是设计…...
Vue 前端加框 给div加红色框框 js实现
实现方式:用getElementsByClassName、createElement、appendChild实现在原有div上添加一个新的div,从而达到框选效果 <template><div><el-button click"addIten">添加</el-button><el-button click"deleteIt…...
Percona Toolkit 神器全攻略(实用类)
Percona Toolkit 神器全攻略(实用类) Percona Toolkit 神器全攻略系列共八篇,前文回顾: 前文回顾Percona Toolkit 神器全攻略 全文约定:$为命令提示符、greatsql>为GreatSQL数据库提示符。在后续阅读中,…...
ARM GIC 和NVIC的区别
ARM GIC(Generic Interrupt Controller)和NVIC(Nested Vectored Interrupt Controller)是两种不同的中断控制器,它们在ARM架构中扮演着重要的角色,但各自有不同的设计和应用场景。 ARM GIC: G…...
CSS文本粒子动画特效之爱心粒子文字特效-Canvas
1. 效果图 2.完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>body,html {margin: 0;paddin…...
小熊家务帮day5 客户管理模块1 (小程序认证,手机验证码认证等)
客户管理模块 1.认证模块1.1 认证方式介绍1.1.1 小程序认证1.1.2 手机验证码登录1.1.3 账号密码认证 1.2 小程序认证1.2.1 小程序申请1.2.2 创建客户后端工程jzo2o-customer1.2.3 开发部署前端1.2.4 小程序认证流程1.2.4.1 customer小程序认证接口设计Controller层Service层调用…...
Blender 学习笔记(一)快捷键记录
Blender 的快捷键映射非常强大,如果学会将会快速提高工作效率,本文抄自 Blender 4.1 Manual,基于 Blender 4.1,因为自己使用 Windows,所以只记录 Windows 相关快捷键。 全局快捷键 键位作用ctrl0打开文件ctrls保存文…...
ubuntu linux (20.04) 源码编译cryptopp库 - apt版本过旧
下载最新版 https://www.cryptopp.com/#download 编译安装: #下载Cryptopp源码 #git clone https://gitee.com/PaddleGitee/cryptopp.git#进入文件夹 cd cryptopp #编译,多cpu处理 make -j8 #安装,默认路径:/usr/local sudo m…...
机器学习-3-特征工程的重要性及常用特征选择方法
参考特征重要性:理解机器学习模型预测中的关键因素 参考[数据分析]特征选择的方法 1 特征重要性 特征重要性帮助我们理解哪些特征或变量对模型预测的影响最大。 特征重要性是数据科学中一个至关重要的概念,尤其是在建立预测性任务的模型时。想象你正在尝试预测明天是否会下…...
QGis3.34.5工具软件保存样式,软件无反应问题
在使用QGis软件保存SLD样式的时候,每次保存样式,软件都进入无反应状态,导致无法生成样式文件 百度中多次查询问题点,终未能在在3.34.5这个版本上解决问题。 考虑到可能是软件本身问题,于是删除了3.34.5这个版本&#x…...
JavaScript(ES6)入门
ES6 1、介绍 ECMAScript 6(简称ES6)是于2015年6月正式发布的JavaScript 语言的标准,正式名为ECMAScript 2015(ES2015)。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。…...
深入分析 Android Activity (十)
文章目录 深入分析 Android Activity (十)1. Activity 的资源管理1.1 使用资源 ID 访问资源1.2 Drawable 资源1.3 使用 TypedArray 管理资源1.4 使用资源配置 2. Activity 的数据存储2.1 SharedPreferences2.2 文件存储2.3 SQLite 数据库2.4 ContentProvider 3. Activity 的性能…...
考试“挂了“用日语怎么说,柯桥商务日语培训
1、もえる 热衷于……,燃烧 除了“燃烧”,还有“热衷于……”的意思,如“家が燃える(房子着火了)”,“勉強に燃える(热衷于学习)”。 A:今(いま&…...
【机器学习300问】103、简单的经典卷积神经网络结构设计成什么样?以LeNet-5为例说明。
一个简单的经典CNN网络结构由:输入层、卷积层、池化层、全连接层和输出层,这五种神经网络层结构组成。它最最经典的实例是LeNet-5,它最早被设计用于手写数字识别任务,包含两个卷积层、两个池化层、几个全连接层,以及最…...
【代码随想录算法训练营第37期 第二十一天 | LeetCode530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先】
代码随想录算法训练营第37期 第二十一天 | LeetCode530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先 一、530.二叉搜索树的最小绝对差 解题代码C: /*** Definition for a binary tree node.* struct TreeNode {* int val;* …...
2023 年网络等级保护考试题库及答案
一、单项选择题 1.在等保 1.0 的根本要求中,网络设备防护的内容归属于网络安全,在等保 2.0 中将其归属到〔〕。 A 安全通信网络 B 安全区域边界 C 安全计算环境 D 安全治理中心 答案:c 2.应成立指导和治理网络安全工作的委员会或领导小组&…...
springboot集成nacos
springboot集成nacos 1.版本2. POM依赖3. nacos服务3.1 下载nacos压缩包3.2 启动nacos 4. yaml配置5.Demo5.1 配置中心简单格式获取方式普通方式还可以再启动类上添加注解完成5.2 获取json格式的demo5.2 自动注册根据yaml配置 1.版本 nacos版本:2.3.2 springboot版本ÿ…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
