C语言——扫雷小游戏

        扫雷小游戏:

游戏最终效果:

1.先写一下游戏开始的简单界面。

用一个函数来写一下

void menu()
{
	printf(" ---------------------------- \n");
	printf("|           1.play           |\n");
	printf("|           0.exit           |\n");
	printf(" ---------------------------- \n");

}

这里的功能(说明):

        输入 1  代表游戏开始;

        输入 0  代表游戏结束,并退出页面;

既然写扫雷,那地图中的地雷应该是随机出现的,那我们可以用一个srand函数让它随机出现生成地雷。

            srand((unsigned int)time(NULL));   //生成随机数的一个函数

具体用法可以百度一下,简单的概括就是生成一个随机数字。

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;    //用与while函数循环的选择
	do {              //也就是刚开始说的界面选择开始或结束的选项
		menu();
		printf("请选择>");        
		scanf("%d", &input);   //这里的input就是游戏开始或结束的选择
		switch (input)         //再循环里面嵌套一个switch  
		{
		case 1:                 //   当输入1的时候,那就进入游戏开始的逻辑
			printf("游戏开始!\n");
			system("cls");      // :这里是系统函数,用于清空控制台的消息与文字
			game();             //  这个是游戏开始的函数接口
			break;
		case 0:                 //   当选择0的时候,即退出游戏退出循环,并程序结束。
			printf("\n即将退出游戏!\n");
			break;
		default :              //因为只有输入0/1,否则就是输入错误,需要重新输入
			printf("您的选择有误,请重新输入:\n");
		}
	} while (input);
	return 0;
}

当我们选择play时,我们将进入游戏,之后就是游戏逻辑的代码了。

#define ROW 9   //棋盘  行
#define COL 9	//棋盘  列
#define ROWS ROW+2	//判断-棋盘  行
#define COLS COL+2  //判断-棋盘  列
#define COUNT 10	//地雷个数

扫雷,我们需要创建两个二维数组,之后的操作与逻辑都是围绕这两个棋盘来写

一个用来展示覆盖与否的画面(代码中的  show数组):

一个用来记载着地雷的位置与判断(代码中的mine数组) :

void game() 
{
	char mine[ROWS][COLS];    //注: ROWS COLS  为头文件define出来的行和列
	char show[ROWS][COLS];

	//初始化数据 
	Initboard(mine, ROWS, COLS, '0');
	Initboard(show, ROWS, COLS, '*');

	//棋盘打印
	Displayboard(show, ROW, COL);

	//布置雷
	Setmine(mine, ROW, COL);
	
	//排查雷

	Findmine(mine, show, ROW, COL);
	//Displayboard(show, ROW, COL);

}

     之后我们需要先把两个二维数组给初始化一下:

这里我们写一个函数Initboard

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

我们将mine的二维数组都初始化为’0‘

        将show二维数组都初始化为’*‘

注:我们展示出来的一般都是show的二维数组
 

所以我们需要写一个格式函数

//打印棋盘   //并设置格式
void Displayboard(char borad[ROWS][COLS], int row, int col)
{
	printf("======扫雷游戏======\n");
	int i = 0;
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");

	for (int a = 1; a <=row; a++)
	{	
		printf("%d ", a);
		for (int b = 1; b <= col; b++)
		{
			Sleep(10);
			printf("%c ", borad[a][b]);
		}
		printf("\n");
	}
	printf("======扫雷游戏======\n");

}

展示出来就是这个样子。

游戏页面的大概就展示出来了,接下来我们需要写一下游戏判断逻辑了

首先我们需要埋雷,但雷的位置是随机的,所以我们需要用一下srand函数,把雷随机的放进mine二维数组中,就是随机生成一个坐标

        注:mine二维数组中 “0”代表该位置是安全的坐标

                                         “1”代表该位置是埋有地雷的坐标)

//布置雷
void Setmine(char mine[ROWS][COLS], int row, int col)
{
	int count = COUNT;    //COUNT代表的雷的个数,可以自己设置
	while (count)
	{
		int x = rand() % row + 1;        //随机生成x坐标
		int y = rand() % col + 1;        //随机生成y坐标
		if (mine[x][y] =='0')    
		{
			mine[x][y] = '1';            //把mine二维数组的该位置改为1
			count--;
		}                                //代表着埋入地雷
	}
}

