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++实现扫雷游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • idea推送项目到gitee中的创建方法

    idea推送项目到gitee中的创建方法

    这篇文章主要介绍了idea推送项目到gitee中的创建方法,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • 基于JAVA文件中获取路径及WEB应用程序获取路径的方法

    基于JAVA文件中获取路径及WEB应用程序获取路径的方法

    下面小编就为大家带来一篇基于JAVA文件中获取路径及WEB应用程序获取路径的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • IntelliJ IDEA同步代码时版本冲突而产生出的incoming partial文件问题的解决办法

    IntelliJ IDEA同步代码时版本冲突而产生出的incoming partial文件问题的解决办法

    今天小编就为大家分享一篇关于IntelliJ IDEA同步代码时版本冲突而产生出的incoming partial文件问题的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 浅谈对于DAO设计模式的理解

    浅谈对于DAO设计模式的理解

    这篇文章主要介绍了浅谈对于DAO设计模式的理解,小编觉得挺不错的,这里分享给大家,供需要的朋友参考。
    2017-10-10
  • Java使用split分割无效获取不到预期效果的解决办法

    Java使用split分割无效获取不到预期效果的解决办法

    这篇文章主要给大家介绍了关于Java使用split分割无效获取不到预期效果的解决办法,java的String类中有个split方法,这个是我们经常使用到的,需要的朋友可以参考下
    2023-08-08
  • SpringBoot+Redis+Lua分布式限流的实现

    SpringBoot+Redis+Lua分布式限流的实现

    本文主要介绍了SpringBoot+Redis+Lua分布式限流的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Java矢量队列Vector使用示例

    Java矢量队列Vector使用示例

    Vector类实现了一个动态数组。和ArrayList很相似,但是两者是不同的Vector是同步访问的;Vector包含了许多传统的方法,这些方法不属于集合框架
    2023-01-01
  • 一文搞懂Java设计模式之责任链模式

    一文搞懂Java设计模式之责任链模式

    这篇文章主要给大家介绍了关于Java设计模式之责任链模式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Spring Boot的优点及项目创建步骤详解

    Spring Boot的优点及项目创建步骤详解

    这篇文章主要介绍了Spring Boot的优点及项目创建步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 日历显示读出输入的年月的java代码

    日历显示读出输入的年月的java代码

    这篇文章主要介绍了日历显示读出输入的年月的java代码,有需要的朋友可以参考一下
    2013-12-12

最新评论