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

【C语言】扫雷 小游戏

文章目录

  • 一、游戏规则
  • 二、 代码逻辑
  • 三、游戏实现
    • 1. 游戏菜单设计
    • 2.设计雷区并随机布置雷
      • (1) 设置雷区
      • (2) 布置雷
    • 3.排查雷
  • 四、源码

一、游戏规则

1. 在9*9的小格子中,任意选取一个坐标(格子),选择后发现,如果没点中雷的坐标,会显示数字(表示周围有几个雷),如果点中雷,游戏结束

排查雷

  • 如果这个位置不是雷,就计算这个位置的周围8个坐标有几个雷,并显示雷的个数
  • 如果是 雷 ,就炸死了,游戏结束
  • 如果把雷都找出来了,胜利,游戏结束
  • 链 接:网页版扫雷

扫雷01

2.选择后如图

扫雷02

3.点中雷的情况

扫雷03

二、 代码逻辑

  1. 游戏菜单设计
  2. 设计雷区并随机布置雷
  3. 排查雷

三、游戏实现

1. 游戏菜单设计

//test.c
#include "game.h"
void game() 
{printf("扫雷\n");
}
void menu() 
{printf("************************\n");printf("******    扫雷   *******\n");printf("******  1. play  *******\n");printf("******  0. exit  *******\n");printf("************************\n");
}
int main() 
{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);return 0;
}

menu

2.设计雷区并随机布置雷

(1) 设置雷区

设置一个9*9的二维数组,0表示没有雷,1表示雷

04

但是为了避免显示给玩家看的数字 1(雷的个数)与设置雷的 1 重合,所以选用 * 进行埋雷

因为扫雷 是扫周围的8个区域,会遇到扫越界问题

05
故变成11*11的二维数组
在这里插入图片描述
设置棋盘

