C语言---扫雷游戏的实现

news/2024/7/22 1:23:47/文章来源:https://blog.csdn.net/2301_80863610/article/details/139263742

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1054195.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日复盘-20240528

今日重点关注&#xff1a; 20240528 六日涨幅最大: ------1--------300956--------- 英力股份 五日涨幅最大: ------1--------301361--------- 众智科技 四日涨幅最大: ------1--------301361--------- 众智科技 三日涨幅最大: ------1--------301361--------- 众智科技 二日涨…

【全开源】CMS内容管理系统源码(ThinkPHP+FastAdmin)

基于ThinkPHPFastAdmin的CMS内容管理系统&#xff0c;自定义内容模型、自定义单页、自定义表单、专题、统计报表、会员发布等 提供全部前后台无加密源代码和数据库私有化部署&#xff0c;UniAPP版本提供全部无加密UniAPP源码。 ​构建高效内容管理的基石 一、引言&#xff1a…

如何将 Langfuse 链接到自有 PostgreSQL 数据库并升级 PostgreSQL 版本

在本文中,我们将介绍如何将 Langfuse 应用程序链接到自有的 PostgreSQL 数据库,并升级 PostgreSQL 以支持 jsonb 类型。 前提条件 运行 CentOS 7 的服务器已安装的 PostgreSQL 9.2 或更低版本需要将 Langfuse 连接到自有数据库,并升级 PostgreSQL 以支持 jsonb 类型1. 将 La…

小程序使用vant组件库

一:下载组件库 在小程序内npm下载的包 vant组件库官网:快速上手 - Vant Weapp (youzan.github.io) 1)首先有有package.json文件,没有的话则先初始化 即使通过package.json去下载包,也需要有,可以观察下载的包. 2)下载包 3)构建npm包 下载包之后存储在node_modules内,但是我们…

R包Colorfindr识别图片颜色|用刀剑神域方式打开SCI科研配色

1.前言 最近忙里偷闲&#xff0c;捣鼓一下配色&#xff0c;把童年回忆里的动漫都搬进来&#xff0c;给科研信仰充值吧&#xff5e; 提取颜色之前写过一个Py的&#xff0c;那个很准确不过调参会有点麻烦。这里分享一个比较懒人点的R包吧&#xff0c;虽然会有一定误差&#xff…

yolox-何为混合精度计算AMP?

何为AMP&#xff1f; 全称&#xff1a;Automatic mixed precision自动混合精度。 功能&#xff1a;在神经网络推理过程中&#xff0c;实现针对不同层采用不同的数据精度进行计算&#xff0c;从而实现节省显存和加速训练的目的。 此处提到的不同数据精度包括&#xff1a;32位浮…

撤销最近一次的提交,使用git revert 和 git reset的区别

文章目录 工作区 暂存区 本地仓库 远程仓库需求&#xff1a;已推送到远程仓库&#xff0c;想要撤销操作git revert &#xff08;添加新的提交来“反做”之前的更改&#xff0c;云端会残留上次的提交记录&#xff09;git reset&#xff08;相当于覆盖上次的提交&#xff09;1.--…

探索Django 5: 从零开始,打造你的第一个Web应用

今天我们将一起探索 Django 5&#xff0c;一个备受开发者喜爱的 Python Web 框架。我们会了解 Django 5 的简介&#xff0c;新特性&#xff0c;如何安装 Django&#xff0c;以及用 Django 编写一个简单的 “Hello, World” 网站。最后&#xff0c;我会推荐一本与 Django 5 相关…

three.js能实现啥效果?看过来,这里都是它的菜(08)

在Three.js中实现旋转动画的原理是通过修改对象的旋转属性来实现的&#xff0c;通常使用渲染循环&#xff08;render loop&#xff09;来更新对象的旋转状态&#xff0c;从而实现动画效果。 具体的原理包括以下几个步骤&#xff1a; 创建对象&#xff1a;首先创建一个需要旋转…

firewalld

一、Firewalld概述 Firewalld 支持网络区域所定义的网络链接以及接口安全等级的动态防火墙管理工具 支持IPV4、IPV6防火墙设置以及以太网桥 支持服务或应用程序直接添加防火墙规则接口 拥有两种配置模式 运行时配置 永久配置 二、Firewalld和iptables的关系 netfilter 位于L…

