iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数组超详细讲解下篇扫雷
  • 461
分享到

C语言数组超详细讲解下篇扫雷

2024-04-02 19:04:59 461人浏览 独家记忆
摘要

目录前言1、扫雷是什么?2、程序框架2.1 主函数2.2 函数menu2.3 函数game2.3.1 函数init_board2.3.2 函数show_board2.3.3 函数se

前言

本文接着复习前面所学知识,以扫雷游戏为例。

1、扫雷是什么?

百度百科:《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

在这里插入图片描述

2、程序框架

程序整体的框架可以搬用上篇三子棋的,这种框架也可以当作一种通用的形式,加以运用。

2.1 主函数

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//产生随机数
	do
	{
		menu();//菜单提示
		printf("请输入 ==> ");//输入1或0,
		scanf("%d", &input);
		switch (input)//根据输入选择是否玩游戏
		{
		case 1:
			game();//玩游戏的具体实现
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;
		}
	} while (input);

	return 0;
}

2.2 函数menu

输出提示菜单,提醒玩家,1是玩游戏,0是退出游戏

void menu()
{
	printf("******************************\n");
	printf("*********  1. play    ********\n");
	printf("*********  0. exit    ********\n");
	printf("******************************\n");
}

2.3 函数game

数组mine,初始化后放入字符 ‘0’

  • mine数组后续放入10个雷,有雷的位置用字符 ‘1’ 表示,没有雷的位置仍然是字符 ‘0’
  • 10个雷的位置随机生成

数组show,初始化后放入字符 ‘*’

  • 字符 ‘*’ 是将生成雷的位置遮挡住,不让玩家看见
  • show数组放入棋盘中关于具体坐标周围的雷的信息
  • 如果坐标周围有雷,将统计雷的个数,并显示在这个坐标上
void game()
{
	printf("开始玩游戏!\n");
	//扫雷游戏的实现
	//mine数组是用来存放布置好的雷的信息
	//就10个雷在什么位置
	char mine[ROWS][COLS] = { 0 };//'0'
	//show数组是用来存放排查出的雷的信息
	//坐标周围有几个雷
	char show[ROWS][COLS] = { 0 };//'*'

	//初始化棋盘
	init_board(mine, ROWS, COLS, '0');
	init_board(show, ROWS, COLS, '*');
	//打印棋盘
	//show_board(mine, ROW, COL);//全是字符'0'
	//show_board(mine, ROW, COL);//全是'*'
	//布置雷
	set_mine(mine, ROW, COL);//雷的数组
	//show_board(mine, ROW, COL);这是显示10个雷在哪里
	show_board(show, ROW, COL);//输出*暂时掩盖雷在哪里
	//排查雷
	find_mine(mine, show, ROW, COL);
}

2.3.1 函数init_board

init_board初始化参数是将棋盘初始化,让整个棋盘显示字符 ‘0’ 和 ‘*’

//初始化棋盘    参数:行数 列数  行数 列数 字符0或* 
void init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{//set表示初始化传进来的字符是0 还是 *
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

2.3.2 函数show_board

show_board是展示棋盘的,可以看到棋盘里面雷的信息,以及后续扫雷时,棋盘的具体状态

//展示棋盘
void show_board(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("------------扫雷------------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);//列号,棋盘首先打印列数
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);//行前面的数字,行号
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);//打印棋盘每个元素
		}
		printf("\n");
	}
	printf("------------扫雷------------\n");
}

2.3.3 函数set_mine

函数set_mine是布置雷的,会在棋盘内随机在10个坐标位置产生雷

//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;//布置10个雷
	int x = 0;//行坐标
	int y = 0;//列坐标
	while (count)//直到10个雷布置完成,退出循环
	{
		x = rand() % row + 1;//取模是0-8,加1就是1-9
		y = rand() % col + 1;
		if (mine[x][y] == '0')//是空的,就放雷,否则重新随机产生坐标位置
		{
			mine[x][y] = '1';//布置雷
			count--;
		}
	}
}

2.3.4 函数find_mine

函数find_mine是排查雷,每次玩家排雷都先输入一个坐标,然后判断坐标上的字符是否为1:

  • 1为雷,游戏结束
  • 不是1,统计坐标周围8个位置雷的个数,以字符放入形式显示在坐标上
