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

C语言实战——扫雷游戏

目录

  • 1. 扫雷游戏分析和设计
  • 2.扫雷游戏的代码实现

1. 扫雷游戏分析和设计

1.1扫雷游戏的功能说明

  • 使用控制台实现经典的扫雷游戏
  • 游戏可以通过菜单实现继续玩或者退出游戏
  • 扫雷的棋盘是9*9的格子
  • 默认随机布置10个雷
  • 可以排查雷
    如果位置不是雷,就显示周围有几个雷
    如果位置是雷,就炸死游戏结束
    把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束。

游戏的界面:

  • 初始界面:
    在这里插入图片描述
  • 排雷界面:
    在这里插入图片描述
  • 排雷失败界面:
    在这里插入图片描述

1.2 游戏的分析和设计
1.2.1 数据结构的分析
扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。
因为我们需要在9* 9的棋盘上布置雷的信息和排查雷,我们首先想到的就是创建⼀个9*9的数组来存放信息。
在这里插入图片描述

那如果这个位置布置雷,我们就存放1,没有布置雷就存放0。
在这里插入图片描述

假设我们排查(2,5)这个坐标时,我们访问周围的⼀圈8个黄色位置,统计周围雷的个数是1。
假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个黄色位置,统计周围雷的个数时,最下面的三个坐标就会越界,为了防止越界,我们在设计的时候,给数组扩大一圈,雷还是布置在中间的9*9的坐标上,周围⼀圈不去布置雷就行,这样就解决了越界的问题。所以我们将存放数据的数组创建成11 *11是比较合适。

排雷的假设
在这里插入图片描述

周围加上⼀圈的棋盘
在这里插入图片描述

再继续分析,我们在棋盘上布置了雷,棋盘上雷的信息(1)和非雷的信息(0),假设我们排查了某⼀个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪里呢?如果存放在布置雷的数组中,这样雷的信息和雷的个数信息就可能或产生混淆和打印上的困难。

这里我们肯定有办法解决,比如:雷和非雷的信息不要使用数字,使用某些字符就行,这样就避免冲突了,但是这样做棋盘上有雷和非雷的信息,还有排查出的雷的个数信息,就比较混杂,不够方便。

这里我们采用另外⼀种方案,我们专门给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不干扰了,把雷布置到mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期排查参考。

同时为了保持神秘,show数组开始时初始化为符’*‘,为了保持两个数组的类型⼀致,可以使用同⼀套函数处理,mine数组最开始也初始化为字符’0’,布置雷成’1’。如下如:

mine数组布置雷后的状态
在这里插入图片描述

show输出初始化的状态
在这里插入图片描述

对应的数组应该是:

char mine[11][11] = {0};//⽤来存放布置好的雷的信息 
char show[11][11] = {0};//⽤来存放排查出的雷的个数信息

1.2.2 文件结构设计
使用多文件的形式对函数的声明和定义,我们设计三个文件:

1.test.c //文件中写游戏的测试逻辑
2. game.c //文件中写游戏中函数的实现等
3. game.h //文件中写游戏需要的数据类型和函数声明等

2.扫雷游戏的代码实现