触觉训练技巧:盲人感知世界的第二双“眼”

在当今科技日新月异的时代&#xff0c;辅助技术正逐步成为残障人士融入社会的重要桥梁。其中&#xff0c;一款名为““蝙蝠避障””的创新软件&#xff0c;凭借其实时避障和拍照识别功能&#xff0c;为盲人朋友的日常生活带来了前所未有的便捷与安全。然而&#xff0c;技术的辅…

236. 二叉树的最近公共祖先(C++)

文章目录 前言一、题目介绍二、解决方案三、优化总结 前言 在本篇文章中我们将会讲解二叉树中极为经典的题目236. 二叉树的最近公共祖先 一、题目介绍 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的…

Visual Studio 的使用

目录 1. 引言 2. 安装和配置 2.1 系统要求 2.2 安装步骤 2.3 初次配置 3. 界面介绍 3.1 菜单栏和工具栏 3.2 解决方案资源管理器 3.3 编辑器窗口 3.4 输出窗口 3.5 错误列表 3.6 属性窗口 4. 项目管理 4.1 创建新项目 4.2 导入现有项目 4.3 项目属性配置 5. 代…

Spring AOP基于动态代理的实现的 AOP

目录 代理什么是代理代理模式 静态代理动态代理JDK动态代理CGLIB动态代理Spring AOP使用的是哪种代理&#xff1f; 代理 什么是代理 生活中的代理 房产中介 &#xff1a; 房屋进行租赁时&#xff0c;卖方会把房子授权给中介&#xff0c;由中介代理带客户看房&#xff0c;商谈…

灵动微单片机洗衣机方案——【软硬件开发支持】

RAMSUN英尚以洗衣机洗涤主驱电机为例&#xff0c;主驱电机和多电机控制首选MM32SPIN0280.灵动微电子能够提供完整的软硬件开发支持&#xff0c;目前方案已经在主流家电厂出货。 洗衣机方案 皮带洗衣机 DD直驱洗衣机 波轮洗衣机 Mini壁挂和桌面洗衣机 洗涤烘干双变频方案 热泵烘…

浙江大学数据结构MOOC-课后习题-第九讲-排序3 Insertion or Heap Sort

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 测试点 思路分析 和上一题的思路一样&#xff0c;每进行一次迭代&#xff0c;来验证当前序列是否和给定的序列相同 代码展示 #include <cstdlib> #include <iostream> #define MAXSIZE 10…

中国企业出海,哪些业务需要负载均衡?

国内企业出海的进程正在加速。中国的出海企业剑指跨境电商、社交、游戏、短剧等市场&#xff0c;其中尤其以跨境电商的数据最为突出。据官方数据&#xff0c;2023年我国跨境电商进出口总额达到2.38万亿元&#xff0c;比2016年增长近50倍&#xff0c;占货物贸易总规模的5.7%。 …

电源小白入门学习8——电荷泵电路原理及使用注意事项

电源小白入门学习8——电荷泵电路原理及使用注意事项 电荷泵简介电荷泵原理电荷泵设计过程中需要注意的点fly电容的安秒平衡DC/DC功率转换技术对比 电荷泵简介 电荷泵&#xff08;Charge Pump&#xff09;是一种电路拓扑结构&#xff0c;用于实现电压升压或降压的功能。它通过…

记录深度学习GPU配置,下载CUDA与cuDnn

目标下载: cuda 11.0.1_451.22 win10.exe cudnn-11.0-windows-x64-v8.0.2.39.zip cuda历史版本网址 CUDA Toolkit Archive | NVIDIA Developer 自己下载过11.0.1版本 点击下载local版本,本地安装,有2个多GB,很大,我不喜欢network版本,容易掉线 cuDnn https://developer.nvi…

clickhouse——clickhouse单节点部署及基础命令介绍

clickhouse支持运行在主流的64位CPU架构的linux操作系统之上&#xff0c;可以通过源码编译&#xff0c;预编译压缩包&#xff0c;docker镜像和rpm等多种方式进行安装。 一、单节点部署 1、安装curl工具 yum install -y curl 2、添加clickhouse的yum镜像 curl -s https://pack…