接下来就是输入坐标来排查雷的步骤了

//排查雷 
void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int a = 0;
	int b= 0;
	int win = 0;
while(win<row*col-COUNT){                     
			printf("请输入您的坐标:");
			scanf("%d", &a);            //输入坐标x和y
			scanf("%d", &b);
		if ((a <= row + 1 && a > 0) && (b <= col + 1 && b > 0))   
		{        //这里需要用if来判断一下x和y的值是否大于坐标,不在这个范围就需要重新输入坐标
			if (mine[a][b] == '1')    //这里判断的是如果坐标刚好在雷的位置,游戏就结束了
			{
				system("cls");    //清空屏幕
				printf("很抱歉,您被炸死了。\n");
				Displayboard(mine, ROW, COL);       //当炸死后,这里在打印一下mine的棋盘
				Sleep(1000);                        //提示一下并答应雷的位置告诉玩家这里是雷
				break;            //游戏结束后这里需要break一下结束这一层的循环
			}
			else
			{	
				int count=Getminecount(mine,a,b);//Getminecount函数排查这个坐标周围有多少颗雷
				show[a][b] = count+'0';
				system("cls");

				Displayboard(show, ROW, COL);
				win++;
			}
		}
		else        //当不在取值范围内就需要重新输入一下  并输出一个坐标有误的提示
		{
			printf("您输入的坐标有误,请重新输入:\n ");
		}
			}

		if (win == row * col - COUNT)    当把雷的排完后,就获胜了!
		{
			printf("恭喜你,排雷成功。\n");
			Displayboard(show, ROW, COL);

		}
}

 该函数用于统计坐标周围有多少颗雷。

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

下面是全代码: 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define ROW 9   //棋盘  行
#define COL 9	//棋盘  列
#define ROWS ROW+2	//判断-棋盘  行
#define COLS COL+2  //判断-棋盘  列

#define COUNT 10	//地雷个数

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

//打印棋盘   //并设置格式
void Displayboard(char borad[ROWS][COLS], int row, int col)
{
	printf("======扫雷游戏======\n");
	int i = 0;
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");

	for (int a = 1; a <=row; a++)
	{	
		printf("%d ", a);
		for (int b = 1; b <= col; b++)
		{
			Sleep(10);
			printf("%c ", borad[a][b]);
		}
		printf("\n");
	}
	printf("======扫雷游戏======\n");

}


//布置雷
void Setmine(char mine[ROWS][COLS], int row, int col)
{
	int count = COUNT;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] =='0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

//排查雷 
void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int a = 0;
	int b= 0;
	int win = 0;
while(win<row*col-COUNT){
			printf("请输入您的坐标:");
			scanf("%d", &a);
			scanf("%d", &b);
		//	a = a / a * a;
		//	b = b / b * b;
		if ((a <= row + 1 && a > 0) && (b <= col + 1 && b > 0))
		{
			if (mine[a][b] == '1')
			{
				system("cls");
				printf("很抱歉,您被炸死了。\n");
				Displayboard(mine, ROW, COL);
				Sleep(1000);
				break;
			}
			else
			{	
				int count=Getminecount(mine,a,b);
				show[a][b] = count+'0';
				system("cls");

				Displayboard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("您输入的坐标有误,请重新输入:\n ");
		}
			}
		if (win == row * col - COUNT)
		{
			printf("恭喜你,排雷成功。\n");
			Displayboard(show, ROW, COL);

		}
}

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

}

void menu()
{
	printf(" ---------------------------- \n");
	printf("|           1.play           |\n");
	printf("|           0.exit           |\n");
	printf(" ---------------------------- \n");

}
void game() 
{
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	//初始化数据 
	Initboard(mine, ROWS, COLS, '0');
	Initboard(show, ROWS, COLS, '*');

	//棋盘打印
	//Displayboard(mine, ROW, COL);
	Displayboard(show, ROW, COL);

	//布置雷
	Setmine(mine, ROW, COL);
	

	//排查雷

	Findmine(mine, show, ROW, COL);
	//Displayboard(show, ROW, COL);

}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do {
		menu();
		printf("请选择>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("游戏开始!\n");
			Sleep(1000);
			system("cls");
			game();
			break;
		case 0:
			printf("\n即将退出游戏!\n");
			break;
		default :
			printf("您的选择有误,请重新输入:\n");
		}
	} while (input);
	return 0;
}

 

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

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

