小游戏-扫雷

扫雷大多人都不陌生,是一个益智类的小游戏,那么我们能否用c语言来编写呢,

我们先来分析一下扫雷的运行逻辑,

首先,用户在进来时需要我们给与一个菜单,以供用户选择,

然后我们来完善一下,写出用户输入后对应要进行的内容,

game函数就是我们要写的扫雷的具体操作了,

首先我们来分析一下扫雷游戏的运行原理,

扫雷需要一个表格,可能是9*9,也可能是15*15,我们就拿9*9举例,

我们首先需要对这个9*9的表格进行埋雷,那用什么来代表我这个格子是不是雷呢,

我们可以用两个不同的字符来代替,我们假设’1‘为雷,’0‘没有雷,

转化为程序语言,表格我们用二维数组,埋雷用rand函数(rand函数在之前的文章中有讲述,没有学过的同学可以看一下,在“小游戏-猜数字”中)。

下面是我们的9*9棋盘,0代表还没有埋雷,

000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000

下面我们随即在其中埋几个雷,

000000000
000101000
010000000
000100000
000000000
001010001
000000000
000010000
001000000

雷埋好了,我们就要开始排雷了,

假如用户点击这个格子,如果没有雷,我们显示周围八个格子中的雷的数量,有雷的话,我们结束游戏,并展示我们埋的雷的情况,

这个格子周围有两个雷,那么我们在这个格子显示为2,

下面,用户继续点击其他格子进行排雷,

这个格子改为1,这个时候就会发现问题

如果用户接下来选择红色格子怎么办,灰色格子是我们更改后的雷的数量,并不代表这里有雷,这里就出现歧义了,那么我们现在应该怎么办呢?我们可以另外开辟一个表格来存放用户扫雷得到的信息,

设置数组大小的时候我们要注意一个点,当用户点到边缘的格子时,周围就不是八个格子了,这时我们去访问就会有越界的情况出现,

那这个时候我们应该怎么办呢,

我们可以在外面再加一圈,变成11*11的表格,但是在埋雷和让用户选择的时候不使用最外层,

00000000000
00000000000
00001010000
00100000000
00001000000
00000000000
00010100010
00000000000
00000100000
00010000000
00000000000

这个时候我们再去访问就不会有越界的情况了,而且在查雷的数量时,也不会有影响,

分析的差不多了,那么我们现在来把想法转换成代码,

我们新建两个文件,一个头文件,一个.c文件,我们声明两个变量放在.h头文件中,

那么我们想要在源.c中用的话就要在源.c中包含头文件#include“扫雷.h",同时我们设置出两个数组,

这里有疑问的朋友可以浏览一下我上面发布的那篇文章(文章标题:”在面对一个大型的代码,需要分文件编写的时候,应该怎么办呢;以及在编写出一个功能时,有人想要买这个功能,怎么在不给出源代码的情况下让买家可以使用这个代码功能呢?”),

下面我们开始埋雷,埋雷前,我们把两个数组初始化,下面的代码要注意都是写在了哪个文件中,

下面我将不再特意标明代码所处文件了,

初始化好后,我们开始随机埋雷,

雷布置完了,现在需要用户进行扫雷,但是扫之前,我们得让用户有选项来选择吧,我们把show棋盘打印给用户,

下面排查雷,

下面我们把游戏放到循环里,

下面我们把小错误改一下,并且完善一下我们的代码,

