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

扫雷-C语言

一、前言:

        众所周知,扫雷是一款大众类的益智小游戏,它的游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

        今天,我们的目的就是通过C语言来实现一个简单扫雷游戏。

主要操作有:

1.初始化棋盘;

2.打印棋盘;

3.统计周围雷的个数;

4.排雷;

5.判断输赢;

        我这里是通过三个文件:源文件(Test.c)源文件(Game.c)头文件(Game.h)来实现的它们分别有各自的分工:

1.源文件-Test.c:主要用于调用定义的函数来实现扫雷操作。

2.源文件-Game.c:主要用于定义头文件-Game.h声明的函数。

3.头文件-Game.h:主要用于声明所需要的操作的函数。

二、头文件-Game.h:

2.1-目的:

        这里我们需要的操作是声明所需要的头文件,将所需要的操作声明成一个函数并在源文件-Game.c中定义所声明的函数。

2.2-代码:

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9
#define COL  9#define ROWS 11
#define COLS  11
#define COUNT 10//选单
void menu();		//扫雷游戏
//用于整理函数,实现扫雷所有操作
void game();//初始化棋盘
void InitBoard(char board[ROWS][COLS],int rows,int cols,char tem);//打印棋盘
void PrintBoard(char board[ROWS][COLS], int row, int col);//布置雷
void SetBoard(char board[ROWS][COLS], int row, int col);//排除雷
void FindBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//统计周围雷的个数
int get_mine_count(char mine[ROWS][COLS],int x,int y);		//判断是否获胜
int If_win(int win);

三、源文件-Game.c:

3.1-目的:

        将上述头文件-Game.h中所声明的操作函数通过自我实现给定义了。

3.2-操作函数的定义:

 3.2.1-选单:

目的:

        为了使函数操作在执行时更美观,更便于用户使用。

代码:
//设置选单
void menu()
{printf("*************************************\n");printf("**********      1.play      *********\n");printf("**********      0.exit      *********\n");printf("*************************************\n");
}
效果图: 

3.2.2-初始化棋盘:

目的:

        将定义的二维数组给初始化,便于用户在打印时观察以及后续的操作。

代码:
//初始化棋盘
void	InitBoard(char board[ROWS][COLS], int rows, int cols, char tem)
{for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){board[i][j] = tem;}}
}
 效果图: 

我们可以在初始化后打印来检查初始化是否成功。

3.2.3-打印棋盘:

目的: 

        打印扫雷棋盘,便于自我检查自我定义的函数,以及用户进行扫雷时的操作及观看。

代码:
//打印棋盘
void PrintBoard(char board[ROWS][COLS], int row, int col)
{printf("----------------扫雷------------------\n");for (int j = 0; j <= col; j++){printf(" %d ",j);}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");}printf("----------------扫雷------------------\n");
}
效果图:

 3.2.4-布置雷:

目的:

        在二维数组中随机生成雷,来便于后续的扫雷操作。

