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

news2024/11/26 9:02:16

扫雷

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

游戏资源介绍

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

游戏功能介绍

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

  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.coloradmin.cn/o/1264759.html

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

相关文章

基于SSM的酒店预订管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

大模型训练为什么用A100不用4090

这是一个好问题。先说结论&#xff0c;大模型的训练用 4090 是不行的&#xff0c;但推理&#xff08;inference/serving&#xff09;用 4090 不仅可行&#xff0c;在性价比上还能比 H100 稍高。4090 如果极致优化&#xff0c;性价比甚至可以达到 H100 的 2 倍。 事实上&#x…

Docker+Anaconda+CUDA+cuDNN

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

Spark_Spark高阶特性

wscg filter导致断链 Codegen 向量化 simdjson Orc Parquet 支持批量读取 spark本身对parquet支持比较好&#xff0c;因为parquet

04_Flutter自定义Slider滑块

04_Flutter自定义Slider滑块 一.Slider控件基本用法 Column(mainAxisAlignment: MainAxisAlignment.start,children: <Widget>[Text("sliderValue: ${_sliderValue.toInt()}"),Slider(value: _sliderValue,min: 0,max: 100,divisions: 10,thumbColor: Colors.…

二叉树的最近公共祖先(C++实现)

二叉树的最近公共祖先 题目思路代码&#xff08;详细注释&#xff09; 题目 二叉树的最近公共祖先 思路 我们可以通过两个栈来实现 实现一个FindPath函数&#xff0c;用来查找从根节点到目标节点的路径&#xff08;路径可以用栈来保存&#xff09; 路径保存好后&#xff0c;…

黄金比例设计软件Goldie App mac中文版介绍

Goldie App mac是一款测量可视化黄金比例的工具。专门为设计师打造&#xff0c;可以帮助他们在Mac上测量和可视化黄金比例&#xff0c;从而轻松创建出完美、平衡的设计。 Goldie App mac体积小巧&#xff0c;可以驻留在系统的菜单栏之上&#xff0c;随时提供给用户调用。 拥有独…

uniapp设置手机通知权限

提醒用户开启通知权限&#xff0c;与unipush功能联用 效果图&#xff1a; 方法&#xff1a; 直接使用即可&#xff0c;在真机或模拟器运行 setPermissions() {// #ifdef APP-PLUS if (plus.os.name Android) { // 判断是Androidvar main plus.android.runtimeMainActivity…

【LeetCode刷题-链表】--86.分隔链表

86.分隔链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ class…

文件服务器迁移

文件服务器迁移还是比较简单的 win server加域 导出配额文件 选中所有项&#xff0c;点击导出 导出共享文件夹权限列表 导出文件夹的权限表&#xff0c;留作备用。需要用到“icacls” icacls c:\windows\* /save aclfile /t # C:\Windows 目录及其子目录中所有文件的 DAC…

等保——密评技术要求

密评简介 密评定义&#xff1a;全称商用密码应用安全评估, 是指对采用商用密码技术、产品和服务集成建设的网络和信息系统密码应用的合规性、正确性、有效性进行评估。密评对象&#xff1a;重要信息系统、关键信息基础设施、网络安全等保三级及以上的系统。评测依据&#xff1…

OpenCV数字图像处理——检测出图像中的几何形状并测量出边长、直径、内角

一、简介 在传统的自动化生产尺寸测量中&#xff0c;常用的方法是利用卡尺或千分尺对被测工件的某个参数进行多次测量&#xff0c;并取这些测量值的平均值。然而&#xff0c;这些传统的检测设备或手动测量方法存在着一些问题&#xff1a;测量精度不高、测量速度缓慢&#xff0…

使用std::mutext与std::condition_variables实现信号量

1. 信号量的定义 2. 使用std::mutext与std::condition_variables实现信号量 代码来自&#xff1a;https://zhuanlan.zhihu.com/p/462668211 #ifndef _SEMAPHORE_H #define _SEMAPHORE_H #include <mutex> #include <condition_variable> using namespace std;cla…

JSP forEach标签varStatus使用讲解(了解即可 基本用不到)

上文 JSP迭代标签之 forEach循环标签 基本使用讲解 我们讲了一下forEach标签 大多数时候会用的语法 但是varStatus 没有讲到 因为我觉得这个东西 做个了解就好了 如果你不感兴趣都可以不看 因为感觉开发中基本是用不到的 但是 官方有提供 我还是说一下 当前遍历的基本信息 包括…

postman接口测试教程与实例分享

postman 的界面图 各个功能区的使用如下&#xff1a; 快捷区&#xff1a; 快捷区提供常用的操作入口&#xff0c;包括运行收藏夹的一组测试数据&#xff0c;导入别人共享的收藏夹测试数据&#xff08;Import from file, Import from folder, Import from link等&#xff09;&…

【Python】获取ip

要使用Python获取IP地址&#xff0c;可以使用socket库中的gethostname()函数和gethostbyname()函数。 import socketdef get_ip_address():hostname socket.gethostname()ip_address socket.gethostbyname(hostname)return ip_addressip get_ip_address() print("IP地…

成功的蓝图:实现长期成长与卓越表现的 6 项策略

能在收入和利润上持续领先同行的公司寥寥无几&#xff0c;不到四分之一。McKinsey的最新研究揭示了这些增长标杆公司与众不同的六大心态和策略。过度谨慎的公司&#xff0c;尤其在动荡时期&#xff0c;也许能捱过当下&#xff0c;但往往无法发掘全部潜力。考虑到近五年历经前所…

事务的自动提交机制和隐式提交机制

自动提交机制就是一个sql语句完成默认提交一次&#xff0c;也就是说一个sql语句是原子性的。想关闭这种功能&#xff0c;两种方式一种写START TRANSACTION&#xff0c;另一种SET autocommit OFF 隐式提交机制&#xff0c;在START TRANSACTION后&#xff0c;会有一些情况导致语…

在centos7上源码安装nginx

1. 安装必要的编译工具和依赖项 在编译Nginx之前&#xff0c;你需要安装一些编译工具和依赖项。可以通过以下命令安装&#xff1a; yum install gcc-c pcre-devel zlib-devel make 2. 下载Nginx源代码 从Nginx官网下载最新的源代码。你可以使用wget命令来下载&#xff1a; …

LLM、ChatGPT与多模态必读论文150篇

为了写本 ChatGPT 笔记&#xff0c;我和10来位博士、业界大佬&#xff0c;在过去半年翻了大量中英文资料/paper&#xff0c;读完 ChatGPT 相关技术的150篇论文&#xff0c;当然还在不断深入。 由此而感慨&#xff1a; 读的论文越多&#xff0c;你会发现大部分人对ChatGPT的技…