【扫雷】C语言实现扫雷小游戏

扫雷

  • 游戏资源介绍
  • 游戏功能介绍
  • 游戏代码编写教程
  • 游戏功能测试
    • 自动排雷测试
    • 地雷标记测试
    • 取消标记测试
    • 踩雷判定测试
    • 重复游戏测试
    • 胜利判定测试
  • 头文件
  • 游戏主体文件
  • 用户主体文件

游戏资源介绍

本次对之前的扫雷游戏进行了重新编写与更新,在此次的游戏实现中新增加了剩余地雷数量统计、地雷标记、地雷标记取消的功能,游戏实现的主体逻辑并未改变,相比于之前的游戏,此次的内容会更加的完善。
游戏代码资源如下,需要的朋友可以自取。

游戏功能介绍

在本次编写的游戏中包含以下功能:

  1. 开始菜单:供玩家选择开始游戏还是结束游戏
  2. 错误提示:玩家选择错误时给予提示
  3. 棋盘初始化:在创建好棋盘后可以对棋盘进行出始化(后期会增加初始化样式功能)
  4. 棋盘打印;将棋盘打印在屏幕上
  5. 地雷设置:在棋盘上随机设置地雷(后期会增加修改地雷数和棋盘大小的功能)
  6. 坐标判定:判断玩家输入坐标是否正确
  7. 地雷标记:玩家可以主动选择在该坐标点上放置地雷标记
  8. 自动排查:当玩家输入的坐标周围没有地雷时,系统会自动进行周围坐标的地雷排查
  9. 地雷数量统计:在进行排查时会将坐标周围的地雷数量统计好并显示在对应坐标上
  10. 剩余地雷统计:在棋盘左上角新增剩余地雷数量统计
  11. 踩雷判定:当玩家输入坐标为地雷时,会提示踩到地雷判定游戏失败
  12. 胜利判定:当玩家将安全区全部找出来时,会提示玩家获得胜利,并自动放置地雷标记
  13. 重复游戏:当玩家结束一局游戏后可以再来一局游戏

游戏代码编写教程

【扫雷】#C语言的第三个小游戏 #保姆级编写思路

游戏功能测试

自动排雷测试

自动排雷

地雷标记测试

放置旗帜

取消标记测试

在这里插入图片描述

踩雷判定测试

失败判定

重复游戏测试

重复游戏

胜利判定测试

胜利判定
游戏胜利后自动将地雷标记出来

本次新编写游戏部分代码如下:

头文件

//引用头文件
#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>
#include <time.h>

//定义标识符常量
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define COUNT 5

//函数声明
void init_board(char board[ROWS][COLS], int rows, int cols, char ret);//初始化
void print_board(char board[ROWS][COLS], int row, int col, int count);//打印
void set_mine(char board[ROWS][COLS], int row, int col, char ret);//埋雷
void find_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col);//排雷shadow, mine
void menu2();//选择操作菜单
void menu3();//选择操作菜单2
char judge_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y);//判断地雷
int static_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y);//坐标周围地雷计数
void auto_find(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y);//自动排雷
int judge_win(char shadow[ROWS][COLS], int row, int col);//判断胜利
int judge_win2(char shadow[ROWS][COLS], int row, int col);//判断未排雷数量
int auto_mark(char shadow[ROWS][COLS], int row, int col, int count);//自动标记

游戏主体文件

//初始化棋盘
void init_board(char board[ROWS][COLS], int rows, int cols, char ret)
{
	for (int i = 0; i < rows; i++)//初始化行元素
	{
		for (int j = 0; j < cols; j++)//初始化列元素
		{
			board[i][j] = ret;
		}
	}
}
//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col, int count)
{
	printf("\n   *---地雷   #---未排雷区域   P---旗帜\n\n");
	printf("剩余地雷:%d\n", count);
	printf("|");
	for (int i = 0; i <= row; i++)//打印列坐标
	{
		printf(" %d |", i);
	}
	printf("\n");
	//打印分割线
	printf("|");
	for (int j = 0; j <= col; j++)//打印列
	{
		printf("---|");
	}
	printf("\n");
	for (int i = 1; i <= row; i++)//打印行
	{
		printf("| %d |", i);//打印行号
		for (int j = 1; j <= col; j++)//打印列
		{
			printf(" ");
			printf("%c", board[i][j]);
			printf(" |");
		}
		printf("\n");
		//打印分割线
		printf("|");
		for (int j = 0; j <= col; j++)//打印列
		{
			printf("---|");
		}
		printf("\n");
	}
	printf("\n");
}
//埋地雷
void set_mine(char board[ROWS][COLS], int row, int col, char ret)
{
	int count = COUNT;//地雷数量
	while (count)
	{
		int flag = 0;//判断埋雷是否成功
		int i = rand() % ROW + 1;//地雷横坐标
		int j = rand() % COL + 1;//地雷纵坐标
		if (i >= 1 && i <= row)//判断横坐标的合法性1-row
		{
			if (j >= 1 && j <= col)//判断纵坐标的合法性1-col
			{
				if (board[i][j] == ' ')
				{
					board[i][j] = ret;
					flag = 1;//成功埋雷
				}
			}
		}
		if (flag)
			count--;
	}
}
//通过坐标周围地雷数
int static_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y)
{
	int count = 0;//计数器
	for (int i = -1; i < 2; i++)//横坐标判断
	{
		for (int j = -1; j < 2; j++)
		{
			if (mine[x + i][y + j] == '*')//坐标点为地雷
				count++;//计数器+1
		}
	}
	return count;
}

