扫雷小游戏 - C语言

news2024/9/24 3:27:53

目录

一、扫雷游戏

1.游戏一共创建使用了三个文件

2.test.c 文件代码(游戏逻辑)

3.game.h - 必要的函数声明代码 

4.game.c 游戏所有函数实现代码


一、扫雷游戏

1.游戏一共创建使用了三个文件

test.c - 测试游戏逻辑

game.h - 游戏代码包含的函数声明

game.c - 游戏里面函数的实现

2.test.c 文件代码(游戏逻辑)

#define _CRT_SECURE_NO_WARNINGS 1
//测试游戏逻辑

#include"game.h"

void menu()
{
	printf("           < M E N U >           \n");
	printf("*********************************\n");
	printf("*********    1.play    **********\n");
	printf("*********    0.exit    **********\n");
	printf("*********************************\n");

}

void game()
{
	//创建棋盘
	char mine[ROWS][COLS] = { 0 };//布置雷的棋盘
	char show[ROWS][COLS] = { 0 };//展示玩家棋盘

	//初始化棋盘 - 11*11
	InitBoard(mine, ROWS, COLS, '0');//将雷棋盘,初始化为'0'
	InitBoard(show, ROWS, COLS, '*');//将玩家棋盘,初始化为'*'

	//打印棋盘 - 传过去的show棋盘11*11,实际打印9*9 ROW, COL
	DisplayBoard(show, ROW, COL);

	//布置雷 - 传过去mine棋盘11*11,实际打印9*9 ROW COL
	SetMine(mine, ROW, COL);
	DisplayBoard(mine, ROW, COL);

	//排查雷 - 再mine数组里将排查的雷的信息,放到show数组里,所以传的时候两个数组都要传
	FindMine(mine, show, ROW, COL);
}

int main()
{
	//srand只调用一次,放在主函数
	srand((unsigned int)time(NULL));

	int input = 0;
	do
	{
		menu();
		printf("请输入菜单选项:>");
		scanf("%d", &input);
		printf("\n");

		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("<   退出游戏  >\n");
			break;
		default:
			printf("<  选择错误,请重新输入!!>\n");
			break;
		}
	} while (input);
	return 0;
}

3.game.h - 必要的函数声明代码 

#define _CRT_SECURE_NO_WARNINGS 1
//包含必要的声明

//定义变量和宏
#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define num_mine 10
//包含的头文件
#include<stdio.h>
#include<stdlib.h>	/* rand,srand*/
#include<time.h>	/* time */

//自定义函数的声明

//初始化棋盘 - 11*11
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);

//打印棋盘 - 传过来的是11*11 打印的是9*9
void DisplayBoard(char board[ROWS][COLS], int row, int col);

//布置雷 - 传过来的是11*11 打印的是9*9
void SetMine(char mine[ROWS][COLS], int row, int col);

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

//统计坐标周围雷的情况
int GetMineCount(char mine[ROWS][COLS], int x, int y);

4.game.c 游戏所有函数实现代码

#define _CRT_SECURE_NO_WARNINGS 1
//实现程序所需的函数

#include"game.h"

//初始化棋盘 - 11*11
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}


//打印棋盘 - 传过来的11*11 打印的是 9*9
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf(" <  --- 扫雷 ---  >\n");
	//每一列上面打印对应的数字
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}
	printf("\n");

	for (i = 1; i <= row; i++)
	{
		//每一行前面打印对应的数字
		printf("%d ", i);
		//打印棋盘
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("\n");

}

//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{
	int count = num_mine;//10个雷

	while (count)
	{
		//随机生成雷坐标 - rand() 0~32767
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		//判断棋盘是否布置过雷
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}

}


//统计该坐标周围雷的情况
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	//周围所有坐标字符(8个字符)的和 减去8*'0' = 雷的数量
	//参考:
	// '0' + 0 = '0'
	// '0' + 1 = '1'
	//得到
	// '1' - '0'= 1
	//8*'1' - 8*'0'如果等于 0,则表示没有雷;等于1~7则表示有雷;返回对应的数字即可;
	return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1]
		+ mine[x][y - 1] + mine[x][y + 1]
		+ mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1])
		- 8 * '0';
}


//将坐标周围没有雷时,置该坐标及周围8个坐标为 空格 ,不显示
void SetNone(char show[ROWS][COLS], int x, int y)
{
	show[x][y] = ' ';
	show[x - 1][y - 1] = ' ';
	show[x - 1][y] = ' ';
	show[x - 1][y + 1] = ' ';
	show[x][y - 1] = ' ';
	show[x][y + 1] = ' ';
	show[x + 1][y - 1] = ' ';
	show[x + 1][y] = ' ';
	show[x + 1][y + 1] = ' ';

}



