扫雷-C语言

news2024/11/14 21:37:01

一、前言:

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

        今天,我们的目的就是通过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.coloradmin.cn/o/1946016.html

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

相关文章

Open函数使用 Json与pickle Os模块

一. 文件操作与 open() 函数 Open函数是Python中用于打开文件的内置函数&#xff0c;其基本语法如下&#xff1a; open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone) 各参数说明&#xff1a; file&#xff1a; 要打开的文件…

34_YOLOv5网络详解

1.1 简介 YOLOV5是YOLO&#xff08;You Only Look Once&#xff09;系列目标检测模型的一个重要版本&#xff0c;由 Ultralytics 公司的Glenn Jocher开发并维护。YOLO系列以其快速、准确的目标检测能力而闻名&#xff0c;尤其适合实时应用。YOLOV5在保持高效的同时&#xff0c…

El-Table 表格的表头字段切换

最近写了一个小功能&#xff0c;比较有意思&#xff0c;特此博客记录。 提出需求&#xff1a;需要表头字段变化&#xff0c;但是我在官网上的表格相关上查找&#xff0c;没有发现便捷方法。 于是我有两个想法&#xff1a;1.做三个不同的表格。2.做一个表格使用不同的表头字段。…

2024.7.24 远程连接到另一设备(win)上的vrep时无响应(防火墙!)

Windows防火墙禁止了软件的端口的通信&#xff0c;打开即可 如何设置Windows 7 防火墙端口规则

字典集合案例

1.统计字符 统计字符串中每个字符出现的次数 s l like summer very much #去掉空格 s s.replace(" ","") d dict() for i in s:if i in d:d[i] 1else:d[i] 1 for i in d:print(i,d[i]) 2.求不重复的随机数 #导入随机数 import random a int(input(&q…

VMware 上安装 CentOS 7 教程 (包含网络设置)

**建议先看一些我安装VMware的教程&#xff0c;有些网络配置需要做一下 1.打开VMware&#xff0c;创建虚拟机 2.勾选自定义&#xff0c;点击下一步 3.点击下一步 4.勾选“稍后安装操作系统”&#xff0c;点击下一步 5.勾选linux&#xff0c;勾选centos7&#xff0c;点击下一步…

每日Attention学习12——Exterior Contextual-Relation Module

模块出处 [ISBI 22] [link] [code] Duplex Contextual Relation Network for Polyp Segmentation 模块名称 Exterior Contextual-Relation Module (ECRM) 模块作用 内存型特征增强模块 模块结构 模块思想 原文表述&#xff1a;在临床环境中&#xff0c;不同样本之间存在息肉…

Python算法基础:解锁冒泡排序与选择排序的奥秘

在数据处理和算法设计中&#xff0c;排序是一项基础且重要的操作。本文将介绍两种经典的排序算法&#xff1a;冒泡排序&#xff08;Bubble Sort&#xff09;和选择排序&#xff08;Selection Sort&#xff09;。我们将通过示例代码来演示这两种算法如何对列表进行升序排列。 一…

BGP选路之Local Preference

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时&#xff0c;BGP协议会对这些BGP路由的属性进行比较&#xff0c;以确定去往该目标网络的最优BGP路由。BGP首先比较的是路由信息的首选值&#xff08;PrefVal)&#xff0c;如果 PrefVal相同&#xff0c;就会比较本…

python-NLP:2词性标注与命名实体识别

文章目录 词性标注命名实体识别时间命名实体&#xff08;规则方法&#xff09;CRF 命名实体识别方法 词性标注 词性是词汇基本的语法属性&#xff0c;通常也称为词类。词性标注是在给定句子中判定每个词的语法范畴&#xff0c;确定其词性并加以标注的过程。例如&#xff0c;表示…

爱回收严选买的二手iPad Air 4已经使用一周啦!

