扫雷-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们的点赞,关注,收藏,我会更加努力的学习编程语言,还望各位多多关照,让我们一起进步吧!

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

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

相关文章

SparkSql oom原因以及参数调优+数据倾斜解决方案

1、Spark历史版本对比 spark1 vs spark2 vs spark3 1、spark1引入内存计算的理念&#xff0c;解决中间结果落盘导致的效率低下。在理想状况下性能可达到MR的100倍。虽然提高了一定的计算效率&#xff0c;但也带来了大量的内存管理问题&#xff0c;典型的如内存oom问题频发。…

javaEE-02-servlet

文章目录 Servlet 技术servlet程序示例通过实现Servlet接口实现Servlet程序通过继承 HttpServlet 实现 Servlet 程序 Servlet的声明周期 ServletConfig 类ServletContext 类HttpServletRequest 类请求的转发 HttpServletResponse 类请求重定向 HTTP 协议GET 请求Post请求常用请…

LINUX -exec函数族

1、功能&#xff1a; *让父子进程来执行不相干的操作 *能够替换进程地址空间的代码.text段 *执行另外的程序&#xff0c;不需要创建额外的的地址空间 *当前程序中调用另外一个应用程序 2、执行目录下的程序&#xff1a; *指定执行目录下的程序 int execl(const char *path,…

网工最常用的10个网络命令,但凡有一个不会用都不算资深网工。

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 当网工&#xff0c;日常工作不仅需要面对各种各样的网络设备和配置&#xff0c;还需要处理不断出现的网络故障…

SpringBoot集成Sharding-JDBC实现分库分表

本文已收录于专栏 《中间件合集》 目录 版本介绍背景介绍拆分方式集成并测试1.引入依赖2.创建库和表3.pom文件配置3.编写测试类Entity层Mapper接口MapperXML文件测试类 4.运行结果 自定义分片规则定义分片类编写pom文件 总结提升 版本介绍 SpringBoot的版本是&#xff1a; 2.3.…

使用DataGrip连接DM达梦数据库(手动添加达梦数据库驱动)

文章目录 一、准备达梦数据库驱动从官网下载驱动下载后&#xff0c;解压&#xff0c;本次选择&#xff0c;DmJdbcDriver18安装&#xff1a; 二、配置达梦驱动打开DataGrip&#xff0c;点击左上角的"Database Explorer"下的加号按钮&#xff0c;选择"Driver"…

秋招复习笔记——八股文部分:网络TCP

TCP 三次握手和四次挥手 TCP 基本认识 序列号&#xff1a;在建立连接时由计算机生成的随机数作为其初始值&#xff0c;通过 SYN 包传给接收端主机&#xff0c;每发送一次数据&#xff0c;就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号&#xf…

数据隐私保护与区块链技术的结合:新兴趋势分析

在当今数字化时代&#xff0c;数据隐私保护成为了一个备受关注的重要话题。随着个人数据的不断生成和流通&#xff0c;如何有效保护用户的隐私成为了技术创新的一个重要方向。区块链技术作为一种去中心化、安全性高且可追溯的技术手段&#xff0c;正在逐渐成为解决数据隐私保护…

aiohttp 的使用

基本介绍 aiohttp 是一个基于 asyncio 的异步 HTTP 网络模块&#xff0c; 它即提供了服务端&#xff0c; 又提供了客户端。其中&#xff0c;我们用服务端可以搭建一个支持异步处理的服务器&#xff0c;这个服务器就是用来处理请求并返回响应的&#xff0c;类似于 Django , Fla…

Ansible的脚本-----playbook剧本【下】

目录 实战演练六&#xff1a;tags 模块 实战演练七&#xff1a;Templates 模块 实战演练六&#xff1a;tags 模块 可以在一个playbook中为某个或某些任务定义“标签”&#xff0c;在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。 playboo…

一个注解解决重复提交问题

一、前言 ​ 在应用系统中提交是一个极为常见的功能&#xff0c;倘若不加管控&#xff0c;极易由于用户的误操作或网络延迟致使同一请求被发送多次&#xff0c;从而生成重复的数据记录。针对用户的误操作&#xff0c;前端通常会实现按钮的 loading 状态&#xff0c;以阻…

行业不同怎么选企业管理咨询公司

在选择企业管理咨询公司时&#xff0c;不同行业的企业往往面临着各自独特的挑战和需求。因此&#xff0c;选择一家适合自身行业特点、能够提供专业且有针对性的咨询服务的管理咨询公司至关重要。本文将从行业差异的角度出发&#xff0c;探讨如何根据企业所在行业的不同&#xf…

SQL-REGEX-常见正则表达式的使用

SQL-REGEX-常见正则表达式的使用 在SQL中&#xff0c;正则表达式&#xff08;Regex&#xff09;的使用可以帮助进行更灵活和精确的模式匹配和数据筛选。不同的数据库管理系统对于正则表达式的支持略有差异&#xff0c;但大体都是相似的。 Tips&#xff1a; 模式描述匹配内容…

【python】PyQt5中QCommandLinkButton的详细教程与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【Linux】socket 套接字 / 序列化与反序列化

目录 一. TCP 网络程序简易计算器1. 核心功能2. 程序结构3. 服务器初始化4. 服务器启动5. 业务处理6. 客户端初始化7. 客户端启动 二. 序列化与反序列化1. 协议2. 序列化与反序列化 一. TCP 网络程序 简易计算器 1. 核心功能 客户端向服务器发送数据, 服务器进行计算并返回结…

墨烯的C语言技术栈-C语言基础-018

char c; //1byte字节 8bit比特位 int main() { int a 10; //向内存申请四个字节,存储10 &a; //取地址操作符 return 0; } 每个字节都有地址 而a的地址就是它第一个字节的地址 要先开始调试才可以查看监控和查看内存 左边是地址 中间是内存中的数据 最后面的是…

Jenkins - apt 安装软件包 404 Not Found

Jenkins - apt 安装软件包 404 Not Found 引言关于 apt解决 apt 安装软件包 404 问题问题分析解决方案 引言 日常 Jenkins job 运行&#xff0c;有段时间会遇到 apt 安装软件包 404 的情况&#xff0c;这种情况不是每次都发生的&#xff0c;但是会导致 Jenkins 失败&#xff0…

【HTML — 构建网络】HTML 入门

在本文中,我们将介绍 HTML 的绝对基础知识。为了帮助您入门,本文定义了元素、属性以及您可能听说过的所有其他重要术语。它还解释了这些在 HTML 中的位置。您将学习 HTML 元素的结构、典型的 HTML 页面的结构以及其他重要的基本语言功能。在此过程中,也将有机会玩转 HTML! …

上传项目到GitHub

上传项目到GitHub 前期工作&#xff1a;创建GitHub仓库 1.使用git命令初始化文件夹 git init2.将文件夹里面所有的文件添加到本地仓库&#xff0c;如果想添加单个文件&#xff0c;将.换成文件名就好。 git add .3.给文件备注&#xff0c;双引号里面是文件备注的内容 git c…

大揭秘:百度云提供支持的智能审核机制是什么?

在论坛、社媒等公共空间里&#xff0c;用户不仅能自主上传信息&#xff0c;还可以通过评论、群聊等方式进行互动。 如果不对信息进行审核&#xff0c;平台可能会涌现大量包含暴力、仇恨、淫秽或其他不当内容的帖子。用人工方式一条条审核信息&#xff0c;不仅成本高、效率低、…