广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言详细讲解通过递归实现扫雷的展开
  • 441
分享到

C语言详细讲解通过递归实现扫雷的展开

2024-04-02 19:04:59 441人浏览 薄情痞子
摘要

目录用户选择菜单棋盘初始化布置雷(随机布置)打印棋盘玩家下棋棋盘展开展开部分思维导图展开函数最后一个else return 作用周围雷个数判断用户选择菜单 void menu() {

用户选择菜单

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

用户按1进入游戏

棋盘初始化

void Itnboard(char board[ROWS][COLS], int rows, int cols,char c)
{
	int i, j;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j <cols; j++)
		{
			board[i][j] = c;
		}
	}
}

创建数组,并对其进行初始化

布置雷(随机布置)

void Setboard(char board[ROWS][COLS], int row, int col)
{
	int count = Easy_count;
	while (count)
	{
		int x = rand() % row+1;
		int y = rand() % col+1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

用time函数产生随机值

打印棋盘

void Displayboard(char board[ROWS][COLS], int row, int col)
{
	int i, j;
	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 ", board[i][j]);
		}
		printf("\n");
	}
}

打印棋盘

玩家下棋

void Player(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x, y;
	int count = 0;
	while (1)
	{
		printf("请排雷:\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
		{
			if (board[x][y] == '0')
			{
				Openboard(show, board, x, y);
				Displayboard(show, ROW, COL);
			}
			else if (board[x][y] == '1')
			{
				printf("你死了\n");
				break;
			}
		}
		else
		{
			printf("请重新输入");
		}
		int i, j;
		for (i = 1; i <= row; i++)
		{
			for (j = 1; j <= col; j++)
			{
				if (show[i][j] == '*')
				{
					count++;
				}
			}
		}
		if (count == Easy_count)
		{
			printf("成功\n");   //这里的判断条件是遍历整个数组,统计雷的个数,如果雷的个数等于所剩余未排的*,说明排雷成功
			break;
		}
	}
}

用户输入值,并进行判断,如果该位置没有雷,我们进入展开函数

棋盘展开

void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col)
{
	if (row >= 1 && row <= ROW && col >= 1 && col <= COL)
	{
		int count=sum(board, row, col);
		if (count != 0)
		{
			show[row][col] = count + '0';
		}
		else if (show[row][col] != '_')
		{
			show[row][col] = '_';
			int i = 0, j = 0;
			for (i = row - 1; i <= row + 1; i++)
			{
				for (j = col - 1; j <= col + 1; j++)
				{
					Openboard(show, board, i,j);
				}
			}
		}
		else
		{
			return;
		}
	}
}

如果用户输入的这个位置没有雷,我们对其周围8个位置进行判断是否有雷,若有雷,我们把雷的个数显示在该位置上,若其周围8个位置没有雷并且不是下划线,我们把这个位置赋值为下划线,然后并对其8个位置进行同样的判断,如果周围没雷,而且周围的棋子也不是下划线,我们对其进行返回。

展开部分思维导图

展开函数最后一个else return 作用

这里我们show棋盘有三种情况,

1.该位置是*

2.该位置是下划线

3.该位置是雷的个数

else

return;

这里是作用:如果是下划线,我们就返回上一层函数。因为如果这里不是下划线,我们会在else return 之前的语句中进行判断,并对其周围8个位置进行操作,然后再对这8个棋子各个周围8个位置进行判断并操作,如果这里是下划线,就说明由这个位置为中心的周围8个棋子已经判断过了,并且以这8个位置为中心,已经递归过了,我们不需要再进行判断,所以直接返回就行

周围雷个数判断

int sum(char board[ROWS][COLS], int x, int y)
{
	return (board[x - 1][y - 1] +
		board[x - 1][y] +
		board[x - 1][y + 1] +
		board[x][y - 1] +
		board[x][y + 1] +
		board[x + 1][y - 1] +
		board[x + 1][y] +
		board[x + 1][y + 1] - 8 * '0');
}

test.c

#include"game.h"
void menu()
{
	printf("****************************\n");
	printf("********  1.play  **********\n");
	printf("********  0.exit  **********\n");
	printf("****************************\n");
}
void game()
{
	char board[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	Itnboard(board, ROWS, COLS,'0');  //初始化棋盘
	Itnboard(show, ROWS, COLS, '*');
	Setboard(board, ROW, COL);   
	Displayboard(board, ROW, COL);
	Player(board, show, ROW, COL);            //玩家输入
}
int main()
{
	int input=1;
  srand((unsigned int)time(NULL));
	do{
		menu();
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		game();
		break;
	case 0:
		break;
	default:
		printf("输入错误请重新输入:\n ");
	}
	} while (input);
}

game.c