有多少人是跟我一样&#xff0c;手里一旦有点小钱就留不住&#xff0c;只想花出去的&#xff1f; 本24届应届生目前刚开始实习工作&#xff0c;虽然工资低的可怜&#xff0c;但是比起大学时期还是宽裕了不少。 于是发完工资的我就非常想消费&#xff01;而我最近最想要的就是…

Fedora40安装telnet-server启用telnet服务

Fedora40安装telnet-server启用telnet服务 安装 telnet-server sudo yum install telnet-server或 sudo dnf install telnet-server启用服务 fedora40 或 CentosStream9 不能用 yum或dnf安装xinetd, telnet-server 的服务名为: telnet.socket 启用 telnet.socket.service …

Kithara和Halcon (二)

Kithara使用Halcon QT 进行二维码实时识别 目录 Kithara使用Halcon QT 进行二维码实时识别Halcon 简介以及二维码检测的简要说明Halcon 简介Halcon的二维码检测功能 Qt应用框架简介项目说明关键代码抖动测试测试平台&#xff1a;测试结果&#xff1a; 开源源码 Halcon 简介以…

C++与C中,由函数形参test(int *a)引出的问题

文章参考来源&#xff1a; 1.c函数中形参为引用的情况&#xff1b;C中a和&a的区别 描述&#xff1a; 最近在看循环单链表时&#xff0c;看到有篇文章中&#xff0c;链表初始化函数为图下&#xff0c;我在想&#xff0c;这个函数形参(类似 "int * & a"一样)到…

数据结构(二叉树-1)

文章目录 一、树 1.1 树的概念与结构 1.2 树的相关术语 1.3 树的表示 二、二叉树 2.1 二叉树的概念与结构 2.2特殊的二叉树 满二叉树 完全二叉树 2.3 二叉树的存储结构 三、实现顺序结构二叉树 3.1 堆的概念与结构 3.2 堆的实现 Heap.h Heap.c 默认初始化堆 堆的销毁 堆的插入 …

关于使用宝兰德bes中间件进行windows部署遇到的问题——license不存在

报错信息 日志文件中是这么报错的 遇到的具体情况&#xff1a; 实例按照**的文档手册正常步骤下去节点部署的时候没有报错&#xff0c;成功启动&#xff0c;但是日志里会有报错信息&#xff0c;也是license不存在实例创建的时候失败了&#xff0c;报错信息如下所示 解决方法…

Gitops-Argo-Cli安装与使用

一、安装Argo-Cli工具 Release v2.9.21 argoproj/argo-cd GitHub **选择合适的符合你操作系统以及CPU架构的二进制文件 #依v2.9.21-X86-64-Linux操作系统为例 wget https://github.com/argoproj/argo-cd/releases/download/v2.9.21/argocd-linux-amd64 #添加执行权限并且移…

昇思25天学习打卡营第19天|生成式-DCGAN生成漫画头像

打卡 目录 打卡 GAN基础原理 DCGAN原理 案例说明 数据集操作 数据准备 数据处理和增强 部分训练数据的展示 构造网络 生成器 生成器代码 ​编辑 判别器 判别器代码 模型训练 训练代码 结果展示&#xff08;3 epoch&#xff09; 模型推理 GAN基础原理 原理介…

AV1技术学习:Loop Restoration Filter

环路恢复滤波器&#xff08;restoration filter&#xff09;适用于64 64、128 128 或 256 256 像素块单元&#xff0c;称为 loop restoration units (LRUs)。每个单元可以独立选择是否跳过滤波、使用维纳滤波器&#xff08;Wiener filter&#xff09;或使用自导滤波器&#…

AM62x和rk3568的异同点

AM62x 和 RK3568 是两款不同的处理器&#xff0c;分别来自 Texas Instruments&#xff08;TI&#xff09;和 Rockchip。它们在设计目标、架构、性能和应用领域等方面存在一些异同。以下是这两款处理器的对比&#xff1a; 1. 基本架构 AM62x&#xff1a; 架构&#xff1a;基于…