game.h

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2//雷的数量
#define EASY_COUNT 10//初始化棋盘
void InitBoard(char arr[ROWS][COLS], int rows, int cols,char set);//打印棋盘
void DisplayBoard(char arr[ROWS][COLS], int row, int col);//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS #include "game.h"void InitBoard(char arr[ROWS][COLS], int rows, int cols,char set)
{for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){arr[i][j] = set;}}
}void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{printf("------扫雷游戏------\n");//打印行号for (int i = 0; i <= col; i++){printf("%d ", i);}printf("\n");for (int i = 1; i <= row; i++){//打印列号printf("%d ", i);for (int j = 1; j <= col; j++){printf("%c ", arr[i][j]);}printf("\n");}
}void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y]=='0'){mine[x][y] = '1';count--;}}
}int FindMineCount(char mine[ROWS][COLS], int x, int y)
{int count = 0;for (int i = x - 1;i <= x + 1; i++){for (int j = y - 1; j <= y + 1; j++){count += (mine[i][j] - '0');//(易错点)}}return count;
}void FindMine(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 >= 1 && x <= row && y >= 1 && y <= col){//判断是否已经排查过了if (show[x][y] == '*'){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");DisplayBoard(mine, ROW, COL);break;}else{//不是雷,就要统计周围的雷的个数int count = FindMineCount(mine, x, y);show[x][y] = count + '0';  //(易错点)DisplayBoard(show, ROW, COL);win++;}}else{printf("该坐标已经被排查,请重新输入。\n");}}else{printf("坐标非法,请重新输入。\n");}}if (win == row * col - EASY_COUNT) //(易错点){printf("恭喜你,扫雷成功!\n");DisplayBoard(mine, ROW, COL);}
}

test.c

#define _CRT_SECURE_NO_WARNINGS #include "game.h"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(mine, ROW, COL);//打印棋盘DisplayBoard(show, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);}void test()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏!\n");break;default:printf("选择错误,请重新选择。\n");break;}} while (input);
}int main()
{test();return 0;
}

相关文章:

C语言实战——扫雷游戏

目录 1. 扫雷游戏分析和设计2.扫雷游戏的代码实现 1. 扫雷游戏分析和设计 1.1扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格子默认随机布置10个雷可以排查雷 如果位置不是雷&#xff0c;就显示周围有几个雷 如果…...

.Net使用ElasticSearch

文章目录 前言主体内容一.Kibana中ElasticSearch的基础操作1.GET&#xff08;查询&#xff09;1.POST&#xff08;新增&#xff09;1.PUT&#xff08;修改&#xff09;1.DELET&#xff08;删除&#xff09; 二.在.Net中&#xff0c;对ElasticSearch进行基础操作1.DotNet连接Ela…...

HTML5、CSS3面试题(二)

上一章:HTML5、CSS3面试题&#xff08;一&#xff09; 哪些是块级元素那些是行内元素&#xff0c;各有什么特点 &#xff1f;&#xff08;必会&#xff09; 行内元素: a、span、b、img、strong、input、select、lable、em、button、textarea 、selecting 块级元素&#xff1…...

sqllab第十一关通关笔记

知识点&#xff1a; 发现登录框就可以尝试注入登录框一般都是字符型注入通过注入可以获取其他表的信息绕过手段 单引号闭合联合注入也可以进行错误注入 首先看界面是一个登录框&#xff1b;通过admin admin登录进去&#xff0c;发现页面会把用户名和密码的登录信息打印出来&am…...

机械女生,双非本985硕,目前学了C 基础知识,转嵌入式还是java更好?

作为单片机项目开发的卖课佬&#xff0c;个人建议&#xff0c;先转嵌入式单片机开发方向&#xff0c;哈哈。 java我也学过&#xff0c;还学过oracle、mysql数据库&#xff0c;只是当时没做笔记&#xff0c;找不好充分的装逼证据了。 从实习通过业余时间&#xff0c;学到快正式毕…...

Python之字符串操作大全(29种方法)

本章详细介绍了常用的29种字符串操作方法及代码示例。 1. 重复输出字符串 print(x * 20) 输出&#xff1a;xxxxxxxxxxxxxxxxxxxx 2. 通过索引获取字符串 print(hello world[2:5]) 输出&#xff1a;llo 3. in 判断字符是否在字符串内 print(e in hello world) 输出&…...

ArcGIS学习(十五)用地适宜性评价

ArcGIS学习(十五)用地适宜性评价 本任务给大家带来的内容是用地适宜性评价。 用地适宜性评价是大家在平时工作中最常接触到的分析场景之一。尤其是在国土空间规划的大背景下,用地适宜性评价变得越来越重要。 此外,我们之前的任务主要是使用矢量数据进行分析。本案例是主讲…...

【matlab】如何将.mat文件与.nii文件互转

【matlab】如何将.mat文件与.nii文件互转 .mat转为.nii文件 有时候代码需要读取的是.nii文件&#xff0c;但是如何现有的数据是.mat格式&#xff0c;需要将.mata转化为.nii文件 1、先加载.mat文件 % 加载.mat文件 load(your_mat_file.mat); % 请将your_mat_file.mat替换为实…...

Uni-app开发Canvas当子组件示例,点点绘制图形

前言 使用Uni-app 实现封装一个Canvas渲染的子组件&#xff0c;实现通过传入两点绘制一条完整的路程 具体逻辑看我发的后端和数据库设计 C# 根据两点名称&#xff0c;寻找两短路程的最优解&#xff0c;【有数据库设计&#xff0c;完整代码】 即使不了解具体逻辑&#xff0c;该…...

从金蝶云星空到钉钉通过接口配置打通数据

从金蝶云星空到钉钉通过接口配置打通数据 对接系统金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&#xff0c;旨在帮助企业打造面…...

Unreal发布Android在刘海屏手机上不能全屏显示问题

Unreal 4.27发布Android在刘海屏手机上不能全屏显示问题 Android设置全屏刘海屏全屏设置4.27设置刘海屏在部分手机不能显示问题 Android设置全屏 AndroidManifest.xml文件配置 ...<activity android:name"com.epicgames.ue4.GameActivity" android:label"st…...

hive库表占用空间大小的命令

1、查每个hive表占用的空间大小 hdfs dfs -du -h /user/hive/warehouse 2、按占用空间大小降序排列 hdfs dfs -du /user/hive/warehouse/ipms.db | sort -nr 3、查某一个分区占用空间大小&#xff08;单位G) hadoop fs -ls /user/hive/warehouse/ipms.db/dw_ft_se_nt_u_gen…...

关于go中的select

笔记仓库&#xff1a;gitee.com/xiaoyinhui 代码中的解释纯个人理解&#xff0c;有不对的望指出 package testsimport ("fmt""testing" )var uCnt int 0func TestSelece(t *testing.T) {// 对于 select 语句&#xff0c;在进入该语句时&#xff0c;会按源…...

【Node.js从基础到高级运用】十一、构建RESTful API

在本篇博客中&#xff0c;我们将综合之前讨论的内容&#xff0c;深入探索如何使用Node.js构建一个RESTful API。我们将重点讨论设计合理的API端点&#xff0c;展示如何通过代码实现这些端点&#xff0c;并指导如何使用Postman测试我们的API&#xff0c;确保其按预期工作。 前提…...

Python和MATLAB数字信号波形和模型模拟

要点 Python和MATLAB实现以下波形和模型模拟 以给定采样率模拟正弦信号&#xff0c;生成给定参数的方波信号&#xff0c;生成给定参数隔离矩形脉冲&#xff0c;生成并绘制线性调频信号。快速傅里叶变换结果释义&#xff1a;复数离散傅里叶变换、频率仓和快速傅里叶变换移位&am…...

华为OD技术C卷“测试用例执行计划”Java解答

描述 示例 算法思路1 整体思路是&#xff0c;先读取特性的优先级和测试用例覆盖的特性列表&#xff0c;然后计算每个测试用例的优先级&#xff0c;并将其与测试用例的索引存储到二维数组中。最后按照优先级和索引排序&#xff0c;输出测试用例的索引&#xff0c;即为执行顺序。…...

solana 入门 1

solana-co-learn Solana 开发学习笔记(一)——从 Hello World 出发 安装开发环境 windows下环境配置 wsl First start with installing WSL on your system. wsl --install wsl安装Ubuntu 列出可用的分发版 wsl.exe --list --online显示&#xff1a; 以下是可安装的有效…...

JavaEE之多线程(创建线程的五种写法)详解

&#x1f63d;博主CSDN主页: 小源_&#x1f63d; &#x1f58b;️个人专栏: JavaEE &#x1f600;努力追逐大佬们的步伐~ 目录 1. 前言 2. 操作系统"内核" 3. 创建线程的五种写法 (我们重点要掌握最后一种写法!!) 3.1 继承 Thread, 重写 run 3. 2 实现 Runnabl…...

ChatGPT国内能用吗?中国用户怎么才能使用ChatGPT?

与ChatGPT类似的国内网站&#xff0c;他们都能提供和ChatGPT相似的能力&#xff0c;而且可以在国内直接使用。 点击直达方式 百科GPT官网&#xff1a;baikegpt.cn ChatGPT是基于GPT-3.5架构的语言模型的一个实例&#xff0c;由OpenAI开发。以下是ChatGPT的发展历史&#xff1…...

集群保持集群负载均衡和hash一致性

集群保持负载均衡和一致性哈希是在构建分布式系统时经常涉及的两个重要概念。 负载均衡&#xff1a; - 在集群中&#xff0c;负载均衡是指将传入的请求有效地分发到不同的服务器上&#xff0c;以确保每台服务器都能够处理适量的流量&#xff0c;避免某些服务器过载而造成性能问…...

企业单点登录(SSO)迁移DeepSeek的最后72小时:金融级审计日志、国密SM2签名、等保2.0合规 checklist

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;企业单点登录&#xff08;SSO&#xff09;迁移DeepSeek的最后72小时&#xff1a;金融级审计日志、国密SM2签名、等保2.0合规 checklist 在核心交易系统上线前72小时&#xff0c;某全国性股份制银行完成SSO服务…...

使用 TaoToken CLI 工具一键配置多开发环境与团队统一接入

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用 TaoToken CLI 工具一键配置多开发环境与团队统一接入 在团队协作开发中&#xff0c;如何快速、统一地将大模型服务接入到不同…...

机器学习与重要性采样融合:高效估计黑盒模型尾部风险

1. 项目概述在金融工程和风险管理的核心地带&#xff0c;我们常常需要面对一个棘手的现实&#xff1a;许多关键的风险模型&#xff0c;例如保险公司用于评估极端赔付的内部模型&#xff0c;或者银行用于压力测试的复杂资产定价引擎&#xff0c;本质上都是“黑盒”。这些模型接受…...

IPXWrapper完整教程:让经典游戏在Windows 10/11重获联机能力

IPXWrapper完整教程&#xff1a;让经典游戏在Windows 10/11重获联机能力 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 还在为《星际争霸》《帝国时代》等经典游戏无法在现代Windows系统上联机而烦恼吗&#xff1f;IPXWrapper正…...

博弈编码:用激励相容机制实现抗女巫攻击的去中心化机器学习

1. 项目概述&#xff1a;当编码遇见博弈论在分布式计算和存储领域&#xff0c;编码理论&#xff08;Coding Theory&#xff09;一直扮演着“守护神”的角色。无论是经典的纠删码&#xff08;Erasure Code&#xff09;还是更复杂的再生码&#xff08;Regenerating Code&#xff…...

如何快速掌握tsMuxer:视频无损封装的终极指南

如何快速掌握tsMuxer&#xff1a;视频无损封装的终极指南 【免费下载链接】tsMuxer tsMuxer is a transport stream muxer for remuxing/muxing elementary streams, EVO/VOB/MPG, MKV/MKA, MP4/MOV, TS, M2TS to TS to M2TS. Supported video codecs H.264/AVC, H.265/HEVC, V…...

机器学习研究代码可复现性:从依赖管理到工程化实践

1. 项目概述&#xff1a;为什么机器学习研究需要“工程化”&#xff1f;如果你在机器学习领域摸爬滚打过几年&#xff0c;大概率经历过这样的场景&#xff1a;兴冲冲地打开一篇顶会论文的GitHub仓库&#xff0c;准备复现其惊艳的实验结果&#xff0c;却发现README里只有一句“运…...

VisualGGPK2:流放之路游戏资源编辑的终极指南,轻松打造个性化游戏体验

VisualGGPK2&#xff1a;流放之路游戏资源编辑的终极指南&#xff0c;轻松打造个性化游戏体验 【免费下载链接】VisualGGPK2 Library for Content.ggpk of PathOfExile (Rewrite of libggpk) 项目地址: https://gitcode.com/gh_mirrors/vi/VisualGGPK2 VisualGGPK2是一款…...

DTW与K-means在供暖负荷时间序列聚类中的工程实践与评估

1. 项目概述&#xff1a;从数据中发现供暖行为的“指纹”处理过建筑能耗数据的朋友都知道&#xff0c;那是一片看似规律、实则充满“个性”的海洋。每栋建筑、每个家庭&#xff0c;其供暖系统的运行模式都像是一枚独特的指纹&#xff0c;受到锅炉性能、室外温度、建筑保温、乃至…...

构建高性能医疗对话数据引擎:792,099条中文医疗问答数据集的技术架构与应用

构建高性能医疗对话数据引擎&#xff1a;792,099条中文医疗问答数据集的技术架构与应用 【免费下载链接】Chinese-medical-dialogue-data Chinese medical dialogue data 中文医疗对话数据集 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-medical-dialogue-data …...