//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	//输入排查雷的坐标
	int x = 0;
	int y = 0;

	//排雷次数
	int win = 0;
	while (win<row*col-num_mine)
	{
		printf("请输入要排查雷的坐标(行 列):>");
		scanf("%d %d", &x, &y);

		if (x >= 1 && x <= row && y >= 1 && y <= col && show[x][y] == '*')
		{
			if (mine[x][y] == '1')
			{
				printf("\n******>>很遗憾,踩雷了>>******\n");
				printf("******>>请看雷的情况:\n\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				//排查雷
				//如果该坐标不是雷,统计该坐标周围雷的情况
				int count=GetMineCount(mine, x, y);
				show[x][y] = count+'0';//count为整型 例如2,加上字符'0',变成count整型对应数字字符 例如'2'
				DisplayBoard(show, ROW, COL);//然后打印棋盘
				win++;
				
			}
		}
		else
		{
			printf("******>>非法排查!!请重新排查!!>>******\n");
		}

	}
	if (win == row * col - num_mine)
	{
		printf("\n******>>恭喜!!排雷大师!!成功排除所有雷!!******\n");
		printf("******>>请看雷的情况:\n\n");
		DisplayBoard(mine, ROW, COL);//然后打印棋盘

	}
}


//代码需要完善:展开函数,标记函数,时间函数(计时)
//展开函数:展开满足这些条件的坐标
/*
必须满足条件:
1.该坐标不是雷
2.该坐标周围没有雷
3.该坐标没有被排查过

*/

最后可以体验一下 

同时这只是个简单的扫雷游戏实现,其中也有点缺陷,如果各位大佬有更好的方法可以分享给我哈~~

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

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

相关文章

低频量化之指数 PE-PB-偏离 数据

目录历史文章股票明日涨停预测指数PEPB分位指数PE分位指数PB分位行业指数PEPB分位行业指数PE分位行业指数PB分位指数60日线偏离数据指数MA60偏离统计上证指数 MA60偏离度深证成指 MA60偏离度创业板指 MA60偏离度中小100 MA60偏离度上证50 MA60偏离度沪深300 MA60偏离度中证500 …

代码随想录算法训练营第45天动态规划 背包基础 1 2、 416. 分割等和子集

文章目录01背包基础 &#xff08;二维数组&#xff09;思路递推公式初始化遍历顺序一维dp数组&#xff08;滚动数组&#xff09;一维数组的递推公式遍历顺序LeetCode 416. 分割等和子集思路总结01背包基础 &#xff08;二维数组&#xff09; 思路 根据动态规划五部进行分析&a…

Vulnhub 渗透练习(八)—— THE ETHER: EVILSCIENCE

环境搭建 环境下载 靶机和攻击机网络适配都选 NAT 即可。 信息收集 主机扫描 两个端口&#xff0c;22 和 80&#xff0c;且 apache httpd 2.4.0~2.4.29 存在换行解析漏洞。 Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中…

跨域问题的三种解决办法

我们平时对于前后端联调的项目&#xff0c;以下的错误是经常常见的&#xff0c;我们查看浏览器报错&#xff1a; Access to XMLHttpRequest at http://localhost:63110/system/dictionary/all fromorigin http://localhost:8601 has been blocked by CORS policy: No Access…

自动化测试5年经验,分享一些心得

自动化测试介绍 自动化测试(Automated Testing)&#xff0c;是指把以人为驱动的测试行为转化为机器执行的过程。实际上自动化测试往往通过一些测试工具或框架&#xff0c;编写自动化测试用例&#xff0c;来模拟手工测试过程。比如说&#xff0c;在项目迭代过程中&#xff0c;持…

【Flutter入门到进阶】Dart进阶篇---Dart多线程异步原理

1 Isolate 1.1 什么是Isolate 1.1.1 概念 线程&#xff1f;异步&#xff1f;隔离&#xff1f;到底什么意思&#xff1f; Isolate中文意思是隔离&#xff0c;从使用角度来说是Dart的线程&#xff0c;但是从本质虚拟机的实现角度来讲Isolate是一组封装。 isolate可以理解为dar…

群晖-第1章-IPV6的DDNS

群晖-第1章-IPV6的DDNS 方案&#xff1a;腾讯云群晖DS920 本文参考群晖ipv6 DDNS-go教程-牧野狂歌&#xff0c;感谢原作者的分享。 这篇文章只记录了我需要的部分&#xff0c;其他的可以查看原文&#xff0c;原文还记录了更多的内容&#xff0c;可能帮到你。 一、购买域名 …