用户主体文件

//菜单栏
void menu()
{
	printf("#####################\n");
	printf("#### 0. 退出游戏 ####\n");
	printf("#### 1. 退出游戏 ####\n");
	printf("#### 请选择<0/1> ####\n");
	printf("#####################\n");
}
//游戏
void game()
{
	//藏雷
	char shadow[ROWS][COLS] = { 0 };
	//地雷
	char mine[ROWS][COLS] = { 0 };
	//初始化棋盘
	init_board(shadow, ROWS, COLS, '#');
	init_board(mine, ROWS, COLS, ' ');
	//打印棋盘
	print_board(shadow, ROW, COL, COUNT);
	//埋雷
	set_mine(mine, ROW, COL, '*');
	//print_board(mine, ROW, COL,COUNT);
	//排雷
	find_mine(shadow, mine, ROW, COL);
}

int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do
	{
		menu();//菜单栏
		printf("请输入您的选择>:");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("正在退出,请耐心等候\n");
			Sleep(1000);
			system("cls");
			break;
		case 1:
			printf("开始扫雷\n");
			game();
			break;
		default:
			printf("输入错误,请重新输入!!!");
			Sleep(1000);
			system("cls");
			break;
		}
	} while (input);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp中uni.navigateBack返回后刷新页面数据

