C语言:简单的扫雷游戏

news2024/10/7 13:24:32

       扫雷游戏想必大家都玩过,像一些大佬呀,十几秒能通关,给大佬点赞,那咱们也设计一个扫雷游戏,具体怎么实现呢,跟上我的脚步,看看用C语言怎么实现简单的扫雷游戏。

80843dfeb63b46d9939227cd60408c82.webp

 

 一:扫雷游戏的框架

b18f86d60d084fe9bcc0968fa48edb75.png

二:test.c的实现

①:写出主函数。

主函数主要是能循环,继续玩,并且能包括扫雷所有功能。

792ef95f917b43c4b6b82f3244e28555.png

②: 其次game()函数的实现。(实现玩游戏)

//1.初始化棋盘
void InitBord(char board[ROWS][COLS], int row, int col, char set);

//2.打印棋盘
void DisPlayBoard(char board[ROWS][COLS], int row, int col);

//3.布置雷
void SetMine(char board[ROWS][COLS], int row, int col);

//4.排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

void game()
{
	char mine[ROWS][COLS] = { '0' };//存放布好的雷
	char show[ROWS][COLS] = { '*' };//存放排查出雷的信息
	
	//初始化棋盘
	InitBord(mine, ROWS, COLS, '0');//存放布好的雷
	InitBord(show, ROWS, COLS, '*');//存放排查出雷的信息
	
	//打印棋盘
	printf("雷的布置为\n");
	DisPlayBoard(mine, ROW, COL);//存放布好的雷
	printf("排查出雷的信息\n");
	DisPlayBoard(show, ROW, COL);//存放排查出雷的信息

	//布置雷
	SetMine(mine, ROW, COL);
	DisPlayBoard(mine, ROW, COL);//存放布好的雷

	//排查雷
	FindMine(mine, show,ROW,COL);
}

细节注意:雷的排布是不用打印出来的,这里只是演示,其中ROWS是列=11,COLS是行=11

ROW是列=9,COL是行=9,那为什么要这样初始化呢?

71ad87c774cf4cab8a56f6fabeb0129b.png

 三:game.c的实现

①:打印菜单

//打印菜单
void menu()
{
	printf("*****************************\n");
	printf("*******     1.play     ******\n");
	printf("*******     0.exit     ******\n");
	printf("*****************************\n");
}

②:初始化棋盘

细节说明:要初始化成11×11的格子。
    InitBord(mine, ROWS, COLS, '0');存放布好的雷
    InitBord(show, ROWS, COLS, '*');存放排查出雷的信息

//初始化棋盘
void InitBord(char board[ROWS][COLS], int row, int col, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = set;
		}
	}
	打印(测试)
	//for (i = 0; i < row; i++)
	//{
	//	for (j = 0; j < col; j++)
	//	{
	//		printf("%c",board[i][j]);

	//	}
	//	printf("\n");
	//}
}

③:打印棋盘

细节说明:可以先打印初始化雷的布局和棋盘布局。

为能更好看些,加上了一些行列的输出。

2c8d1858d97f4c0fa7615abe29cf6f76.png

//打印棋盘
void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 1;
	int j = 1;
	printf("-----扫雷 游戏-----\n");
	for (i = 0; i <= row; 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");
	}
}

④:布置雷。

细节说明:

定义了一个#define Thunder 10 使雷的个数为10,

#include<stdlib.h>  #include<time.h>  采用两个函数,能产生随机数。

在主函数中要写上srand((unsigned int)time(NULL));(这里不再细讲了,可以看看博主C语言猜字游戏,里面有讲述)

//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
	int thunder = Thunder;
	int count = 1;
	while (count <= thunder)
	{
		int x = rand() % row + 1; //范围 1~9
		int y = rand() % row + 1; //范围 1~9
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count++;
		}
	}
}

⑤:排查雷(重点)

细节注意:

0a9a5aa5ad7948ce94c0fc04498c2408.png

 faef598522fb470ba0f2a459ed61c6b3.png

 