【基于众包标注的语文教材句子难易度评估研究 论文精读】

基于众包标注的语文教材句子难易度评估研究 论文精读信息摘 要0 引言1 相关研究2 众包标注方法3 语料库构建3.1 数据收集3.1 基于五点量表的专家标注3.3 基于成对比较的众包标注4 特征及模型4.1 特征抽取4.2 模型与实验设计4.2.1 任务一:单句绝对难度评估4.2.2 任务二:句对相对…

《JavaScript百炼成仙》,简单但是挺有效的

编程之修&#xff0c;重在积累&#xff0c;而非资质。资质虽然重要&#xff0c;可是后天的努力更不可少。 《JavaScript百炼成仙》是一本以玄幻小说的形式&#xff0c;来讲述JavaScript的知识。 此篇仅仅是我快速阅读《JavaScript百炼成仙》这本书的笔记&#xff0c;流水账笔…

MySQL进阶篇之InnoDB存储引擎

06、InnoDB引擎 6.1、逻辑存储结构 表空间&#xff08;Tablespace&#xff09; 表空间在MySQL中最终会生成ibd文件&#xff0c;一个mysql实例可以对应多个表空间&#xff0c;用于存储记录、索引等数据。 段&#xff08;Segment&#xff09; 段&#xff0c;分为数据段&#x…

python基于vue微信小程序 房屋租赁出租系统

目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2.1 2.2MyEclipse环境配置 4 2.3 B/S结构简介 4 2.4MySQL数据库 5 2. 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.1.2技术可行性 6 3.1.3运行可行…

面试准备知识点与总结——(虚拟机篇)

目录JVM的内存结构JVM哪些部分会发生内存溢出方法区、永久代、元空间三者之间的关系JVM内存参数JVM垃圾回收算法1.标记清除法2.标记整理3.标记复制说说GC和分代回收算法三色标记与并发漏标的问题垃圾回收器项目中什么时候会内存溢出&#xff0c;怎么解决类加载过程三个阶段何为…

Docker 架构简介

Docker 架构 Docker 包括三个基本概念: 镜像&#xff08;Image&#xff09;&#xff1a;Docker 镜像&#xff08;Image&#xff09;&#xff0c;就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。容器&am…

【力扣-LeetCode】64. 最小路径和 C++题解

64. 最小路径和难度中等1430收藏分享切换为英文接收动态反馈给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。说明&#xff1a;每次只能向下或者向右移动一步。示例 1&#xff1a;输入&#xff…

实例1:控制树莓派板载LED灯闪烁

实例1&#xff1a;控制树莓派板载LED灯闪烁 实验目的 通过背景知识学习&#xff0c;了解四足机器人mini pupper搭载的微型控制计算机&#xff1a;树莓派。通过对树莓派板载LED灯的状态读写控制&#xff0c;熟悉树莓派本身的操作及Linux中文件的读写。掌握常见函数time.sleep(…

初识Hadoop,走进大数据世界

文章目录数据&#xff01;数据&#xff01;遇到的问题Hadoop的出现相较于其他系统的优势关系型数据库网格计算本文章属于Hadoop系列文章&#xff0c;分享Hadoop相关知识。后续文章中会继续分享Hadoop的组件、MapReduce、HDFS、Hbase、Flume、Pig、Spark、Hadoop集群管理系统以及…

rewrite中的if、break、last

目录 rewrite 作用&#xff1a; 依赖&#xff1a; 打开重定向日志&#xff1a; if 判断&#xff1a; location {} 本身有反复匹配执行特征 在 location 中加入 break 和 last &#xff08;不一样&#xff09; 加了break后&#xff0c;立刻停止向下 且 跳出。 加了last&#xf…

Windows 版本ffmpeg编译概述

在使用ffmpeg过程当中&#xff0c;ffmpeg在Linux(包括mac,android)编译非常容易,直接configure,make即可&#xff0c;Android需要交叉编译,在windows就比较麻烦&#xff0c;庆幸的是ffmpeg官方提供已编译好Windows版本的二进制库&#xff08;http://ffmpeg.org/download.html#b…

使用vector<char>作为输入缓冲区

一、引言 当我们编写代码&#xff1a;实现网络接收、读取文件内容等功能时&#xff0c;我们往往要在内存中开辟一个输入缓冲区(又名&#xff1a;input buffer/读缓冲区&#xff09;来存贮接收到的数据。在C里面我们可以用如下方法开辟输入缓冲区。 ①使用C语言中的数组&#x…

【Spring教程】1.Spring概述

1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测…