//test.c 中的 game()
void game() 
{char mine[ROWS][COLS] = {0};//放置雷的数组char show[ROWS][COLS] = {0};//显示的数组InitBoard(mine,ROWS,COLS,'0');DisplayBoard(mine, ROW, COL);InitBoard(show,ROWS,COLS,'*');DisplayBoard(show, ROW, COL);}
//game.c
#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set) 
{int i = 0;int j = 0;for (i = 0; i < rows;i++){for (j = 0; j < cols;j++){board[i][j] = set;}}
}void DisplayBoard(char board[ROWS][COLS], int row, int col) 
{int i = 0;int j = 0;printf("--------扫雷---------\n");for (i = 0; i <= col;i++) {printf("%d ",i);//打印列标}printf("\n");for (i = 1; i <= row; i++) {printf("%d ",i);//打印行标for (j = 1; j <= col;j++){printf("%c ",board[i][j]);}printf("\n");}printf("--------扫雷---------\n");}
//game.h
#include <stdio.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);

在这里插入图片描述

(2) 布置雷

在这里随机生成雷
字符0表示不是雷。字符1表示是雷

//game.c
void SetMine(char mine[ROWS][COLS], int row, int col) 
{int count = Easy_count;while (count) {int x = rand() % row + 1;//生成坐标1-9int y = rand() % col + 1;if (mine[x][y] =='0')	//避免在同一个地方布置雷{mine[x][y] = '1';count--;}		}
}

06

3.排查雷

输入排查雷的坐标,如果是雷则GAME OVER !,则如果不是雷,则显示该坐标周围有多少个雷

//game.c
//排查雷
int GetCountMine(char mine[ROWS][COLS],int x,int y) 
{return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +mine[x][y - 1]+ mine[x][y + 1] +mine[x + 1][y - 1] +mine[x + 1][y] + mine[x + 1][y + 1]) - (8 * '0');
}
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 (mine[x][y] =='1') {printf("GAME OVER!!!,被炸死了\n");DisplayBoard(mine,ROW,COL);break;}else {//不是雷,统计周围有多少雷int c = GetCountMine(mine,x,y);show[x][y] = c + '0';DisplayBoard(show,ROW,COL);win++;}}else {printf("坐标输入错误,重新输入\n");}}if (win == ((row * col)- Easy_count)) //需要排的区域数{printf("恭喜您,排雷成功!\n");}
}

排雷的周围坐标

x-1, y - 1x-1,yx-1,y+1
x, y - 1x,yx,y+1
x+1,y-1x+1,yx+1,y+1

排完的情况(这里设置80个雷(用于测试排雷成功),所以只有一个安全)
07

排到雷,游戏结束
在这里插入图片描述

四、源码

game.h

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2#define Easy_count 10//初始化
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
//显示
void DisplayBoard(char board[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);

test.c

#include "game.h"
void game() 
{char mine[ROWS][COLS] = {0};//放置雷的数组char show[ROWS][COLS] = {0};//显示的数组InitBoard(mine,ROWS,COLS,'0');InitBoard(show,ROWS,COLS,'*');	DisplayBoard(show, ROW, COL);//布置雷SetMine(mine,ROW,COL);//排查雷FindMine(mine,show,ROW,COL);}
void menu() 
{printf("************************\n");printf("******    扫雷   *******\n");printf("******  1. play  *******\n");printf("******  0. exit  *******\n");printf("************************\n");
}
int main() 
{int input = 0;srand((unsigned int )time(NULL));//设置随机数种子do {menu();printf("请选择>:");scanf("%d",&input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;		}} while (input);return 0;
}

game.c


#include "game.h"
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set) 
{int i = 0;int j = 0;for (i = 0; i < rows;i++){for (j = 0; j < cols;j++){board[i][j] = set;}}
}
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col) 
{int i = 0;int j = 0;printf("--------扫雷---------\n");for (i = 0; i <= col;i++) {printf("%d ",i);}printf("\n");for (i = 1; i <= row; i++) {printf("%d ",i);for (j = 1; j <= col;j++){printf("%c ",board[i][j]);}printf("\n");}printf("--------扫雷---------\n");}
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col) 
{int count = Easy_count;while (count) {int x = rand() % row + 1;//生成坐标1-9int y = rand() % col + 1;if (mine[x][y] =='0')	//避免在同一个地方布置雷{mine[x][y] = '1';count--;}}
}
//排查雷
int GetCountMine(char mine[ROWS][COLS],int x,int y) 
{return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +mine[x][y - 1]+ mine[x][y + 1] +mine[x + 1][y - 1] +mine[x + 1][y] + mine[x + 1][y + 1]) - (8 * '0');
}
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 (mine[x][y] =='1') {printf("GAME OVER!!!,被炸死了\n");DisplayBoard(mine,ROW,COL);break;}else {//不是雷,统计周围有多少雷int c = GetCountMine(mine,x,y);show[x][y] = c + '0';DisplayBoard(show,ROW,COL);win++;}}else {printf("坐标输入错误,重新输入\n");}}if (win == ((row * col)- Easy_count)) //需要排的区域数{printf("恭喜您,排雷成功!\n");}
}

相关文章:

【C语言】扫雷 小游戏

文章目录 一、游戏规则二、 代码逻辑三、游戏实现1. 游戏菜单设计2.设计雷区并随机布置雷(1) 设置雷区(2) 布置雷 3.排查雷 四、源码 一、游戏规则 1. 在9*9的小格子中&#xff0c;任意选取一个坐标&#xff08;格子&#xff09;&#xff0c;选择后发现&#xff0c;如果没点中雷…...

Jmeter(六) - 从入门到精通 - 建立数据库测试计划(详解教程)

1.简介 在实际工作中&#xff0c;我们经常会听到数据库的性能和稳定性等等&#xff0c;这些有时候也需要测试工程师去评估和测试&#xff0c;因此这篇文章主要介绍了jmeter连接和创建数据库测试计划的过程,在文中通过示例和代码非常详细地介绍给大家&#xff0c;希望对各位小伙…...

swagger 3.0 学习笔记

引入pom <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>配置 import io.swagger.models.auth.In; import io.swagger.v3.oas.annotati…...

07 |「异步任务」

前言 实践是最好的学习方式&#xff0c;技术也如此。 文章目录 前言一、进程与线程1、进程2、线程 二、实现 一、进程与线程 1、进程 进程(Process)是操作系统分配资源的基本单位,它是一个执行中的程序实例&#xff1b;每个进程都有自己独立的内存空间,不同进程的内存是相互独…...

LoRaWan网关设计之入门指南

快速开始 以下是在目标平台本身上构建和运行 LoRaWan网关 的三步快速入门指南。 第 1 步:克隆 网关源码库 git clone https://github.com/lorabasics/basicstation.git...

互联网电影购票选座后台管理系统源码开发

搭建一个互联网电影购票选座后台管理系统需要进行以下步骤&#xff1a; 1. 需求分析&#xff1a;首先要明确系统的功能和需求&#xff0c;包括电影列表管理、场次管理、座位管理、订单管理等。 2. 技术选型&#xff1a;选择适合的技术栈进行开发&#xff0c;包括后端开发语言…...

[ K8S ] yaml文件讲解

目录 查看 api 资源版本标签写一个yaml文件demo创建资源对象查看创建的pod资源创建service服务对外提供访问并测试//创建资源对象查看创建的service写yaml太累怎么办&#xff1f; Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式&#xff1a;主要用于 api 接口之间消…...

【《深入浅出计算机网络》学习笔记】第1章 概述

内容来自b站湖科大教书匠《深入浅出计算机网络》视频和《深入浅出计算机网络》书籍 目录 1.1 信息时代的计算机网络 1.1.1 计算机网络的各类应用 1.1.2 计算机网络带来的负面问题 1.2 因特网概述 1.2.1 网络、互联网与因特网的区别与关系 1.2.1.1 网络 1.2.1.2 互联网 …...

二、Linux中权限、shell命令及运行原理

shell命令及运行原理 我们使用Linux时&#xff0c;并不是直接访问操作系统&#xff0c;为什么不是直接访问操作系统呢&#xff1f; 如果用户直接访问操作系统&#xff0c;不仅使用难度大&#xff0c;而且不安全&#xff0c;容易把系统文件损坏。 那么我们通常是如何访问操作系统…...

【RabbitMQ上手——单实例安装5种简单模式实现通讯过程】

【RabbitMQ入门-单实例安装&5种简单模式实现通讯过程】 一、环境说明二、安装RabbitMQ三、用户权限及Virtual Host设置四、5种简单模式实现通讯过程的实现五、小结 一、环境说明 安装环境&#xff1a;虚拟机VMWare Centos7.6 Maven3.6.3 JDK1.8RabbitMQ版本&#xff1a;…...

python+pytest接口自动化之HTTP协议基础

HTTP协议简介 HTTP 即 HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09;&#xff0c;是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。 设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。HTTP 协议在 OSI 模型…...

【技巧】如何保护PowerPoint不被改动?

PPT&#xff0c;也就是PowerPoint&#xff0c;是很多小伙伴在工作生活中经常用到的图形演示文稿软件。 做好PPT后&#xff0c;担心自己不小心改动了或者不想他人随意更改&#xff0c;我们可以如何保护PPT呢&#xff1f;下面小编就来分享两个常用的方法&#xff1a; 1. 将PPT改…...

【APITable】教程:创建并运行一个自建小程序

1.进入APITable&#xff0c;在想要创建小程序的看板页面点击右上角的【小程序】&#xff0c;进入小程序编辑页面。 2.创建一个新的小程序区。 点击【 添加小程序】 点击创建小程序&#xff0c;选择模板&#xff0c;输入名字。 3.确定后进入小程序部署引导页面。 4.打开Xshell 7…...

使用MyBatis操作数据库

hi,大家好,今天为大家带来MyBatis操作数据库的知识 文章目录 &#x1f437;1.根据MyBatis操作数据库&#x1f9ca;1.1查询操作&#x1f347;1.1.1无参查询&#x1f347;1.1.2有参查询 &#x1f9ca;1.2删除操作&#x1f9ca;1.3修改操作&#x1f9ca;1.4增加操作&#x1f9ca;…...

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--功能实现[五]

文章目录 SSM--功能实现实现功能09-带条件查询分页显示列表需求分析/图解思路分析代码实现测试分页条件查询带条件分页查询显示效果 实现功能10-添加家居表单前端校验需求分析/图解思路分析代码实现完成测试测试页面效果 实现功能11-添加家居表单后端校验需求分析/图解思路分析…...

Qt应用程序窗体最大化失效问题的解决方法

记录一个在Qt开发过程中遇到的问题&#xff1a; 【问题描述】在showEvent中调用showMaximized()&#xff0c;应用程序窗体仍然无法最大化。 【定位分析】在Qt应用程序中&#xff0c;如果窗体最大化失效&#xff0c;可能是因为在窗体的showEvent事件中使用了showMaximized()方…...

python怎么判断变量的数据类型

在编程的世界里&#xff0c;了解各种数据类型是非常重要的。在Python中&#xff0c;有着丰富的数据类型用于存储和处理不同类型的数据。掌握这些数据类型的定义和作用&#xff0c;我们能够更好地在程序中管理和操作数据&#xff0c;提高代码的效率和可读性。 Python中常见的数据…...

FastAPI 构建 API 高性能的 web 框架(二)

上一篇 FastAPI 构建 API 高性能的 web 框架&#xff08;一&#xff09;是把LLM模型使用Fastapi的一些例子&#xff0c;本篇简单来看一下FastAPI的一些细节。 有中文官方文档&#xff1a;fastapi中文文档 假如你想将应用程序部署到生产环境&#xff0c;你可能要执行以下操作&a…...

如何实现 Java SpringBoot 自动验证入参数据的有效性

Java SpringBoot 通过javax.validation.constraints下的注解&#xff0c;实现入参数据自动验证 如果碰到 NotEmpty 否则不生效&#xff0c;注意看下 RequestBody 前面是否加上了Valid Validation常用注解汇总 Constraint详细信息Null被注释的元素必须为 nullNotNull被注释的元…...

golang学习随记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 go学习快捷键及快速生成代码片段go基础循环流程控制关键字切片&#xff0c;拷贝函数闭包 defer语句格式化输出go语言随机数rand.seed() 包管理并发编程goroutinecha…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...