//排查雷
//计算周围雷的个数
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	return (mine[x][y + 1] + mine[x][y - 1] +
			mine[x - 1][y] + mine[x + 1][y] +
			mine[x - 1][y + 1] + mine[x + 1][y + 1] +
			mine[x - 1][y - 1] + mine[x + 1][y - 1] -
			8 * '0');
}

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 1;
	int y = 1;
	int win_count = 0;
	while (win_count <= row*col - Thunder)
	{
		printf("请玩家输入坐标:");
		scanf("%d %d", &x, &y);

		//判断玩家输入的坐标是否正确
		if ((x < 1 && x > 9) && (y < 1 && y > 9))
		{
			printf("输入的坐标有误,请重新输入:");
			scanf("%d %d", &x, &y);
		}

		//判断玩家是否踩到雷
		if (mine[x][y] == '1')
		{
			printf("你踩到雷了,游戏结束\n");
			DisPlayBoard(mine, ROW, COL);//存放布好的雷
			break;
		}
		else
		{
			int ret = GetMineCount(mine, x, y);//判断输赢函数
			show[x][y] = ret + '0';
			win_count++;
			DisPlayBoard(show, ROW, COL);//存放排查出雷的信息
			
			if (win_count == row * col - Thunder)
			{
				printf("恭喜你,排雷成功^-^\n");
				printf("---查看雷的排布---\n");
				DisPlayBoard(mine, ROW, COL);
				break;
			}
		}
	}
}

四:game.h实现

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 9           //列      
#define COL 9           //行
#define ROWS ROW + 2    //列 11 
#define COLS COL + 2    //行 11
#define Thunder 10      //雷的个数

//1.打印菜单
void menu();

//2.初始化棋盘
void InitBord(char board[ROWS][COLS], int row, int col, char set);

//3.打印棋盘
void DisPlayBoard(char board[ROWS][COLS], int row, int col);

//4.布置雷
void SetMine(char board[ROWS][COLS], int row, int col);

//5.排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

        不知不觉就到了尾声啦,作为小白的我,可能写的不是很好,不对的地方还请各位小伙伴留言给我谢谢啦。7221dfce3a9741758214cd250913d198.pngfbd9f005bc434c6194c5e57df8ebe7ae.png

d2e0d89ca18346e297af6ae28ad277b6.gif

 

 

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

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

相关文章

【Linux】冯诺依曼体系结构以及操作系统的初步认知

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;Linux的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、冯诺依曼体系结构二、操…

HTB靶机010-SolidState-WP

#oscp SolidState.md 靶机IP 10.10.10.51 scan Nmap : ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 -F 10.10.10.51 Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-10 13:14 CST Nmap scan report for 10.10.10.51 Host is up (0.77s latency). Not shown: …

如果你还不知道SAGA,那这篇不容错过!|分布式事务系列(五)

这是分布式事务系列的第五篇&#xff0c;如果之前文章没读请自行前往。精华专题&#xff0c;强烈建议收藏。 ‍本文详细讲解了分布式事务解决方案——SAGA。 点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达 SAGA事务 什么是SAGA事务 SAGA…

使用maven引入第三方jar包以及打包

我们知道&#xff0c;Maven 是通过仓库对依赖进行管理的&#xff0c;当 Maven 项目需要某个依赖时&#xff0c;只要其 POM 中声明了依赖的坐标信息&#xff0c;Maven 就会自动从仓库中去下载该构件使用。但在实际的开发过程中&#xff0c;经常会遇到一种情况&#xff1a;对接第…

《基于智能手机PPG信号处理和机器学习的非侵入式血糖监测系统》阅读笔记

目录 一、论文摘要 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课…

单片机GD32F303RCT6 (Macos环境)开发 (十五)—— i2c1采用DMA方式的读写函数

i2c1采用DMA方式的读写函数 1、关于i2c1的DMA的映射如图 2、关于代码的宏定义配置 Application目录的Makefile中 ENABLE_I2C_TEST yes才会编译I2C1的相关代码。 同时修改i2c.h文件&#xff0c;定义I2C1_MODE为I2C1_MODE_DMA&#xff0c;这样i2c1的配置为dma模式。 #define …

Microelectronic学习章节总结(3)-- gate level to physical level design

文章目录 数字逻辑设计的主要流程logic familyCMOSTransistor实现的时序逻辑 PSUDO-NMOSDCVSL(Differential Cascode Voltage Swing Logic)DOMINOC2MOS&#xff08;Clocked CMOS&#xff09;TSPC&#xff08;True Single Phase Clocking&#xff09; Transistor behaviorCMOS i…

【C生万物】 指针篇 (进级) 00

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《C生万物 | 先来学C》&#x1f448; 前言&#xff1a; 前面已经带大家学习了初级的指针&#xff0c;先回顾一下重点&#xff1a;指针是用来存…

数据库sql语句(视图的创建)