相关文章

QT 的文件

QT 和C、linux 一样&#xff0c;也有自带的文件系统. 它的操作和C、c差不多&#xff0c;不过也需要我们来了解一下。 输入输出设备类 QObject 有一个子类&#xff0c;名为 QIODevice 类&#xff0c;如其名字&#xff0c;该类是管理所有输入输出设备的类。 比如文件、网络套…

软件测试技术(一):软件测试流程

软件测试流程 软件测试流程如下&#xff1a; 测试计划测试设计测试执行 单元测试集成测试确认测试系统测试验收测试回归测试验证活动 测试计划 测试计划由测试负责人来编写&#xff0c;用于确定各个测试阶段的目标和策略。这个过程将输出测试计划&#xff0c;明确要完成的测…

Excel如何设置自动更新的固定选项

日常工作中你是否想要某数据列设置固定选项&#xff0c;如人力组、财务组、综合组、业务组等&#xff0c;可用“数据验证”实现&#xff0c;如后期新增选项“党建组”&#xff0c;该如何快速处理&#xff1f; 今天刘小生分享“超级表数据验证”方式&#xff0c;只实现固定选项…

Java 项目学习(初始化项目)

后端工程基于 maven 进行项目构建&#xff0c;并且进行分模块开发 参考&#xff1a;Spring或Spring Boot项目目录结构划分和代码分层 1、了解项目的整体结构 sky-take-out maven 父工程&#xff0c;统一管理依赖版本&#xff0c;聚合其他子模块 sky-common 子模块&#xff0c…

Maven私服批量上传pom和jar实操

Maven私服上传pom和jar实操-CSDN博客 Maven私服上传jar实操_maven fakepath-CSDN博客 之前写过两篇向maven私服上传jar的操作&#xff0c;看到阅读量还可以&#xff0c;觉得应该有很多人有这个需求&#xff0c;所以这次再放一个大招&#xff0c;通过批量的方式向私服传jar和p…

2024最新版:C++用Vcpkg搭配VS2022安装matplotlib-cpp库

matplotlib-cpp是一个用于在C中使用matplotlib绘图库的头文件库。它提供了一个简单的接口&#xff0c;使得在C中创建和显示图形变得更加容易。这个库的灵感来自于Python的matplotlib库&#xff0c;它使得在C中进行数据可视化变得更加便捷。 matplotlib-cpp允许在C中使用类似Py…

【R语言】数据可视化分析和统计检验——线性和线性混合效应模型

R语言数据可视化分析和统计检验 写在前面1、数据读取及分析2、组间均值和标准差统计分析3、图像数据探索3.1 图像绘制&#xff08;查看是否存在极端数据&#xff0c;以及数据分布情况&#xff09;3. 2 数据标准化&#xff08;Z-scores&#xff09;3.3 绘制数据相关性 4、ggplot…

杭州电子科技大学2024年成人高等继续教育招生简章

杭州电子科技大学&#xff0c;作为一所享有盛誉的高等学府&#xff0c;始终致力于为社会培养优秀的人才。2024年&#xff0c;学校敞开大门&#xff0c;为广大有志于进一步提升自身学识与技能的成年人提供了难得的机会——成人高等教育招生。 此次招生不仅彰显了杭州电子科技大…

轻量级的数据交换格式JSON (JavaScript Object Notation)介绍

什么是JSON&#xff1f; JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;它属于JavaScript的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 JSON具有易读性&…

FFmpeg+ZLMediaKit 超低延时推流

FFmpeg超低延时推流命令 ffmpeg -rtbufsize 4M -i rtsp://admin:abcd1234192.168.2.162:554/h264/ch1/main/av_stream \-c:v libx264 -preset ultrafast -tune zerolatency -x264-params keyint30:min-keyint30:scenecut0 -g 30 \-c:a aac -b:a 128k -ar 44100 -ac 2 -strict …

微型导轨的摩擦系数分析!