//排查雷
void find_mine(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 - EASY_COUNT)//小于雷的个数,说明雷还没排完
	{
		printf("请输入要排查的坐标 ==> ");
		scanf("%d %d", &x, &y);//玩家输入坐标
		if (x >= 1 && x <= row && y >= 1 && y <= col)//在1-9的坐标范围内
		{
			if (mine[x][y] == '1')//确定坐标为字符'1',就是雷
			{
				printf("很遗憾,被炸死了\n");
				show_board(mine, ROW, COL);//显示所有雷的位置
				break;
			}
			else//不是字符1,坐标就不是雷,显示坐标周围有雷的个数
			{
				int count = get_mine_count(mine, x, y);//函数计算类的个数
				show[x][y] = count + '0';//周围有雷的个数+'0'就转换成字符了
				show_board(show, ROW, COL);//打印出来,每次扫雷后的棋盘
				win++;//扫了一次雷就++
			}
		}
		else//超过坐标范围
		{
			printf("坐标非法,重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)//扫雷次数==9*9-10 71次就结束
	{
		printf("恭喜你,排雷成功\n");
		show_board(mine, ROW, COL);//显示雷的信息
	}
}

2.3.5 函数get_mine_count

函数get_mine_count统计雷的个数:

  • 字符 ’1‘代表有雷,字符 ’0‘代表没有, ’1‘- ’0‘为数字1,代表1个雷
  • 坐标周围8个坐标上的字符相加 - 8 * ‘0’,结果就是有雷的个数,是整形
//统计坐标周围有雷的个数
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{//坐标周围的8个地方减去'0',再相加的个数就是类的个数
	return mine[x - 1][y] +
		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] - 8 * '0';
}

3、头文件.h

#include <stdio.h>
#include <stdlib.h>//库函数
#include <time.h>//与系统时间相关

#define ROW 9//棋盘真实的行数
#define COL 9
#define ROWS ROW+2 //棋盘放大范围,便于棋盘边的位置遍历
#define COLS COL+2
#define EASY_COUNT 10 //10个雷的个数
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char set);
//打印
void show_board(char arr[ROWS][COLS], int row, int col);
//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col);

4、游戏试玩

运行结果见下图,基本满足了游戏功能。

在这里插入图片描述

完整代码放在gitee中:

扫雷完整代码

总结

本文只涉及了较为基础的扫雷游戏,等后面学习更复杂的知识后,可以对扫雷游戏进行完善。扫雷游戏整体编写思路完全可以参考三子棋来实现。

到此这篇关于C语言数组超详细讲解下篇扫雷的文章就介绍到这了,更多相关C语言 三子棋内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言数组超详细讲解下篇扫雷