例题&#xff1a; 建表&#xff1a;要注意各表之间的索引联系&#xff0c;建表先后顺序很重要&#xff0c;不然建不了&#xff0c;例如先建dept&#xff0c;在建其他表&#xff0c;先在dept插入数据&#xff0c;再在其他表插入数据 &#xff08;1&#xff09; create table …

SW simulation解算器选取

接下来重点介绍以下4种解算器&#xff0c;并对解算器进行实际的计算测试。1)Direct sparse解算器&#xff1a;稀疏矩阵解算器&#xff0c;目前使用最为广泛也是发展最为成熟的解算器&#xff0c;几乎所有的有限元分析软件都有该解算器。它可以用于大多数计算模型&#xff0c;堪…

<IBM> 《HA网卡确认方法》

《HA网卡确认方法》 1 HA IP地址类型2HA IP地址设置原则3 HA网卡日常查看方法3.1 查看hosts文件3.2 查看网卡和IP 4 通过命令方式直接查看5 直接查看HA配置4 HA网卡SMIT查看方法&#xff08;暂不完整&#xff09;4.1 根据hosts文件确认IP对应的别名4.2 根据serviceIP确认Persis…

Django SQL注入漏洞分析(CVE-2022-28346)

漏洞简介 Django 在2022年发布的安全更新&#xff0c;修复了在 QuerySet 的 annotate()&#xff0c; aggregate()&#xff0c; extra() 等函数中存在的 SQL 注入漏洞。 影响版本 2.2< Django Django <2.2.28 3.2< Django Django ❤️.2.13 4.0< Django Django &…

白盒测试的静态和动态

白盒测试的静态和动态 静态白盒测试 检查设计和代码 静态测试是指测试非运行部分——检查和审查。白盒测试是指访问代码&#xff0c;能够查看和审查。静态白盒测试实在不执行的条件下有条理地仔细审查软件设计、体系结构和代码&#xff0c;从而找出软件缺陷的过程。有时也称为结…

SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler实现全局异常捕获与处理

场景 在编写Controller接口时&#xff0c;为避免接口因为未知的异常导致返回不友好的结果和提示。 如果不进行全局异常捕获则需要对每个接口进行try-catch或其他操作。 可以对Controller进行全局的异常捕获和处理&#xff0c;一旦发生异常&#xff0c;则返回通用的500响应码与…

洁净环境GMP 要求悬浮粒子 浮游菌 高效过滤器检漏验证所需仪器

lighthouse尘埃粒子计数器 北京中邦兴业是美国lighthouse中国区核心代理服务商&#xff0c;各类型号尘埃粒子计数器均有现货可发。常见尘埃粒子计数器类型&#xff1a;便携式&#xff08;台式&#xff09;、手持式、在线式、液体式。 客户现场 lighthouse浮游菌采样器 北京中…

nginx(七十五)nginx与Vary响应头细节探讨

一 Vary ① nginx与Vary有关联的地方 nginx源码分析处理Vary响应头的逻辑 CORS和缓存 gzip_vary 1) gzip_vary on 如果设置为开启2) 服务器返回数据时会在头部带上"Vary:Accept-Encoding"的标识3) 客户端便可以知道获取到的数据是否已经被压缩,默认为关闭 prox…

ros获取typec-usb摄像头

确保usb或者typec摄像头插在主机上,我这里是typec摄像头&#xff0c;使用了一个usb-typec转接头。 windows在设备管理器中查看是否存在端口&#xff0c;如果没有&#xff0c;可以使用下面的软件进行尝试。 链接&#xff1a;https://pan.baidu.com/s/1hxp3m68W6NjY-3D7q8rGnA 提…

Linux线程同步(1)——一个例子看懂为什么需要线程同步?

对于一个单线程进程来说&#xff0c;它不需要处理线程同步的问题&#xff0c;所以线程同步是在多线程环境下需要注意的问题。线程的主要优势在于&#xff0c;资源的共享性&#xff0c;譬如通过全局变量来实现信息共享&#xff0c;不过这种便捷的共享是有代价的&#xff0c;那就…

postman处理各种请求数据

1、后台request接收postman参数 2、后台单个参数接收postman 3、后台RequestParam参数接收postman 注意事项&#xff1a;情况一&#xff1a;全部都是单个字符串的 情况二&#xff1a;有可能是一个json对象序列化成字符串过来的&#xff0c;那么需要在form-data中设置 …

区间预测 | MATLAB实现QRCNN-LSTM卷积长短期记忆神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRCNN-LSTM卷积长短期记忆神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRCNN-LSTM卷积长短期记忆神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRCNN-LSTM分位数回…