代码:
//在布雷数组中布置雷
void SetBoard(char board[ROWS][COLS], int row, int col)
{int count = COUNT;while (count){int x = rand() % col + 1;int y = rand() % row + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}
效果图:

 3.2.5-进行排雷:

目的:

        用户进行扫雷游戏。注意:这里需判断是否将没雷的位置全部点出,如果全部点出则需要提示用户获胜,并且如果用户输入的坐标已经排过一次雷了我们还需提示用户。

代码:
//在排雷数组中排雷
void FindBoard(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{int x, y;int win = 0;while (1){printf("请输入坐标:");scanf("%d %d", &x, &y);if (show[x][y] != '*'){printf("该坐标已被排查过!\n");continue;}if (mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");PrintBoard(mine, ROW, COL);			   //打印布雷数组break;}if (mine[x][y] == '0'){int num = get_mine_count(mine, x, y);show[x][y] = num + '0';win++;//判断是否获胜if (If_win(win)){printf("恭喜你赢了!\n");PrintBoard(show, ROW, COL);			   //打印排雷数组return;}PrintBoard(show, ROW, COL);			   //打印排雷数组}}
}
效果图: 

3.2.6-统计周围雷的个数:

目的:

        统计输入坐标格子周围8个位置中雷的总数,以便于用户进行排雷操作。

代码:
//统计周围雷的个数
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{int count = 0;if (mine[x - 1][y - 1] == '1'){count++;}if (mine[x - 1][y] == '1'){count++;}if (mine[x - 1][y + 1] == '1'){count++;}if (mine[x][y - 1] == '1'){count++;}if (mine[x][y + 1] == '1'){count++;}if (mine[x + 1][y - 1] == '1'){count++;}if (mine[x + 1][y] == '1'){count++;}if (mine[x + 1][y + 1] == '1'){count++;}return count;
}
效果图:
 

3.2.7-判断是否获胜:

目的:

       如果排除位置个数与总数-雷的个数相同则说明用户获胜,我们需要判断用户是否获胜并提示用户。

代码:
//判断是否获胜
int If_win(int win)
{if (win == (ROW * COL - COUNT)){return 1;}return 0;
}

四、源文件-Test.c:

4.1-目的:

        主要用于调用定义的函数通过分工来实现扫雷操作,并定义扫雷时所需要的两个数组。

4.2-思路:

        首先,我们需要知道扫雷需要通过两个二维数组来实现,一个用于布置雷,一个用于进行排雷游戏。接着,我们需要对定义的两个二维数组进行初始化,便于后继的操作以及用户的观察。在初始化后我们也可以通过自我定义的打印函数来检查初始化是否正确。然后,在完成上述操作后,我们需要对布雷数组进行随机布置雷。最后,我们进行排雷操作,从而实现扫雷游戏。

4.3-代码:

#define _CRT_SECURE_NO_WARNINGS 1#include "Game.h"void game()
{char mine[ROWS][COLS] = { 0 };			//布雷的二维数组char show[ROWS][COLS] = { 0 };			//排雷的二维数组InitBoard(mine, ROWS, COLS, '0');		//初始化布雷数组//PrintBoard(mine, ROW, COL);			   //打印布雷数组InitBoard(show, ROWS, COLS, '*');		初始化排雷数组PrintBoard(show, ROW, COL);			   //打印排雷数组SetBoard(mine, ROW, COL);			   //布置雷//PrintBoard(mine, ROW, COL);			   //打印布雷数组FindBoard(mine, show, ROW, COL);			   //排雷
}int main()
{srand((unsigned int)time(NULL));int intput=1;do{menu();printf("请选择选项:>");scanf("%d", &intput);switch (intput){case 1:{game();break;}case 0:{printf("退出游戏!");break;}default:{printf("选择错误,重新选择!");break;}}} while (intput);return 0;
}

五、结语:

        上述内容,即是我个人对扫雷游戏-C语言的个人见解以及自我实现。若有大佬发现哪里有问题可以私信或评论指教一下我这个小萌新。非常感谢各位uu们的点赞,关注,收藏,我会更加努力的学习编程语言,还望各位多多关照,让我们一起进步吧!

相关文章:

扫雷-C语言

一、前言&#xff1a; 众所周知&#xff0c;扫雷是一款大众类的益智小游戏&#xff0c;它的游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷&#xff0c;踩到一个雷即全盘皆输。 今天&#xff0c;我们的目的就是通过C语言来实现一个简…...

RockyLinux 9 PXE Server bios+uefi 自动化部署 RockLinux 8 9

pxe server 前言 PXE&#xff08;Preboot eXecution Environment&#xff0c;预启动执行环境&#xff09;是一种网络启动协议&#xff0c;允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器&#xff0c;它提供了启动镜像和引导加载程序&#xff0c;…...

接口测试基础

一、认识接口测试 接口测试 接口&#xff1a;系统之间数据交互的通道。 硬件接口 软件接口 接口测试&#xff1a;基于不同的输入参数&#xff0c;校验接口响应数据与预期数据是否一致。 为什么要学接口测试? 提前介入测试、尽早发现问题 中级测试工程师必备技能 接口测试学…...

为什么 from . import * 不会导入子模块

为什么 from . import * 不会导入子模块 在 Python 中&#xff0c;from . import * 并不会自动导入子模块。这是因为 import * 的行为是由模块的 __all__ 变量决定的。如果没有定义 __all__&#xff0c;它只会导入当前模块中定义的顶层变量和函数&#xff0c;而不会递归地导入…...

LangGPT结构化提示词编写实践

langGPT提示词 # Role: 浮点数比较助手 ## Profile - author: LangGPT - version: 1.0 - language: 中文 - description: 一个专门帮助用户进行浮点数比较的助手&#xff0c;确保LLM能够准确识别和对比浮点数。## Skills 1. 理解浮点数的结构和数值意义。 2. 精…...

React: class 和 style

一、class 1、在react中使用className属性来绑定类名 <div className"header flex-middle-middle">添加2个类名 </div>2、动态添加类名 <div className{item ${nameactive ? active : }}>动态添加active类名 </div>二、style 1、react中…...

【数据结构】包装类、初识泛型

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…...

TCP客户端connect断线重连

文章目录 TCP客户端connect断线重连1、为什么要断线重连2、实现代码 TCP客户端connect断线重连 1、为什么要断线重连 客户端会面临服务器崩溃的情况&#xff0c;我们可以试着写一个客户端重连的代码&#xff0c;模拟并理解一些客户端行为&#xff0c;比如游戏客户端等. 考虑到…...

细说MCU用DMA改变DAC输出信号频率和改善输出波形质量的方法

目录 一、参考硬件 二、修改定时器参数改变输出波形频率 三、改善波形质量 四、代码修改 五、查看结果 一、参考硬件 本项目的软件硬件工程参考作者的其他文章&#xff1a;细说MCU用DMA实现DAC输出的方法-CSDN博客 https://wenchm.blog.csdn.net/article/details/14065…...

Java高级面试题

文章目录 Java高级特性Java 8 中的新特性有哪些&#xff1f;Lambda 表达式的用途是什么&#xff1f;Stream API 的工作原理是什么&#xff1f;Optional 类的作用是什么&#xff1f;什么是函数式接口&#xff1f;Java 9 之后的新特性有哪些&#xff1f; 并发编程Java中的线程池是…...

USART串口理论知识总结

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 USART串口理论知识总结 1、通讯的串行和并行1.串口采用发送数据代码并用printf重代码 1、通讯的串行和并行 1.串口采用发送数据代码并用printf重代码 #include <stdint.h…...

基于 HTML+ECharts 实现智慧景区数据可视化大屏(含源码)

构建智慧景区数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 随着旅游业的蓬勃发展&#xff0c;智慧景区的概念逐渐深入人心。通过数据可视化&#xff0c;景区管理者可以实时监控游客流量、设施使用情况以及环境状况&#xff0c;从而提升游客体验和管理效率。本文将详…...

vxe-table——实现切换页码时排序状态的回显问题(ant-design+elementUi中table排序不同时回显的bug)——js技能提升

之前写的后台管理系统&#xff0c;都是用的antdelement&#xff0c;table组件中的【排序】问题是有一定的缺陷的。 想要实现的效果&#xff1a; antv——table组件一次只支持一个参数的排序 如下图&#xff1a; 就算是可以自行将排序字段拼接到列表接口的入参中&#xff0c…...

SQL

SQL全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一标准 。 SQL通用语法 SQL语句可以单行或多行书写&#xff0c;以分号结尾。SQL语句可以使用空格/缩进来增强语句的可读性。MySQL数据库的…...

maven archetype

1.简介 maven脚手架是为了创建一个项目模板&#xff0c;以后新建项目都能够复用该模板 maven中模板引擎使用的是velocity,在文件中可以使用它的语法获取变量等操作 2.实现 单模块脚手架实现 pom.xml <?xml version"1.0" encoding"UTF-8"?> &…...

浏览器打开抽奖系统html

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>在线抽奖 随机选取 自动挑选</title> <script src"https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script> <style> body {…...

微信小程序-使用Component方法代替Page方法构造页面

一.使用Component方法的前提条件 在小程序js文件里使用Component方法代替Page方法需要在json文件里面定义usingComponents属性 {"usingComponents": {} }二.注意事项 1.在page页面里使用的钩子函数和事件监听方法都需要写在methods对象里面 methods:{update(){thi…...

Spark SQL----DISTRIBUTE BY子句

Spark SQL----DISTRIBUTE BY子句 一、描述二、语法三、参数四、例子 一、描述 DISTRIBUTE BY子句用于根据输入表达式对数据进行重新分区。与CLUSTER BY子句不同&#xff0c;这不会对每个分区内的数据进行排序。 二、语法 DISTRIBUTE BY { expression [ , ... ] }三、参数 e…...

HTML5-canvas1

1、canvas&#xff1a;创建画布 <canvas id"canvas"></canvas>2、画一条直线 var canvasdocument.getElementById(cancas&#xff09;; canvas.width800; canvas.height800; var contextcanvas.getContext(2d); //获得2d绘图上下文环境 //画一条直线 c…...

【NOI-题解】1009 - 数组逆序1162 - 数组元素的删除1211 - 数组元素的插入1161. 元素插入有序数组1159. 数组元素的移动

文章目录 一、前言二、问题问题&#xff1a;1009 - 数组逆序问题&#xff1a;1162 - 数组元素的删除问题&#xff1a;1211 - 数组元素的插入问题&#xff1a;1161. 元素插入有序数组问题&#xff1a;1159. 数组元素的移动 三、感谢 一、前言 本章节主要对数组问题中数组元素移…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...