本文链接: https://www.lsjlt.com/news/145894.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言数组超详细讲解下篇扫雷
    目录前言1、扫雷是什么?2、程序框架2.1 主函数2.2 函数menu2.3 函数game2.3.1 函数init_board2.3.2 函数show_board2.3.3 函数se...
    99+
    2024-04-02
  • C语言函数超详细讲解下篇
    目录前言函数的声明和定义函数声明函数定义举例简单的求和函数把加法单独改写成函数添加函数声明带头文件和函数声明静态库(.lib)的生成静态库文件的使用方法函数递归什么是递归?递归的两个...
    99+
    2024-04-02
  • C语言指针超详细讲解下篇
    目录前言指针运算指针±整数指针-指针指针的关系运算指针和数组二级指针指针数组举例 1举例 2总结前言 本文接着上一篇内容,继续学习指针相关知识点。 指针运算 指针&pl...
    99+
    2024-04-02
  • C语言操作符超详细讲解下篇
    目录前言赋值操作符单目操作符单目操作符介绍sizeof 和 数组关系操作符逻辑操作符条件操作符逗号表达式下标引用与函数调用和结构成员[ ] 下标引用操作符( ) 函数调用操作符访问一...
    99+
    2024-04-02
  • C语言函数超详细讲解上篇
    目录前言1、函数是什么?2、C语言中函数的分类2.1 库函数2.1.1 如何学会使用库函数2.1.2 自定义函数3、函数的参数3.1 实际参数(实参)3.2 形式参数(形参)4、函数...
    99+
    2024-04-02
  • C语言数组超详细讲解中篇三子棋
    目录前言1、三子棋是什么?1.1 百度百科1.2 游戏编程准备工作2. 程序实现2.1 搭建程序框架2.2 模块化编程2.2.1 源文件test.c2.2.2 源文件play.c2....
    99+
    2024-04-02
  • C语言超详细讲解排序算法下篇
    目录1、冒泡排序2、快速排序 ( 三种方法 )3、归并排序4、排序算法复杂度及稳定性分析 上期学习完了前四个排序,这期我们来学习剩下的三个排序 1、冒泡排序 &n...
    99+
    2024-04-02
  • C语言数组超详细讲解上
    目录前言1、一维数组的创建和初始化1.1 一维数组的创建1.2 一维数组的初始化1.3 一维数组的使用1.4 一维数组在内存中的存储2、二维数组的创建和初始化2.1 二维数组的创建2...
    99+
    2024-04-02
  • C语言指针超详细讲解上篇
    目录前言1、指针是什么1.1 指针变量1.2 指针是内存中一个最小单元的编号2、指针和指针类型2.1 指针±类型2.2 指针的解引用2.2.1 int* 类型的解引用2...
    99+
    2024-04-02
  • C语言超详细讲解轮转数组
    目录题目描述实例解题思路1. 先整体逆转2.逆转子数组[0, k - 1]3.逆转子数组[k, numsSize - 1]易错点代码题目描述 给你一个数组,将数组中的元素向右轮转 k...
    99+
    2024-04-02
  • C语言操作符超详细讲解上篇
    目录前言1、操作符的分类2、算术操作符3、移位操作符3.1 左移操作符3.1.1 正数左移1位3.1.2 负数左移1位3.2 右移操作符3.2.1 正数右移1位3.2.2 负数右移1...
    99+
    2024-04-02
  • C语言数据的存储超详细讲解上篇
    目录前言1、数据类型介绍类型的基本归类2、整形在内存中的存储2.1 原码、反码、补码2.2 大小端介绍2.2.1 什么是大小端2.2.2 大端和小端意义2.2.3 写程序判断字节序总...
    99+
    2024-04-02
  • C语言超详细讲解排序算法上篇
    目录1、直接插入排序2、希尔排序(缩小增量排序)3、直接选择排序4、堆排序进入正式内容之前,我们先了解下初阶常见的排序分类 :我们今天讲前四个! 1、直接插入排序 基本思...
    99+
    2024-04-02
  • C语言超详细讲解库函数
    目录1 返回整数的getchar函数2 更新顺序文件3 缓冲输出与内存分配4 库函数练习1 返回整数的getchar函数 代码: #include<stdio.h> ...
    99+
    2024-04-02
  • C语言数据的存储超详细讲解中篇练习
    目录前言数据的存储的知识点练习练习 1练习 2练习 3练习 4练习 5练习 6练习 7总结前言 本文继续学习数据在内存中存储的相关知识点。 数据存储整型提升 数据的存储的知识点练习 ...
    99+
    2024-04-02
  • C语言详细讲解通过递归实现扫雷的展开
    目录用户选择菜单棋盘初始化布置雷(随机布置)打印棋盘玩家下棋棋盘展开展开部分思维导图展开函数最后一个else return 作用周围雷个数判断用户选择菜单 void menu() {...
    99+
    2024-04-02
  • C语言数组全面详细讲解
    目录1.基础知识2.数组的分类2.1按元素类型分类2.2按维数分类3.数组定义和初始化3.1 一维数组3.2 二维数组4.数组元素的引用方法5.字符数组的定义1.基础知识 C语言中使...
    99+
    2024-04-02
  • C语言 超详细讲解链接器
    目录1 什么是链接器2 声明与定义3 命名冲突3.1 命名冲突3.2 static修饰符4 形参、实参、返回值5 检查外部类型6 头文件1 什么是链接器 典型的链接器把由编译器或汇编...
    99+
    2024-04-02
  • C语言超详细讲解线性表
    目录1. 顺序表1.1 管理结点1.2 顺序表的插入1.3 顺序表的删除1.4 顺序表的扩容2. 链表2.1 定义2.2 头部插入2.3 尾部插入2.4 任意位置插入2.5 任意位置...
    99+
    2024-04-02
  • C语言结构体超详细讲解
    目录前言1、结构体的声明1.1 结构的基础知识1.2 结构的声明1.3 结构成员的类型1.4 结构体变量的定义和初始化2、结构体成员的访问2.1 点操作符访问2.2 ->操作符...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作