文章目录 一、前言1.1、[uni.navigateBack](https://uniapp.dcloud.net.cn/api/router.html#navigateback) 二、方法2.1、父页面设置钩子函数onBackPress2.2、uni.$emit和uni.$on监听通知数据变更2.2.1、子页面2.2.2、父页面 2.3、onShow钩子函数处理数据2.3.1、子页面2.3.2、父…

解决ant-design-vue中Select组件v-model值为空字符串不显示placeholder的bug

方法一&#xff1a; 1.找到node_modules/ant-design-vue/es/vc-select/SingleSelector.js文件 搜索renderPlacehoder方法 将其修改为 const renderPlacehoder () > {const list props.values.filter(val > val.value ! );if (list[0]) {return null}... }2.在此文件中…

集合框架(二)LinkedList的常见使用

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍LinkedList的常见使用以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题可以在评论区留言 目…

vue3+ts 实现时间间隔选择器

需求背景解决效果视频效果balancedTimeElement.vue 需求背景 实现一个分片的时间间隔选择器&#xff0c;需要把显示时间段显示成图表&#xff0c;涉及一下集中数据转换 [“02:30-05:30”,“07:30-10:30”,“14:30-17:30”]‘[(2,5),(7,10),(14,17)]’[4, 5, 6, 7, 8, 9, 10, …

Windows10系统卸载服务和删除服务

记录一下Windows10系统卸载服务和删除服务 最近在使用自己win电脑的时候 发现服务里存在很久之前就没有使用的应用&#xff0c;对应的文件夹也都已经删除了&#xff0c;但是在win服务里一直存在&#xff0c;不知道会不会影响性能&#xff0c;看着吧还是强迫自己删掉好一些&…

安防视频监控/视频融合/云存储EasyCVR页面数据显示不全该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

linux文件管理命令_切换创建复制移动删除查看修改

1.3 文件管理命令 1.3.1 cd&#xff1a;切换目录&#xff08;change directory&#xff09; cd 绝对路径/相对路径 # 根目录 [rootlocalhost ~]# cd / # 家目录 [rootlocalhost /]# cd [rootlocalhost /]# cd ~ # 父级目录 [rootlocalhost /]# cd .. # 返回上一次目录 [roo…

C++中的模板

模板概论 c提供了函数模板 (function template.) 所谓函数模板&#xff0c;实际上是建立一个通用函 数&#xff0c;其函数类型和形参类型不具体制定&#xff0c;用一个虚拟的类型来代表。这个通用函数 就成为函数模板。凡是函数体相同的函数都可以用这个模板代替&#xff0c;不…

人工智能_AI服务器安装清华开源_CHATGLM大语言模型_GLM-6B安装部署_人工智能工作笔记0092

看到的这个开源的大模型,很牛,~关键让我们自己也可以部署体验一把了,虽然不知道具体内部怎么构造的但是,也可以自己使用也挺好. 可以部署在自己的机器上也可以部署在云服务器上. 安装以后,是可以使用python代码进行提问,然后返回结果的,这样就可以实现我们自己的chat应用了, …

TiDB 在咪咕云原生场景下的实践

导读 咪咕是中国移动旗下的视频科技公司&#xff0c;门户系统是其核心业务之一。 为满足用户的多样化需求&#xff0c;咪咕计划对其数据库进行升级。 经过对中国主流国产数据库的测试评估后&#xff0c;咪咕选择了 TiDB&#xff0c;并成功将其落地于门户系统云化项目。 TiDB 为…

太阳能监控智慧杆供电系统

太阳能监控智慧杆系统工作时无需水、油、汽、燃料&#xff0c;只要有光就能发电的特点&#xff0c;是清洁、无污染的可再生能源&#xff0c;而且安装维护简单&#xff0c;使用寿命长&#xff0c;可以实现无人值守&#xff0c;倍受人们的青睐&#xff0c;是新能源的领头羊。近年…

【封装UI组件库系列】封装Button图标组件

封装UI组件库系列第四篇封装Button按钮组件 &#x1f31f;前言 &#x1f31f;封装Button组件 1.分析封装组件所需支持的属性与事件 支持的属性&#xff1a; 支持的事件&#xff1a; 2.创建Button组件 &#x1f31f;封装功能属性 type主题颜色 plain是否朴素 loading等…

鸿蒙开发学习——应用程序框架

文章目录 UIAbility的生命周期Create状态WindowStageCreateForeground和Background前后台展示控制onWindowStageDestroyDestory 总结 UIAbility的生命周期 感觉这里他讲的不清晰&#xff0c;UIAbility的4个声明周期是Create、Foreground&#xff08;桌面展示&#xff09;、Back…

kali linux nmap 端口扫描 简单教程

本次实验所用工具如下&#xff1a; VMwarekali linux (namp扫描工具)Windows sever 2016 需开启&#xff08;FTP&#xff0c;smp&#xff0c;Telnet&#xff0c;rdp&#xff09;端口namp操作所用部分代码&#xff1a; -sP ping 扫描 -P 指定端口范围 -sV 服务版本探测 -A …

【UE】绘制抛物线并投射物体

效果 步骤 1. 先新建父类为Actor的蓝图&#xff0c;这里命名为“BP_发射物” 打开“BP_发射物”&#xff0c;添加一个球形的静态网格体和一个发射物移动组件 2. 新建一个父类为角色的蓝图&#xff0c;这里命名为“BP_绘制抛物线” 打开“BP_绘制抛物线” 我们希望可以通过控制…

2023.11.28-电商平台建设03 - 大数据调优手段

1.优化手段 1.1分桶表 HIVE的分桶本质上就是MR的分区操作 建表语句: create table 表名(字段 类型,.... ) clustered by(分桶字段) [sorted by (字段 [asc | desc])] into N buckets --- 定义分桶表核心语句 row format...... 分桶的作用 1) 进行数据采样工作 1.1) …

【古月居《ros入门21讲》学习笔记】14_参数的使用与编程方法

目录 说明&#xff1a; 1. 参数模型&#xff08;全局字典&#xff09; 2. 实现过程&#xff08;C&#xff09; 创建功能包 参数命令行的使用 YAML参数文件 rosparam命令 使用示例 编程方法&#xff08;C&#xff09; 配置代码编译规则 编译并运行 编译 运行 3. 实…

五丶openlayer之LOD和分辨率

LOD是Levels of Detail的简写&#xff0c;用于根据当前的环境&#xff0c;渲染不同的图像&#xff0c;用于降低非重要的细节度&#xff0c;从而提高渲染效率&#xff0c;在电子游戏中经常运用&#xff0c;对于需要显示全球地图的GIS系统而言&#xff0c;更需要应用这项技术。 …

Docker+Anaconda+CUDA+cuDNN

一、导语 因为要复现文献的需求和实验室里师兄想要给我提升能力的多方面因素在一起&#xff0c;所以学习并实现了相关安装。在这里做一个记录&#xff0c;方便日后查看&#xff0c;如果能给其他同学带来便捷就更好了。 在这篇文章中&#xff0c;我的目标是搭建一个可以使用Py…

VSCode Vue 开发环境配置

Vue是前端开发中的重要工具与框架&#xff0c;可以保住开发者高效构建用户界面。 Vue2官方文档&#xff1a;https://v2.cn.vuejs.org/ Vue3官方文档&#xff1a;https://cn.vuejs.org/ Vue的安装和引用 Vue2的官方安装指南&#xff1a;https://v2.cn.vuejs.org/v2/guide/ins…