首页 > 其他分享 >扫雷游戏(C语言)(可实现安全区域展开)

扫雷游戏(C语言)(可实现安全区域展开)

时间:2023-08-13 18:32:03浏览次数:46  
标签:info arr 游戏 int mine C语言 扫雷 坐标 地雷

题目描述:

      基于经典的扫雷游戏进行模拟,以二维数组模拟扫雷游戏的棋盘,棋盘规格为9*9,随机设置10颗地雷,输入坐标进行排雷,如果踩到地雷则输出相关信息”BOOM被炸死了QAQ“,本次游戏结束。若未踩中地雷,则输出提示信息,即以该坐标为中心其周围相邻的上、下、左、右、左上,右上,右下,左下八个方向共有多少颗地雷,根据提示信息继续排雷,递归实现安全区域展开,直至踩中地雷或者排出所有地雷,本次游戏结束。

扫雷游戏(C语言)(可实现安全区域展开)_递归

实现逻辑:

  • 初始化扫雷棋盘。
  • 在棋盘1上随机坐标设置地雷。
  • 棋盘2用作提示信息棋盘,本坐标处的值即以该坐标为中心其周围相邻的上、下、左、右、左上,右上,右下,左下八个方向共有多少颗地雷。
  • 玩家输入坐标进行排雷。
  • 递归实现周围无地雷区域大片展开功能。

一、游戏主界面

1.1 游戏界面显示

void menu()
{
	printf("*************************************\n");
	printf("************** 扫雷游戏 *************\n");
	printf("*************************************\n");
	printf("************** 1.PLAY ***************\n");
	printf("************** 0.EXIT ***************\n");
	printf("*************************************\n");
}

二、游戏开始准备

2.1 棋盘初始化和地雷设置

       游戏开始前要初始化地雷棋盘,棋盘1用于设置地雷信息,利用相关函数产生十个随即坐标设置地雷,’1‘表示当前坐标放置地雷,’0‘表示当前坐标不放置地雷,棋盘2用于为玩家提示当前坐标周围地雷个数信息。

//棋盘初始化
	//初始化
	init(mine_info,ROWS,COLS,  '0');
	init(mine_check, ROWS, COLS, '*');
void init(char arr[ROWS][COLS], int row, int col, char c)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = c;

		}
	}
}

  利用rand()函数、srand()函数产生十个随即坐标设置地雷。

void set_mine(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	int cnt = easy_mode_cnt;
	while (cnt)
	{
		int x = rand() % 9 + 1;//取余限定产生坐标范围
		int y = rand() % 9 + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			cnt--;
		}
	}
}

三、玩家扫雷

输入坐标扫雷,利用mine_check[]数组提示玩家坐标地雷信息。

void scan_mine(char mine_info[ROWS][COLS], char mine_check[ROWS][COLS])
{
	int st = 0;
	int x = 0, y = 0;
	while (st<step)
	{
		printf("输入排雷坐标\n");
		scanf("%d%d", &x, &y);
		if (x<1 || x>ROW || y<1 || y>COL)
			printf("坐标无效,请重新输入\n");
		else
		{
			if (mine_info[x][y] == '1')
			{
				printf("BOOM!,很不幸,被炸死了QAQ\n");
				break;
			}
			else if (mine_info[x][y] == '0'&&mine_check[x][y]=='*')
			{
				st += spread_(mine_info, mine_check, x, y);
				show(mine_check, ROW, COL);	
			}
		}
	}
	if (st == step)
		printf("扫雷成功!GOOD!\n");
}

计算当前坐标与当前坐标相邻的九个坐标上的全部地雷数。

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

安全区域展开:涉及到了递归的相关知识。

如果当前坐标上没有放置地雷,且其周围八个方向坐标上全部地雷数为0,则本坐标在棋盘2上的值设置为’ ‘,即代表安全区域,递归搜索当前坐标相邻的八个方向的坐标,如果count_mine(int,int)的值不为零则搜索下一个方向坐标,直至不满足条件递归结束。

int spread_(char mine_info[ROWS][COLS], char mine_check[ROWS][COLS], int x, int y)
{
	int st = 0;
	if (count_mine(mine_info,x,y) == 0&&x>0&&y>0&&y<=9&&x<=9)
	{
		mine_check[x][y] = ' ';
		st++;
		if (mine_check[x - 1][y - 1] == '*' && mine_info[x - 1][y - 1] == '0')
			 st+=spread_(mine_info, mine_check, x - 1, y - 1);
		if (mine_check[x - 1][y] == '*' && mine_info[x - 1][y] == '0')
			st += spread_(mine_info, mine_check, x - 1, y);
		if (mine_check[x - 1][y + 1] == '*' && mine_info[x - 1][y + 1] == '0')
			st += spread_(mine_info, mine_check, x - 1, y + 1);
		if (mine_check[x][y + 1] == '*' && mine_info[x][y+1] == '0')
			st += spread_(mine_info, mine_check, x, y + 1);
		if (mine_check[x + 1][y + 1] == '*' && mine_info[x + 1][y + 1] == '0')
			st += spread_(mine_info, mine_check, x + 1, y + 1);
		if (mine_check[x + 1][y] == '*' && mine_info[x + 1][y] == '0')
			st += spread_(mine_info, mine_check, x + 1, y);
		if (mine_check[x + 1][y - 1] == '*' && mine_info[x + 1][y - 1] == '0')
			st += spread_(mine_info, mine_check, x + 1, y - 1);
		if (mine_check[x][y - 1] == '*' && mine_info[x][y - 1] == '0')
			st += spread_(mine_info, mine_check, x, y - 1);
		return st;
	}
	else if(x > 0 && y > 0 && y <= 9 && x <= 9)
	{
		mine_check[x][y] = count_mine(mine_info, x, y) + '0';
		st++;
		return st;
	}
	else
	{
		return 0;
	}
}

