C实现扫雷小游戏(简易版)

news2024/11/18 19:38:17

你知道,有些鸟儿是注定不会被关在牢笼里的,它们的每一片羽毛都闪耀着自由的光辉。——《肖申克的救赎》


目录

1、设计框架

2、设计流程

2.1菜单

2.2初始化雷阵

2.3生成雷 

2.4玩家输入坐标

2.5显示有多少个雷

3、所有程序的源码

3.1game.h

3.2game.c

3.3test.c


前言:

大家好,我是拳击哥。今天给大家展现的是C语言实现扫雷小游戏教程和源码的展示,相信大家都知道扫雷游戏的规则,那怎么用C语言实现呢?下面我就来讲解。


1、设计框架

首先,我们要有一个菜单来选择我是开始游戏还是退出游戏。其次我们要设计控制开始或退出后程序的走向。设计完菜单后,我们要初始化雷阵,然后玩家排雷。每排一次我们要判断雷阵周围有几个雷,直到所有的雷都被排完了我们就胜利了,反之排到雷了我们就输了。有了以上思想后,我们再来看程序流程与代码吧。


2、设计流程

我们要设计五个函数

  • 菜单
  • 初始化雷阵
  • 生成雷
  • 玩家输入坐标
  • 显示周围有多少个雷

在编上述几个函数之前,我们先创建三个文件。为了程序的条理清晰,我们要模块化程序,因此创建三个文件。分别为:test.c、game.c、game.h这三个文件

game.h头文件我们把上述几个模块函数的声明放在里面,包括库函数的头文件,我们都可以放在里面。等到game.c和test.c文件要用的时候,我们直接引用game.h头文件就行。


2.1菜单

菜单就是一个简易的黑框款,里面有开始、退出两个选择。选择1就开始,选择0就退出。它的代码为:

//test.c
void menu()
{
	printf("+------------------+\n");
	printf("|------1.开始------|\n");
	printf("|------0.退出------|\n");
	printf("+------------------+\n");
}

菜单函数我命名为menu,并且把这个函数放在了test.c里面。


2.2初始化雷阵

我们初始化雷阵我们需要两个雷盘,一个是用来排雷的雷盘,一个是显示给用户看的雷盘。排雷的雷阵里面我们可以设置雷的个数,并且用户是看不到这个雷阵的。我设置的雷盘是9*9的雷盘我们来看代码:

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

#define EasyGame 20

#define H 9
#define L 9

#define HS H+2
#define LS L+2

//game.h
void InitB(char board[HS][LS], int h, int l, char rat);

//test.c
void test()
{
	char mine[HS][LS] = { 0 };
	char show[HS][LS] = { 0 };
	InitB(mine, HS, LS, '0');
	InitB(show, HS, LS, '*');

	PrintB(mine, H, L);
	PrintB(show, H, L);
	

	SetB(mine, H, L);

	FindB(mine, show, H, L);
}

//game.c
void InitB(char board[HS][LS], int h, int l, char rat)
{
	for (int i = 0; i < h; i++)
	{
		for (int j = 0; j < l; j++)
		{
			board[i][j] = rat;
		}
	}
}

我给初始化雷阵函数起名为InitBmine是排雷雷阵,show是用户展现雷阵。那么我在test.c里面初始化这两个雷阵并且调用InitB函数来修改雷阵,mine雷阵我设置全为‘0’,show雷阵我设置全为‘*’。注意是字符类型的。InitB函数的InitB函数的定义放在game.c里面,InitB函数的声明放在game.h里面。

可能有的朋友说不是9*9的雷阵为啥传参给InitB是11*11,因为我们在判断周围有多少雷的时候假设我们输入的是第9行的坐标那么9*9的雷阵就越界了,因此我传给InitB的是雷阵是9*9我们只需要在9*9里面生成雷就好了,外面那一层里面始终是字符'0'。这样判断的时候不会造成数组越界。


2.3生成雷 

生成雷我们在排雷雷阵mine里面生成,你可以任意设置你想要的雷数。

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

#define EasyGame 20

#define H 9
#define L 9

#define HS H+2
#define LS L+2

//game.h
#define EasyGame 20

//game.h
void SetB(char mine[HS][LS], int h, int l);

//test.c
void test()
{
	char mine[HS][LS] = { 0 };
	char show[HS][LS] = { 0 };
	
	SetB(mine, H, L);
}

