扫雷游戏小程序

news2024/11/17 13:51:00

目录

一.文件

1.头文件

2.源文件

二.游戏界面和执行(test.c)

三.函数实现(void game部分,源文件game.c)

1.定义雷二维数组和展示二维数组

2.初始化地雷数组

3.初始化显示的数组

4.显示当前的情况

5.随机放置地雷

6.排雷

ps:深度优先遍历数组

四.结束


一.文件

1.头文件

game.h

用于存放所有源文件需要用的标准库头文件函数的声明。(便于查找和让代码更简洁)

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define COLS COL+2
#define ROWS ROW+2
#define ALLMINE 10
void InitBoard(char board[ROWS][COLS],int row,int col,char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void SetMine(char board[ROWS][COLS], int row, int col);
void FineMine(char mine[ROWS][COLS],char board[ROWS][COLS], int row, int col);

ROW和COL扫雷的行和列,也就是面积

ROWS和ROWS行和列加2,加2是因为我们后面需要统计每个格子四周的8个格子一共含有的雷数,为了避免越界问题,特地+2,左右上下各加一行或者一列嘛。

ALLMINEE所有的雷一共10个

InitBoard,DisplayBoard,SetMine,FineMine为后面需要用到的函数的声明

2.源文件

game.c

test.c

game.c用来写所有自定义函数的代码

test.c用来写游戏界面的执行入口游戏函数执行顺序

如图:

二.游戏界面和执行(test.c)

注意:记得加上自定义头文件game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu() {
	printf("********************************\n");
	printf("********   1.开始游戏   ********\n");
	printf("********   0.退出游戏   ********\n");
	printf("********************************\n");
}
void game() {
	int mine[ROWS][COLS];
	int show[ROWS][COLS];
	InitBoard(mine,ROWS,COLS,'0');//初始化地雷数组
	InitBoard(show, ROWS, COLS,'*');//初始化显示的数组
	DisplayBoard(show,ROW,COL);//显示当前的情况
	/*DisplayBoard(mine, ROW, COL);*/
	SetMine(mine,ROW,COL);//放置地雷,随机
	/*DisplayBoard(mine, ROW, COL);*/
	FineMine(mine,show, ROW, COL);//排雷
}
int main() {
	menu();
	int input = 0;
	srand((unsigned int)time(NULL));//需要标准库头文件stdlib.h和time.h
	do {
		printf("请输入1或0:>\n");
		scanf("%d", &input);
		switch (input) {
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
		}
	} while (input);
	return 0;
}

解释:

1.游戏的进入与退出我们使用do while循环先执行一遍再根据输入的数判断是否再次决定游戏的进入与退出

2.至于srand()函数,void srand(unsigned int seed);是他的原型,srand 函数用于设置随机数生成器的种子。这个种子值决定了 rand 函数(后面会讲到)生成的随机数序列(如果种子为固定值,则随机的数也是固定值)。通常在调用 rand 之前调用 srand,并传入一个无符号整数作为种子值。这里我们使用时间作为种子,因为时间是一直在流逝的嘛,所以其总能够生成随机数。

3.game()函数也就是后面会讲的game.c。

效果如下图:

三.函数实现(void game部分,源文件game.c)

注意:记得加上自定义头文件game.h

1.定义二维数组和展示二维数组

2.初始化地雷数组

给每个格子都初始化为0

void InitBoard(char board[ROWS][COLS], int row, int col,char set){//InitBoard(mine,ROWS,COLS,'0');
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			board[i][j] = set;
		}
		
	}
}

3.初始化显示的数组

注意和初始化地雷数组的区别,这个传入的 实参为show,上面那个传入的是mine

给每个格子初始化为' * '

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char board[ROWS][COLS], int row, int col,char set){//InitBoard(show, ROWS, COLS,'*');
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			board[i][j] = set;
		}
		
	}
}

4.显示当前的情况

注意这里的row和col为ROW,COL,而不是ROWS,COLS,我们显示的话只显示9*9的面积就可以了

上面那两个初始化则就是ROWS,COLS,