四、游戏整体逻辑

void play()
{
	//初始化
	init(mine_info,ROWS,COLS,  '0');
	init(mine_check, ROWS, COLS, '*');
	//展示
	//show(mine_info, ROW, COL);
	show(mine_check, ROW, COL);
	//设置地雷
	set_mine(mine_info, ROW, COL);
	//show(mine_info, ROW, COL);
	//排雷
	scan_mine(mine_info, mine_check);

}

运行测试:

扫雷游戏(C语言)(可实现安全区域展开)_递归_02

扫雷游戏(C语言)(可实现安全区域展开)_初始化_03

扫雷游戏(C语言)(可实现安全区域展开)_提示信息_04

......

扫雷游戏(C语言)(可实现安全区域展开)_提示信息_05

(安全区域大片展开)--递归实现

扫雷游戏(C语言)(可实现安全区域展开)_提示信息_06

......

扫雷游戏(C语言)(可实现安全区域展开)_提示信息_07

源码链接:扫雷(可实现安全区域展开) · 70aa3fa · qpy/C初阶 - Gitee.com

标签:info,arr,游戏,int,mine,C语言,扫雷,坐标,地雷
From: https://blog.51cto.com/u_16191221/7068774

相关文章

  • C语言中的排序算法及其实现方法
    C语言中的排序算法及其实现方法排序算法是计算机科学中的重要部分,它们在数据处理和算法设计中起着关键作用。在C语言编程开发中,掌握不同的排序算法及其实现方法对于提高代码质量和性能至关重要。本文将围绕C语言中的排序算法展开讨论,介绍几种常见的排序算法及其实现方法。1C语言......
  • 如何在C语言中进行日期和时间处理
    如何在C语言中进行日期和时间处理日期和时间处理在许多软件和应用程序中都是非常重要的功能。无论是计算两个日期之间的天数,还是计算某个日期是星期几,C语言提供了丰富的库函数和功能来满足这些需求。本文将介绍如何在C语言中进行日期和时间处理。18如何在C语言中进行日期和时间......
  • 如何在C语言中进行图形界面编程
    在C语言中进行图形界面编程是一项非常有挑战性和有趣的任务。虽然C语言主要用于系统级编程和算法开发,但我们仍然可以使用一些库来实现简单的图形界面。在本文中,我将介绍一种在C语言中进行图形界面编程的方法。首先,让我们来了解一下几个常用的图形库,它们可以帮助我们在C语言中创建......
  • C语言中如何进行动态内存分配和释放
    动态内存分配和释放是C语言中非常重要的概念,它允许在程序运行时动态地申请和释放内存空间,提高程序的灵活性和效率。本文将围绕这一主题,详细介绍C语言中如何进行动态内存分配和释放。在C语言中,动态内存分配和释放主要通过malloc()和free()函数实现。malloc()函数用于申请一块指定......
  • C语言编程教程:如何提取手机尾数
    C语言编程教程:如何提取手机尾数在C语言编程中,我们经常需要处理各种数据类型和操作。今天,我们将分享一个有趣且实用的主题:如何提取手机尾数。手机尾数是手机号码中的最后几位数字,提取这些数字可以为我们的程序带来更多可能性。在本文中,我们将介绍一种简洁而有效的方法,帮助你轻松提......
  • 使用C语言编写文件读写工具
    使用C语言编写文件读写工具在现代软件开发中,文件读写是一个非常常见且重要的操作。通过使用C语言编程,我们可以轻松地实现文件的读取和写入。本文将介绍如何使用C语言编写文件读写工具,以及一些相关的注意事项。2使用C语言编写文件读写工具首先,我们需要包含头文件stdio.h,这个头文......
  • 利用C语言实现简单的计算器程序
    利用C语言实现简单的计算器程序在日常生活中,计算器是一个不可或缺的工具。它可以帮助我们进行各种数学计算,从简单的加减乘除到复杂的三角函数和指数运算。而使用C语言编写一个简单的计算器程序,则是一个很有挑战性和有趣的任务。1利用C语言实现简单的计算器程序首先,我们需要明确......
  • c语言笔记2
    c语言笔记2(关键字,数据类型,运算符,流程控制语句)1.c语言中的关键字学习关键字的目的是了解存在哪些关键字,另外,在定义变量名、函数名(标识符命名)避免使用关键字1.1数据类型相关的关键字char字符类型,占1个字节,ASCII表有128字符,每个字符占1个字节。short短整型,占2个字节i......
  • Linux下C语言调用libcurl库获取天气预报信息
    一、概述当前文章介绍如何在Linux(Ubuntu)下使用C语言调用libcurl库获取天气预报的方法。通过HTTPGET请求访问百度天气API,并解析返回的JSON数据,可以获取指定城市未来7天的天气预报信息。二、设计思路【1】使用libcurl库进行HTTPGET请求在代码中包含<curl/curl.h>头文件,以便使用libc......
  • 萌新学习c语言记录
    这几天学了~等的符号使用还有如1>>2这种移动(二进制)方式(应该可以这么说)这几天学习的东西都是一点新东西和一部分复习之前学习的东西而且新东西有点难还有不用第三个变量来交换另外两个变量的方式(但这种方式运行的时候有些缓慢)如inta=3;intb=5;a=a^b;b=a^b;a=a^b;这样就可以了但......