//game.c
void SetB(char mine[HS][LS], int h, int l)
{
	int count = EasyGame;
	while(count)
	{
		int x = rand() % h + 1;
		int y = rand() % l + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

我给生成雷函数名为SetB,EasyGame是雷数,我设置的是20个你也可以修改。 设置雷就把原来初始化雷为'0'改成'1',注意是字符0和1。


2.4玩家输入坐标

玩家输入坐标,首先得判断这个坐标之前有没有被输入过。再判断是不是雷,是雷就被炸死了。不是雷就显示用户雷阵中该坐标周围有几个雷,这时候就需要调用一个找到该坐标附近雷数的函数get_mine

//game.h
void FindB(char mine[HS][LS], char show[HS][LS], int h, int l);

//game.c
int get_mine(char mine[HS][LS], int x, int y)
{
	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';
}

//game.c
void FindB(char mine[HS][LS], char show[HS][LS], int h, int l)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win<(h*l-EasyGame))
	{
		printf("请输入您要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= h && y >= 1 && y <= l)
		{
			if (show[x][y] != '*')
			{
				printf("坐标已重名,请重新输入:>\n");
				continue;
			}
			if (mine[x][y] == '1')
			{
				printf("很遗憾你被炸死了...\n");
				PrintB(mine, H, L);
				break;
			}
			else
			{
				int n=get_mine(mine, x, y);
				show[x][y] = n+'0';
				PrintB(show, H, L);
				win++;
			}
		}
		else
		{
			printf("请输入正确的坐标:>\n");
		}
	}
	if (win == (h * l - EasyGame))
		printf("恭喜你,排雷成功!\n");
}

判断坐标有没有输入过。只要show雷阵里面的该坐标(输入的坐标)!=*就证明这个坐标未输入过,当然如果恰好你输入的是雷就被炸死了,没有就显示周围的雷数。 


2.5显示有多少个雷

get_mine函数是怎么判断呢,假设我输入的坐标是5,5我要知道该坐标周围有几个雷这时候。把周围8个坐标加起来然后减去8*'0',假设周围有3个雷那么就是5*'0'+3*'1'-8*'0'得到的就是数字3,数字3再加字符'0'就得到了字符'3'然后赋值给show雷阵中的该坐标,这样就达成了显示该坐标有几个雷。

win是每输入一次坐标就自增一次,直到win<(h*l-EasyGame)也就是win等于没有雷的坐标总数时退出循环。

最后判断输赢的是行乘以列然后减去EasyGame,如果win等于h*l-EasyGame那么所有的雷就找到了。


3、所有程序的源码

3.1game.h

#define _CRT_SECURE_NO_WARNINGS

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

#define EasyGame 20

#define H 9
#define L 9

#define HS H+2
#define LS L+2

void InitB(char board[HS][LS], int h, int l, char rat);

void PrintB(char show[HS][LS], int h, int l);

void SetB(char mine[HS][LS], int h, int l);

void FindB(char mine[HS][LS], char show[HS][LS], int h, int l);

3.2game.c

#include"game.h"

void InitB(char board[HS][LS], int h, int l, char rat)
{
	for (int i = 0; i < h; i++)
	{
		for (int j = 0; j < l; j++)
		{
			board[i][j] = rat;
		}
	}
}


void PrintB(char show[HS][LS], int h, int l)
{
	printf("-----扫雷游戏------\n");
	for (int i = 0; i <= l; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (int i = 1; i <= h; i++)
	{
		printf("%d ", i);
		for (int j = 1; j <= l; j++)
		{
			printf("%c ", show[i][j]);
		}
		printf("\n");
	}
	printf("-----扫雷游戏------\n");
}

void SetB(char mine[HS][LS], int h, int l)
{
	int count = EasyGame;
	while(count)
	{
		int x = rand() % h + 1;
		int y = rand() % l + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

int get_mine(char mine[HS][LS], int x, int y)
{
	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';
}

void FindB(char mine[HS][LS], char show[HS][LS], int h, int l)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win<(h*l-EasyGame))
	{
		printf("请输入您要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= h && y >= 1 && y <= l)
		{
			if (show[x][y] != '*')
			{
				printf("坐标已重名,请重新输入:>\n");
				continue;
			}
			if (mine[x][y] == '1')
			{
				printf("很遗憾你被炸死了...\n");
				PrintB(mine, H, L);
				break;
			}
			else
			{
				int n=get_mine(mine, x, y);
				show[x][y] = n+'0';
				PrintB(show, H, L);
				win++;
			}
		}
		else
		{
			printf("请输入正确的坐标:>\n");
		}
	}
	if (win == (h * l - EasyGame))
		printf("恭喜你,排雷成功!\n");
}

3.3test.c

#include"game.h"

void test()
{
	char mine[HS][LS] = { 0 };
	char show[HS][LS] = { 0 };
	InitB(mine, HS, LS, '0');
	InitB(show, HS, LS, '*');

	PrintB(show, H, L);

	SetB(mine, H, L);

	FindB(mine, show, H, L);
}

void menu()
{
	printf("+------------------+\n");
	printf("|------1.开始------|\n");
	printf("|------0.退出------|\n");
	printf("+------------------+\n");
}

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请输入您选择的数:>");
		scanf("%d", &input);
		switch (input)
		{
		case 0:printf("您已退出游戏!\n"); break;
		case 1:test(); break;
		default:printf("请输入正确的数字:>\n"); break;
		}
	} while (input);
	return 0;
}

本期博客就到这里结束了,如有不懂可在评论区留言

 Never Give Up


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

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

相关文章

Slimming剪枝方法

本文参考&#xff1a;5-剪枝后模型参数赋值_哔哩哔哩_bilibiliz https://github.com/foolwood/pytorch-slimming 一、模型剪枝理论说明 论文&#xff1a;Learning Efficient Convolutional Networks through Network Slimming &#xff08;1&#xff09;卷积后得到多个特征图…

通过逻辑回归和感知器算法对乳腺癌数据集breastCancer和鸢尾花数据集iris进行线性分类

逻辑回归和感知器算法进行线性分类 代码使用了LogisticRegression和Perceptron两种分类方法 # 使用LogisticRegreeion分类器学习和测试 lr LogisticRegression() lr.fit(X_train_scaler, y_train) y_pred_lr lr.predict(X_test_scaler)#定义感知机 perceptron Perceptron(…

N3-PEG-ALD,Azide-PEG-Aldehyde,醛基-聚乙二醇-叠氮

1、名称 英文&#xff1a;N3-PEG-ALD&#xff0c;Azide-PEG-Aldehyde 中文&#xff1a;叠氮-聚乙二醇-醛基 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Aldehyde / Acetal PEG Azide PEG 4、分子量&#xff1a;可定制&#xff0c;5000 N3-PEG-ALD、10000 叠氮-PEG…

用html做一个漂亮的网站【茶文化12页】期末网页制作 HTML+CSS网页设计实例 企业文化网站制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【仿牛客网笔记】项目进阶,构建安全高效的企业服务——Spring Security

https://spring.io/projects/spring-security 认证判断用户有没有登录。 授权 是访问有没有访问的权限 Spring MVC 的核心组件是DispatcherServlet&#xff0c;所有的组件都是交给DispatcherServlet处理&#xff0c;然后将请求分发给控制器&#xff0c;具体由某个控制器控制请求…

如何在微信上制作小程序?【制作小程序的方式】

很多人想知道如何在微信上制作小程序&#xff0c;毕竟小程序现在已经成为了我们每天都会使用到的轻应用。在微信上制作小程序之前&#xff0c;要先了解自己想要做出什么的小程序&#xff0c;才能下手开展小程序制作。那么下面就介绍三种如何在微信上制作小程序的方式。 1、懂编…

彻底搞懂SwaggerKnife4j使用方法

&#xff08;一&#xff09;、准备 1、SpringBoot项目 说明&#xff1a;前后端分离前提下&#xff0c;前端是一个独立项目&#xff0c;因此该SpringBoot无需添加Thymeleaf依赖&#xff01; 2、vo类 Employee类&#xff1a; package com.soft.vo;import java.util.Date;publ…

Hadoop与Spark的使用,HBase分布式数据库安装及操作实验

docker pull harisekhon/hbase:1.3 docker run -d --name hbase001 -p 16010:16010 harisekhon/hbase:1.3 进入环境 docker exec -it hbase001 bash hbase shell 按照一个特定的值来查找 hbase(main):003:0> scan students,{FILTER>"ValueFilter(,binary:20202…

Matplotlib教程一

文章目录一.简介二.Mapltlib的简单使用2.1 Pylot的API2.2 Pylab模块2.3 matplotlib简单绘图三.Mapltlib进阶使用3.1 面向对象思想画图3.2 Figure类3.3 Axes类3.4 画布上创建多个子图3.5 图中添加网格3.6 设置图片轴线3.7 保存图片一.简介 matplotlib是最初由John D.Hunter于20…

Shell脚本编程(一) —— 变量定义(用户自定义变量、位置变量、预定义变量、环境变量)

目录 1、用户自定义变量 2、位置变量 3、预定义变量 4、环境变量&#xff08;一次性全局变量&#xff09; 5、永久全局变量&#xff08;重启以后依然存在的变量&#xff09; (1) 本地变量文件 (2) 全局变量文件 1、用户自定义变量 定义变量&#xff1a; 变量名value …

九、propTypes验证

目标 理解类型验证的必要性 灵活掌握类型验证的使用 知识点 在给react组件传属性的的时候&#xff0c;我们可以定义属性的类型&#xff0c;此时我们需要下载prop-types这个库。 安装prop-types npm install prop-types -S引入和使用 import PropTypes from prop-types;cla…

winform语言切换C#设计笔记(八)

一、修改当前区域性 string languageName“zh-CN”; Thread.CurrentThread.CurrentUICulture new CultureInfo(languageName); 二、定义语言切换类Mullanguage或方法如下&#xff1a; private static Dictionary<string, ResourceManager> ResManagerDic new Dictionar…

【ESP32_8266_WiFi (十五)】ESP8266 OTA 操作说明

文章目录ESP8266 OTA 操作说明1 通过数据线上传初始示例程序2 通过Arduino IDE正确选择OTA端口3 认证并上传程序4 OTA的局限性ESP8266 OTA 操作说明 所谓OTA&#xff0c;就是Over-The-Air的缩写。有人将其翻译为“空中下载”&#xff0c;也有翻译为“隔空传输”。无论如何翻译…

Java高并发编程卷二(二) 锁

文章目录三 锁3.1 偏向锁3.1.1 为啥需要偏向锁&#xff1f;3.1.2 原理3.1.3 解释3.1.4 案例3.1.5 撤销与膨胀3.1.5.1 撤销3.1.5.2 膨胀3.2 轻量级锁3.2.1 为啥需要轻量级锁&#xff1f;3.2.2 原理3.2.3 案例3.2.4 分类3.2.5 膨胀3.3 重量级锁3.3.1 原理3.3.2 对象监视器详细介绍…

zookeeper学习笔记

zookeeper学习笔记1.Zookeeper概念2.Zookeeper命令操作2.1数据模型2.1.1数据结构2.1.2节点类型2.2服务端命令2.3客户端命令-基本命令2.4客户端命令-高级点命令3.Zookeeper JavaAPI操作3.1Cutor介绍3.2Cutor API常用操作-增删改查3.2.1建立连接3.2.2创建节点3.2.3删除节点3.2.4修…

js 回到顶部逻辑实现和elementUI源码解析

回到顶部 大家或多或少都会遇到“回到顶部”这样的需求&#xff0c;在此分享这个技术点以及可能遇到的问题。再分析element源码。 回到顶部代码实现 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta http-…

基于PHP+MySQL的个人博客系统毕设

随着时代和网络的发展,人们越来越希望通过多种模式来展示自己。于是个人博客就出现了,它可以更好的让人们来记录自己的工作和学习方式。博客不仅仅可以让自己抒发个人感情,还可以展示自己真实的生活,从而建立起一种友好的交友平台。 PHP个人博客系统毕设系统分为前台和后台两部…

Python每日一练 02

Python每日一练 02 文章目录Python每日一练 02一、对象二、对象属性三、赋值一、对象 Python中所有数字、序列、集合、映射、类、实例、异常、模块、类与类的实例、函数、方法、布尔值、空值等都被称为对象。 二、对象属性 每个对象都有3个基本属性&#xff1a; 类型(type)…

Flink-源算子Source(获取数据源)的使用

5.1 整体介绍 获取执行环境读取数据源定义基于数据的转换操作定义计算结果的输出位置触发程序执行 5.2 创建集成环境 5.2.1 获取执行环境 批处理getExecutionEnvironment 提交命令行设置 bin/flink run -Dexecution.runtime-modeBATCH ...代码 StreamExecutionEnvironme…

pip Command Not Found – Mac 和 Linux 错误被解决

使用Python时&#xff0c;可能需要安装和使用某些软件包。有一个命令可用于’pip‘ 使用pip&#xff0c;您可以安装、升级和卸载各种Python包。在本文中&#xff0c;您将学习如何使用它&#xff0c;以及如何处理pip错误。 如何使用 pip Pip是一个可以在Linux或Mac命令行上使用…