微型导轨的摩擦力主要包括滑动摩擦力和滚动摩擦力&#xff0c;摩擦系数是一个关键参数&#xff0c;它决定了滑块在导轨上运动时所受到的摩擦力大小&#xff0c;摩擦系数越低&#xff0c;系统的运动效率和精度就越高&#xff0c;而微型导轨的摩擦系数是受多个因素影响的。 微型导…

【PL理论】(33) 类型系统:推导树证明 φ ⊢ e∶t | 继续定义关系:γ ⊢ e∶t

&#x1f4ac; 写在前面&#xff1a;本章我们将讲解推导树证明&#xff0c;推导树实际上就是推理规则的应用。只要学会如何选择并应用适当的推理规则&#xff0c;证明就不是难事了。 目录 0x00 推导树证明 &#x1d753; ⊢ &#x1d486; ∶ &#x1d495; 0x01 继续定义关…

振动分析-5-基于CNN的机械故障诊断方法

参考基于CNN的机械故障诊断方法 CNN之图像识别 预训练模型迁移学习&#xff08;Transfer Learning&#xff09; 基于卷积神经网络&#xff08;CNN&#xff09;的深度迁移学习在声发射&#xff08;AE&#xff09;监测螺栓连接状况的应用 参考基于CNN的机械故障诊断所面临的困难和…

护眼指南:精选适合学生写作业的台灯推荐

当前&#xff0c;近视问题在人群中愈发普遍&#xff0c;据2024年的统计数据显示&#xff0c;我国儿童青少年的总体近视率已高达52.7%。在繁重的学业压力下&#xff0c;学生的视力健康日益受到关注,近视背后潜藏着诸多眼部并发症的风险&#xff0c;包括但不限于视网膜脱离、视网…

ATFX汇市:英国5月核心CPI年率下降0.4百分点,GBPUSD不跌反涨

ATFX汇市&#xff1a;据英国统计局数据&#xff0c;英国5月核心CPI年率为3.5%&#xff0c;低于前值3.9%&#xff1b;英国5月名义CPI年率为2%&#xff0c;低于前值2.3%。核心CPI年率和名义CPI年率相比前值分别下降0.4个百分点和0.3百分点&#xff0c;意味着英国的通胀率仍处于快…

Nidhogg:一款专为红队设计的多功能Rootkit

关于Nidhogg Nidhogg是一款专为红队设计的多功能Rootkit&#xff0c;该工具的主要目的是为红队研究人员提供一个多合一的切易于使用的多功能Rootkit&#xff0c;并允许研究人员通过单个头文件来将其引入到自己的C2框架之中。 当前版本的Nidhogg支持任意版本的x64 Windows 10和…

Monaco Editor系列(八)插入自定义DOM、删除指定位置的单词、给特定单词着色

前言&#xff1a;人都不知道自己是谁&#xff0c;所以想让自己成为什么样的人&#xff0c;就多给自己说什么样的话。我爱学习&#xff01;学习使我快乐&#xff01;回顾一下上一篇文章的内容。还记得 Monaco Editor 的三个命名空间吗&#xff1f;分别是 editor、languages、wor…

不是所有洗碗机都能空气除菌 友嘉灵晶空气除菌洗碗机评测

精致的三餐让你以为生活是“享受”&#xff0c;可饭后那些油腻的锅碗瓢盆却成了你我美好生活的最大障碍。想要只吃美食不洗碗&#xff0c;那一台优秀的洗碗机就必不可少了&#xff01;今天&#xff0c;ZOL中关村在线要评测的就是这样一台不光洗得干净更能有效除菌抑菌的洗碗机—…

数据虚拟化、Data Fabric(数据编织)的兴起,对数据管理有何帮助?

数字化时代&#xff0c;虚拟化&#xff08;Virtualization&#xff09;并不是一个很陌生的词汇&#xff0c;它是现代数据中心资源管理的核心技术之一&#xff0c;是对 IT 资源&#xff08;如服务器、存储设备、网络设备等&#xff09;的抽象&#xff0c;通过屏蔽 IT 资源的物理…

2024年城市规划与创新管理国际会议(UPIM 2024)

2024年城市规划与创新管理国际会议&#xff08;UPIM 2024&#xff09; 2024 International Conference on Urban Planning and Innovation Management 【重要信息】 大会地点&#xff1a;苏州 大会官网&#xff1a;http://www.icupim.com 投稿邮箱&#xff1a;icupimsub-conf.c…