#include"game.h"
void Itnboard(char board[ROWS][COLS], int rows, int cols,char c)
{
	int i, j;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j <cols; j++)
		{
			board[i][j] = c;
		}
	}
}
void Displayboard(char board[ROWS][COLS], int row, int col)
{
	int i, j;
	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 ", board[i][j]);
		}
		printf("\n");
	}
}
void Setboard(char board[ROWS][COLS], int row, int col)
{
	int count = Easy_count;
	while (count)
	{
		int x = rand() % row+1;
		int y = rand() % col+1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}
int sum(char board[ROWS][COLS], int x, int y)
{
 
	return (board[x - 1][y - 1] +
		board[x - 1][y] +
		board[x - 1][y + 1] +
		board[x][y - 1] +
		board[x][y + 1] +
		board[x + 1][y - 1] +
		board[x + 1][y] +
		board[x + 1][y + 1] - 8 * '0');
}
void Player(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x, y;
	int count = 0;
	while (1)
	{
		printf("请排雷:\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
		{
			if (board[x][y] == '0')
			{
				Openboard(show, board, x, y);
				Displayboard(show, ROW, COL);
			}
			else if (board[x][y] == '1')
			{
				printf("你死了\n");
				break;
			}
		}
		else
		{
			printf("请重新输入");
		}
		int i, j;
		for (i = 1; i <= row; i++)
		{
			for (j = 1; j <= col; j++)
			{
				if (show[i][j] == '*')
				{
					count++;
				}
			}
		}
		if (count == Easy_count)
		{
			printf("成功\n");
			break;
		}
	}
}
void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col)
{
 
	if (row >= 1 && row <= ROW && col >= 1 && col <= COL)
	{
		int count=sum(board, row, col);
		if (count != 0)
		{
			show[row][col] = count + '0';
		}
		else if (show[row][col] != '_')
		{
			show[row][col] = '_';
			int i = 0, j = 0;
			for (i = row - 1; i <= row + 1; i++)
			{
				for (j = col - 1; j <= col + 1; j++)
				{
					
					Openboard(show, board, i,j);
				}
			}
		}
		else
		{
			return;
		}
	}
}

game.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
void Itnboard(char board[ROWS][COLS], int rows, int cols,char c);
void Displayboard(char board[ROWS][COLS], int row, int col);
void Setboard(char board[ROWS][COLS], int row, int col);
void Player(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col);
void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col);

到此这篇关于C语言详细讲解通过递归实现扫雷的展开的文章就介绍到这了,更多相关C语言扫雷内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言详细讲解通过递归实现扫雷的展开

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

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

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

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

下载Word文档
猜你喜欢
  • C语言详细讲解通过递归实现扫雷的展开
    目录用户选择菜单棋盘初始化布置雷(随机布置)打印棋盘玩家下棋棋盘展开展开部分思维导图展开函数最后一个else return 作用周围雷个数判断用户选择菜单 void menu() {...
    99+
    2022-11-13
  • C语言怎么通过递归实现扫雷游戏
    这篇“C语言怎么通过递归实现扫雷游戏”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言怎么通过递归实现扫雷游戏”文章吧。用...
    99+
    2023-06-30
  • C语言实现爆炸展开的扫雷详解
    目录游戏介绍游戏功能实现1.主菜单:2.初始化雷盘3.打印雷盘4.布置雷5.玩家开始排查雷6.小菜单7.排查位置周围的八个坐标有几个雷8.使用递归爆炸式展开9.标记功能10.取消标记...
    99+
    2022-11-13
  • 详解C语言通过递归与非递归实现蛇形矩阵
    前言: 本次蛇形矩阵我将以两种方法来实现,即非递归和递归 非递归的实现: #define right 1 #define down 2 #define left 3 #defin...
    99+
    2022-11-13
  • C语言实现经典扫雷小游戏完整代码(递归展开 + 选择标记)
    目录游戏介绍游戏整体框架游戏具体功能及实现1、雷盘的定义2、雷盘的初始化3、布置雷4、排查雷5、递归式展开一片6、获取周围雷的个数7、标记特定位置8、打印雷盘游戏完整代码 ...
    99+
    2022-11-13
  • 利用C语言实现一个可展开的扫雷小游戏
    利用C语言实现一个可展开的扫雷小游戏?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语...
    99+
    2023-06-06
  • C语言并查集的非递归实现详解
    目录【算法分析】【算法代码】并查集压缩路径非递归写法参考文章总结【算法分析】 经典的递归实现的并查集,在数据规模过大时,可能会爆栈,因此有了并查集的非递归实现。核心代码如下: i...
    99+
    2022-11-12
  • C语言递归实现字符串逆序的方式详解
    C语言实现字符串逆序,具体内容如下所示: 一、迭代的方式实现 贴上代码:迭代的方式实现 '//字符串逆序:不可用字符串操作函数' #include <stdio.h&g...
    99+
    2022-11-12
  • C语言超详细讲解栈的实现及代码
    目录前言栈的概念栈的结构栈的实现创建栈结构初始化栈销毁栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空总代码Stack.h 文件Stack.c 文件Test.c 文件前言 栈...
    99+
    2022-11-13
  • C语言详细讲解strcpystrcatstrcmp函数的模拟实现
    目录一、模拟实现strcpy函数二、模拟实现strcat函数三、模拟实现strcmp函数四、小结一、模拟实现strcpy函数 strcpy函数是字符串拷贝函数,就是将源字符串拷贝到目...
    99+
    2022-11-13
  • C语言超详细讲解队列的实现及代码
    目录前言队列的概念队列的结构队列的应用场景队列的实现创建队列结构队列初始化  队列销毁  入队列  出队列  队列判空  获取队列元...
    99+
    2022-11-13
  • C语言超详细讲解猜数字游戏的实现
    目录rand函数srand函数时间戳完整代码与程序运行图rand函数 先看一下下面这张图: 通过这张图我们可以了解到rand函数的返回值是int类型,形参为空,它的头文件<s...
    99+
    2022-11-13
  • C++二叉树的前序中序后序非递归实现方法详细讲解
    目录二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历总结二叉树的前序遍历 前序遍历的顺序是根、左、右。任何一颗树都可以认为分为左路节点,左路节点的右子树。先访问左路节点,再来访问左路...
    99+
    2023-03-08
    C++二叉树的非递归实现 C++二叉树的前序中序后序非递归实现
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作