C++实现扫雷游戏示例讲解

 更新时间:2020年08月03日 14:46:16   作者:叁三山雨  
这篇文章主要介绍了C++实现扫雷游戏示例讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

C/C++实现扫雷小游戏

源代码:

github:https://github.com/KamSss/C-Practice/tree/master/Minesweeper扫雷小游戏/Minesweeper扫雷

总体构造:

a.简易的游戏菜单逻辑
b.初始化棋盘
c.布置雷的位置
d.排雷、棋盘打印、判断输赢(难点)

a.简易的游戏菜单逻辑

简单的通过一个输入0和1实现判断是玩游戏还是退出游戏的逻辑
输入1则进入游戏
输入0则break退出游戏,且退出do…while循环,程序结束。

void test(){
	int input = 0;
	do{
		menu();
		cout << "请输入:>--";
		cin >> input;
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			cout << "退出游戏" << endl;
			break;
		default:
			cout << "    选择错误!请重新输入" << endl;
			break;
		}
	} while (input);
}

b.初始化棋盘

一、越界情况的考虑

为了减少边界情况可能出现越界访问的情况,把棋盘扩大一圈,但是在显示的时候只显示没扩大之前的棋盘。

在这里插入图片描述

二、棋盘打印的考虑

如果只使用一个二维数组,同时要记录雷的位置和每一个位置附近的雷数以及点击和未点击的位置显示显然不合适。
所以: 初始化两个棋盘,一个专门用来存放雷的位置,一个专门用于打印当前棋盘给玩家看。

	//初始化格子
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	
	void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
	{
		memset(&board[0][0], set, rows*cols*sizeof(board[0][0]));
	}

初始化完,得到一个全0的雷盘,和一个全*的显示盘。

c.布置雷的位置

这里用随机数布置雷的位置,会不会对同一个点多次放雷呢?这里的解决办法是,如果当前随机到的位置已经有雷就再随机一个位置防雷。

void SetMine(char board[ROWS][COLS], int row, int col)
{
	srand((unsigned int)time(NULL));
	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--;
		}
	}
}

d.排雷、棋盘打印、判断输赢(难点)d

排雷的逻辑判断:

在这里插入图片描述

如果没有雷如何打印棋盘呢?
扫雷应该做到,“点击”棋盘之后,一路“打开”到最近的出现雷的边界上。

void Spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	int offset_x = 0;
	int offset_y = 0;
	int count = 0;
	//坐标合法
	if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
	{
		//遍历周围坐标
		for (offset_x = -1; offset_x <= 1; offset_x++)
		{
			for (offset_y = -1; offset_y <= 1; offset_y++)
			{
				//如果这个坐标不是雷
				if (mine[x + offset_x][y + offset_y] == '0')
				{
					//统计周围雷的个数
					count = GetMineCount(mine, x + offset_x, y + offset_y);
					if (count == 0)
					{
						if (show[x + offset_x][y + offset_y] == '*')
						{
							show[x + offset_x][y + offset_y] = ' ';
							Spread(mine, show, x + offset_x, y + offset_y);
						}
					}
					else
					{
						show[x + offset_x][y + offset_y] = count + '0';
					}
				}
			}
		}
	}
}

如何判断输赢:
很简单,踩到雷 board[i][j] == 1
所有的雷都出现了 * == MineCount 就赢了

//判断是否排雷成功
int IsWin(char show[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= col; j++)
		{
			if (show[i][j] == '*')
			{
				count++;
			}
		}
	}
	return count == EASY_COUNT;
}

到此这篇关于C++实现扫雷游戏示例讲解的文章就介绍到这了,更多相关C++实现扫雷游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java如何实现图像灰度化

    详解Java如何实现图像灰度化

    这篇文章主要介绍了灰度化的几种方法,以及如何使用Java实现灰度化。同时分析了网上一种常见却并不妥当的Java灰度化实现,以及证明了opencv的灰度化是使用“加权灰度化”法,下面一起来看看。
    2016-08-08
  • 基于SpringBoot实现动态配置数据库的加载

    基于SpringBoot实现动态配置数据库的加载

    这篇文章主要介绍了Spring Boot 如何动态配置数据库的加载,现项目有一个需求,期望通过在application.yml配置文件中设置一个开关,来决定是否加载数据库,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-10-10
  • Java实现超市会员管理系统

    Java实现超市会员管理系统

    这篇文章主要为大家详细介绍了Java实现超市会员管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • springboot+vue实现Token自动续期(双Token方案)

    springboot+vue实现Token自动续期(双Token方案)

    双Token方案通过访问令牌和刷新令牌提高用户登录安全性和体验,访问令牌有效期短,包含用户信息,用于请求校验,本文就来介绍一下springboot+vue实现Token自动续期(双Token方案),感兴趣的可以了解一下
    2024-10-10
  • SWT(JFace) 图片浏览器 实现代码

    SWT(JFace) 图片浏览器 实现代码

    SWT(JFace)小制作:图片浏览器
    2009-06-06
  • Java等待唤醒机制原理实例解析

    Java等待唤醒机制原理实例解析

    这篇文章主要介绍了Java等待唤醒机制原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 新建springboot项目时,entityManagerFactory报错的解决

    新建springboot项目时,entityManagerFactory报错的解决

    这篇文章主要介绍了新建springboot项目时,entityManagerFactory报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java线程在什么情况下可以终止

    Java线程在什么情况下可以终止

    Thread线程类自带的stop方法,但是jdk不建议使用,因为stop方法终止线程只是强行终止,内存中部分值可能已发生变化,并未保证数据的一致性,将会导致线程安全问题,那么在什么情况下可以终止线程呢,本篇带你探究一下
    2022-04-04
  • 分享Java多线程实现的四种方式

    分享Java多线程实现的四种方式

    这篇文章主要介绍了分享Java多线程实现的四种方式,文章基于 Java的相关资料展开多线程的详细介绍,具有一的的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • Java方法重载和方法重写的区别到底在哪?

    Java方法重载和方法重写的区别到底在哪?

    今天给大家带来的是关于Java的相关知识,文章围绕着Java方法重载和方法重写的区别到底在哪展开,文中有非常详细的解释,需要的朋友可以参考下
    2021-06-06

最新评论