void DisplayBoard(char board[ROWS][COLS], int row, int col) {//DisplayBoard(show,ROW,COL);
	for (int i = 0; i <= row; i++) {
		printf("%d ", i);//给列显示坐标
	}
	printf("\n");
	for (int i = 1; i <= row; i++) {
		printf("%d ", i);//给行显示坐标
		for (int j = 1; j <= col; j++) {
			
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

效果如图:

5.随机放置地雷

void SetMine(char board[ROWS][COLS], int row, int col) {//SetMine(mine,ROW,COL);
	int n = ALLMINE;//前面在头文件定义了ALLMINE为10,也就是雷的个数
	while (n) {
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '1') {
			continue;
		}//避免了在同一个坐标放置雷
		else {
			board[x][y] = 1 + '0';
			n--;//放好雷之后才n--
		}
	}
}

解释:

1.

rand

rand 函数用于生成一个伪随机数。该函数不需要参数,返回一个在 0RAND_MAX 之间整数(包括 0RAND_MAX)。RAND_MAX 是一个常量,定义在 <stdlib.h> 中,通常是 32767,但这取决于具体的实现。

srand

srand 函数用于设置随机数生成器的种子。这个种子值决定了 rand 函数生成的随机数序列。通常在调用 rand 之前调用 srand,并传入一个无符号整数作为种子值

2.

int x = rand() % row + 1;

int y = rand() % col + 1;

因为row和col都是9,所以我们让这个随机数上一个9,得到的数的范围一定是0~8,此时我们再让他+1,那他的范围就是1~9了,就符合我们的坐标条件了

6.排雷

代码如下:

void FineMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col) {;
	//FineMine(mine,show, ROW, COL);
    int x;
	int y;//x,y为你要排查的坐标,输入
	int count = 0;//你排查了的坐标的个数
	while (1) {//一直循环排雷,直到排到雷,或者是成功通关就结束循环
		printf("请输入你要排查的坐标:>");
		scanf("%d", &x);
		scanf("%d", &y);
		if (mine[x][y] != '1') {
			
			if (show[x][y] = '*') {//
				dfs(mine, show, x, y);//深度优先遍历
				DisplayBoard(show, ROW, COL);//每排查一个坐标就接着显示面板
				count++;//排查了的坐标++
			}
			else
				printf("该坐标已经被占用,请重新输入:>");//如果不为'*'意味着已经排查过这个坐标了
		}
		else {
			printf("很不幸,你被炸死了\n");
			DisplayBoard(mine, ROW, COL);//炸死后显示所有雷的位置
			break;
		}
		if (count == row * col - ALLMINE+1) {
			printf("恭喜你,成功通关了!\n");
			break;
		}
	}
}

至于dfs()函数后面讲

效果如图:

ps:深度优先遍历数组

当然目的就是让其每输入一个坐标都有可能展开一片的操作,极大地减少了工作量。

写这个代码前建议大家刷一下力扣的这道题:

. - 力扣(LeetCode)

代码如下:

上面有注释

void dfs(char mine[ROWS][COLS], char show[ROWS][COLS], int a, int b) {
    //dfs(mine, show, x, y);
	int dx[8] = { -1,-1,-1,0,0,1,1,1 };//每个x都对应着其相同下标的y
	int dy[8] = { -1,0,1,-1,1,-1,0,1 };//输入的x和y所在位置的周围八个位置
	int count = 0;//用来记录(a,b)周围雷的个数
	for (int i = 0; i < 8; i++) {
		int r = a + dx[i];
		int c = b + dy[i];//定位到xy周围的位置
		if (r >= 1 &&r<=9&& c >= 1&&c<=9 && mine[r][c] =='1') {//r >= 1 &&r<=9&& c >= 1&&c<=9这一坨就是判断有没有越界
			count++;//该位置是雷的话,就count++
		}
	}
	if (count == 0) {//周围八个位置没有雷
		show[a][b] = '0';
		for (int i = 0; i < 8; i++) {//在这没有雷的位置扩散开来,直到找到其周围有雷的为止
			int r = a + dx[i];
			int c = b + dy[i];
			if (r >= 1 && r <= 9 && c >= 1 && c <= 9 && show[r][c] == '*') {
             //注意show[r][c] == '*'这个条件,不要遍历到重复的已经遍历过的
				dfs(mine, show, r, c);//从这个坐标开始扩散
			}

		}
	}

效果如图:

可以看到边界都显示有雷的!

四.结束

一键三连哦,感谢大家的阅读!

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

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

相关文章

基于图卷积神经网络(GCN)的高光谱图像分类详细教程(含python代码)

目录 一、背景 二、基于卷积神经网络的代码实现 1、安装依赖库 2、建立图卷积神经网络 3、建立数据的边 4、训练模型 5、可视化 三、项目代码 一、背景 图卷积神经网络&#xff08;Graph Convolutional Networks, GCNs&#xff09;在高光谱图像分类中是一种有效的方法…

Unity + Hybridclr + Addressable + 微信小程序 热更新报错

报错时机&#xff1a; Generate All 怎么All 死活就是报错 生成微信小程序&#xff0c;并启动后 报错内容&#xff1a; MissingMethodException:AoT generic method notinstantiated in aot.assembly:Unity.ResourceManager:dll, 原因&#xff1a; Hybridclr 开发文档 解…

【人工智能】深度剖析:Midjourney与Stable Diffusion的全面对比

文章目录 &#x1f34a;1 如何选择合适的AI绘画工具1.1 个人需求选择1.2 比较工具特点1.3 社区和资源 &#x1f34a;2 Midjourney VS Stable Diffusion&#xff1a;深度对比与剖析 2.1 使用费用对比 2.2 使用便捷性与系统兼容性对比 2.3 开源与闭源对比 2.4 图片质量对比 2.5 上…

MATLAB基础应用精讲-【数模应用】Poisson 回归分析(附R语言代码实现)

目录 前言 知识储备 基于泊松回归、负二项回归模型 数据分布介绍 模型介绍 模型的选择 案例介绍 算法原理 泊松回归 数学模型 适用条件 参数估计与假设检验 SPSSAU Poisson 回归案例 1、背景 2、理论 3、操作 4、SPSSAU输出结果 5、文字分析 6、剖析 疑难解…

【探索Linux】P.42(传输层 —— TCP面向字节流 | TCP粘包问题 | TCP异常情况 )

阅读导航 引言一、TCP面向字节流二、TCP粘包问题1. 粘包原因2. 粘包类型3. 粘包的影响4. 解决粘包的方法5. 对于UDP协议来说, 是否也存在 "粘包问题" 呢? 三、TCP异常情况温馨提示 引言 继上篇深入剖析TCP协议的拥塞控制、延迟应答和捎带应答之后&#xff0c;本文将…

TCP 协议的 time_wait 超时时间

优质博文&#xff1a;IT-BLOG-CN 灵感来源 Time_Wait 产生的时机 TCP四次挥手的流程 如上所知&#xff1a;客户端在收到服务端第三次FIN挥手后&#xff0c;就会进入TIME_WAIT状态&#xff0c;开启时长为2MSL的定时器。 【1】MSL是Maximum Segment Lifetime报文最大生存时间…

【六】集群管理工具

1. 群控命令 查看java程序的运行状态是最常用的指令。首先在ubuntu1输入该find命令&#xff0c;查找jps位置&#xff0c;需要首先完成java jdk的安装和配置。 find / -name jps回显如下&#xff0c;jps的位置确定了。rootubuntu1:/usr/local/bin# find / -name jps /usr/loca…

C语言 | Leetcode C语言题解之第300题最长递增子序列

题目&#xff1a; 题解&#xff1a; int lengthOfLIS(int* nums, int numsSize) {if(numsSize<1)return numsSize;int dp[numsSize],result1;for(int i0;i<numsSize;i){dp[i]1;}for(int i0;i<numsSize;i){printf("%d ",dp[i]);}for(int i1;i<numsSize;i…

科普文:万字详解Kafka基本原理和应用

一、Kafka 简介 1. 消息引擎系统ABC Apache Kafka是一款开源的消息引擎系统&#xff0c;也是一个分布式流处理平台。除此之外&#xff0c;Kafka还能够被用作分布式存储系统&#xff08;极少&#xff09;。 A. 常见的两种消息引擎系统传输协议&#xff08;即用什么方式把消息…

git 、shell脚本

git 文件版本控制 安装git yum -y install git 创建仓库 将文件提交到暂存 git add . #将暂存区域的文件提交仓库 git commit -m "说明" #推送到远程仓库 git push #获取远程仓库的更新 git pull #克隆远程仓库 git clone #分支&#xff0c;提高代码的灵活性 #检查分…

模板-树上点差分

题目链接&#xff1a;松鼠的新家 图解&#xff1a; 模板&#xff1a; #include <bits/stdc.h> #define int long long using namespace std; const int inf 0x3f3f3f3f3f3f3f3f; const int N 3e55; int n; vector<int>g[N]; int d[N],fa[N][35],dep[N]; int a[…

Java | Leetcode Java题解之第301题删除无效的括号

题目&#xff1a; 题解&#xff1a; class Solution {public List<String> removeInvalidParentheses(String s) {int lremove 0;int rremove 0;List<Integer> left new ArrayList<Integer>();List<Integer> right new ArrayList<Integer>(…

DS1302时钟芯片全解析——概况,性能,MCU连接,样例代码

DS1302概述&#xff1a; 数据&#xff1a; DS1302是一个可充电实时时钟芯片&#xff0c;包含时钟&#xff08;24小时格式或12小时格式&#xff09;、日历&#xff08;年&#xff0c;月&#xff0c;日&#xff0c;星期&#xff09;、31字节RAM&#xff08;断电数据丢失&#x…

【Test】 Qt 多元素控件

文章目录 1. Qt 中的多元素控件2. QListWidget 1. Qt 中的多元素控件 xxWidget 和 xxView之间的区别 2. QListWidget 小案例&#xff1a;实现下图

WSL快速入门

1. WSL介绍 WSL文档地址&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl WSL&#xff1a;全称 Windows Subsystem for Linux&#xff0c;即windows上的Linux子系统&#xff08;虚拟机工具&#xff09;。是Win10推出的全新特性&#xff0c;可以更轻量地在Windows系统…

R语言统计分析——整合和重构

参考资料&#xff1a;R语言实战【第2版】 R中提供了许多用来整合&#xff08;aggregate&#xff09;和重塑&#xff08;reshape&#xff09;数据的强大方法。在整合数据时&#xff0c;往往将多组观测替换为根据这些观测计算的描述性统计量。在重塑数据时&#xff0c;则会通过修…

【Unity插件】Editor Console Pro:提升开发效率的神器

在 Unity 开发过程中&#xff0c;控制台&#xff08;Console&#xff09;是我们排查错误、获取信息的重要窗口。而 Editor Console Pro 则是 Unity 编辑器控制台的强大替代品&#xff0c;为 Unity 的控制台带来了更多实用的功能和改进&#xff0c;极大地提升了开发效率。 一、…

[硬件]-电路噪声

电路噪声 1.电路噪声来源 本征噪声&#xff1a;晶体管、电阻&#xff1b;外部噪声&#xff1a;电源、参考、偏置、衬底、串扰&#xff1b; 将电路的输入短接&#xff0c;理想情况下输出为0&#xff0c;但实际输出不为0&#xff0c;即为电路噪声。 2.噪声大小衡量方法 2.1 时…

【Oracle 进阶之路】Oracle 简介

一、简述 Oracle Database&#xff0c;又名Oracle RDBMS&#xff0c;或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的关系数据库管理系统&#xff0c;系统可移植性好、使用方便、功能强&…

初学Mybatis之多对一查询 association 和一对多查询 collection

XML 映射器 多对一&#xff1a;关联&#xff08;association&#xff09; 一对多&#xff1a;集合&#xff08;collection&#xff09; mysql 创建教师、学生表&#xff0c;插入数据 create table teacher(id int(10) primary key,name varchar(30) default null ) engineI…