//源.c:
#define _CRT_SECURE_NO_WARNINGS 1#include "扫雷.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棋盘埋好雷,show棋盘显示*//初始化mine棋盘//InitMine(mine, ROWS, COLS);//InitMine(show, ROWS, COLS);//在上面的代码中多增加一个实参,用于说明要初始化的内容InitMine(mine, ROWS, COLS,'0');InitMine(show, ROWS, COLS,'*');//打印show棋盘//Print(show, ROW, COL);//观察代码是否有问题//布置雷DisPlayBoard(mine, ROW, COL);//Print(mine, ROW, COL);Print(show, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);
}int main()
{int input = 0;srand((unsigned int)time(NULL));do{//菜单menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:printf("--------    扫雷    --------\n");game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新输入\n");break;}} while (input);
}
//扫雷.h:
#pragma once#include<stdio.h>#define EASY_COUNT 10//雷的数量#define ROW 9 //雷的行
#define COL 9 //雷的列//防止访问时越界
#define ROWS ROW+2 
#define COLS COL+2 //棋盘初始化
void InitMine(char board[ROWS][COLS], int rows, int cols,char set);//打印棋盘
void Print(char board[ROWS][COLS], int row, int col);//布置雷
void DisPlayBoard(char board[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//扫雷.c:
#define _CRT_SECURE_NO_WARNINGS 1#include"扫雷.h"//初始化mine棋盘均为字符‘0’
void InitMine(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 Print(char board[ROWS][COLS], int row, int col)
{//打印列号for (int i = 0; i <= row; 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",board[i][j]);}printf("\n");}
}//布置雷
void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{int x = 0, y = 0;//代表布置雷的横纵坐标for (int i = 1; i <= EASY_COUNT; i++){x = rand() % ROW + 1;y = rand() % COL + 1;if (board[x][y] == '1'){i--;}board[x][y] = '1';}
}//排查雷int 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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{//for (int i = 1; i <= row * col - EASY_COUNT; i++)int i = row * col - EASY_COUNT;while(i){printf("请输入要排查雷的坐标:>");int x = 0, y = 0;scanf("%d%d", &x, &y);if (x <= row && y <= col && x>=1 && y>=1){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");break;}else{//统计mine中这个坐标周围有几个雷int count = Count(mine, x, y);show[x][y] = count + '0';//转化为字符Print(show, ROW, COL);i--;}}else{printf("请输入正确的坐标\n");}}if (i == 0){printf("恭喜你!\n");}Print(mine, ROW, COL);
}

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

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

相关文章

OceanMind海睿思入选中国信通院《2023高质量数字化转型技术解决方案集》

近日&#xff0c;由中国信息通信研究院“铸基计划”编制的《2023高质量数字化转型技术解决方案集&#xff08;第一版&#xff09;》正式发布。 中新赛克海睿思 凭借卓越的产品力以及广泛的行业实践&#xff0c;成功入选该方案集的数据分析行业技术解决方案。 为促进数字化转型…

Redis消息队列与thinkphp/queue操作

业务场景 场景一 用户完成注册后需要发送欢迎注册的问候邮件、同时后台要发送实时消息给用户对应的业务员有新的客户注册、最后将用户的注册数据通过接口推送到一个营销用的第三方平台。 遇到两个问题&#xff1a; 由于代码是串行方式&#xff0c;流程大致为&#xff1a;开…

视频号小店月入5w+,真的有那么赚钱吗?

我是电商珠珠 视频号小店是22年视频号团队发展的电商平台&#xff0c;距离现在也不过一年多的时间。我做电商已经有五年左右的时间了&#xff0c;天猫、快手、抖音小店都做过。在22年的时候&#xff0c;我开始琢磨起了视频号小店。 到现在我也拥有了视频号小店的运营团队&…

【C++从练气到飞升】06---重识类和对象

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 ⛳️推荐 一、再谈构造函数 1. 构造函数体赋值 2. 初始化列表 每个成员变量在初始化列表中只能出现一次--初始化只能初始…

python爬虫学习第二天----类型转换

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

leetcode LCR121.寻找目标值-二维数组

目录 问题描述示例具体思路思路一思路二 代码实现 问题描述 m*n 的二维数组 plants 记录了园林景观的植物排布情况&#xff0c;具有以下特性&#xff1a; 每行中&#xff0c;每棵植物的右侧相邻植物不矮于该植物&#xff1b; 每列中&#xff0c;每棵植物的下侧相邻植物不矮于该…

Hive SQL必刷练习题:留存率问题(*****)

留存率&#xff1a; 首次登录算作当天新增&#xff0c;第二天也登录了算作一日留存。可以理解为&#xff0c;在10月1号登陆了。在10月2号也登陆了&#xff0c;那这个人就可以算是在1号留存 今日留存率 &#xff08;今日登录且明天也登录的用户数&#xff09; / 今日登录的总…

一些恶意样本的流量分析学习

Trickbot Trickbot 是一种自 2016 年以来一直在感染受害者的信息窃取者和银行恶意软件。Trickbot通过恶意垃圾邮件&#xff08;malspam&#xff09;分发&#xff0c;也由其他恶意软件&#xff08;如Emotet&#xff0c;IcedID或Ursnif&#xff09;分发。 分析来自恶意垃圾邮件…

银行5G短消息应用架构设计

&#xff08;一&#xff09;RCS简介 1.1 RCS的提出与标准制定 RCS(Rich Communication Services & Suite&#xff0c;富媒体通信)是GSMA(Groupe Speciale Mobile Association&#xff0c;全球移动通信系统协会)在2008年提出的一种通讯方式&#xff0c;RCS融合了语音、消息…

Bytebase 2.14.1 - 分支 (Branching) 功能支持 Oracle

&#x1f680; 新功能 分支 (Branching) 功能支持 Oracle。为 SQL 编辑器添加了项目选择器。 新增 SQL 审核规范&#xff1a; 禁止混合 DDL、DML 语句。禁止对同一张表进行不同类型的 DML 变更 (UPDATE,INSERT,DELETE)。 &#x1f514; 重大变更 工作空间设置中的「数据访问…

【已解决】MySQL:常用的除法运算+精度处理+除数为0处理

目录 问题现象&#xff1a; 问题分析&#xff1a; 拓展&#xff1a; 1、除法运算&#xff1a; 拓展&#xff1a;MySQL中常用的几种除法运算 1、取整除法 2、浮点数除法 3、取余除法 4、向上取整除法 5、向下取整除法 2、运算结果的精度处理 1.1、浮点数 1.2、总位数 1.3、…

电脑哥的励志创业路:蹭别人的电脑做抖店

我是王路飞。 没有一步到位的创业项目&#xff0c;也没有一击必中的解决方法&#xff0c;有的只是需要时刻解决的当下问题。 做事/创业/成长/生活/人生&#xff0c;都不要追求百分百的圆满&#xff0c;不要抱有一帆风顺的幻想&#xff0c;不要期待十全十美的结果。 它们的第…

Visual Studio QT6 工程引入组件模块,例如:QtXml

QT 工程引入 QtXml QT 版本 6.6.1 Visual Studio 版本 Microsoft Visual Studio Community 2022 (64 位) - Current 版本 17.7.5 打开 Visual Studio 项目工程选择 工具栏 - 扩展 - QT VS Tools -Qt Project Settings 勾选 xml 后点击确定 点击应用即可 注意&#xff1a;配置环…

day44 动态规划part6

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

外部普米集中监控多个Prometheus实例:Prometheus Agent 模式与Prometheus 联邦模式 超级详细

外部普米集中监控多个Prometheus实例 Prometheus Agent 模式-使用推送方式来监控1.外部Prometheus配置1.需要开放端口&#xff0c;在启动时&#xff0c;需要配置开放监听端口2.添加prometheus启动参数3.修改配置后重启prometheus即可 2.各个节点的普米配置1.修改prometheus.yml…

HiveSQL一本通 - 案例实操

文章目录 0.HiveSQL一本通使用说明6.综合案例练习之基础查询6.1 环境准备创建数据表数据准备加载数据 6.2 简单查询练习1.查询姓名中带“山”的学生名单2.查询姓“王”老师的个数3.检索课程编号为“04”且分数小于60的学生的分数信息&#xff0c;结果按分数降序排列4.查询数学成…

vue.js——学习计划表

1&#xff09;准备工作 ①打开D:\vue\chapter02\ learning_schedule 目录&#xff0c;找到 index.html 文件。 在文件中引 入BootStrap 样式文件&#xff0c;具体代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…

【Linux】权限管理

文章目录 前言1.权限访问者的分类2.文件类型与访问权限3.文件权限值的表达方式4.文件访问权限的相关设置5.file指令6.目录权限理解与漏洞7.粘滞位的理解 前言 Linux下有两种用户&#xff1a;超级用户(root)和普通用户 超级用户&#xff1a;可以再linux系统下做任何事情&#x…

Vue3 + Vite + TS + Element-Plus + Pinia项目(3)--新建路由

1、在src文件夹下新建router文件夹后&#xff0c;创建index.ts文件 2、具体如下 import { createRouter, createWebHashHistory } from vue-routerconst router createRouter({history: createWebHashHistory(),routes: [{path: "/index",component: () > impor…

关于YOLOv9项目中使用已有模块自由改进的教程

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 1. 文件说明 在YOLOv5-v9&#xff0c;模型的结构是以yaml文件的存储。我们可以在原有的yaml基础上增、减、改模块&#xff0c;创作我们自己的模型。 …