扫雷小游戏的C语言实现

扫雷小游戏的C语言实现,第1张

扫雷小游戏的C语言实现

        首先,我们先来介绍一下扫雷游戏的规则。

        存在一个已经藏好地雷的棋盘,玩家需要输入认为不是地雷的坐标进行排雷的 *** 作,若点击位置没有‘ 雷 ’存在,玩家点击的坐标处就会出现在该位置(以坐标点为中心的3*3二维数组中含雷的个数)

        若在排雷过程中,点击到‘ 雷 ’所在坐标,则游戏失败。反之,如果玩家排除所有的非‘ 雷 ’区域,只剩下‘ 雷 ’没被玩家挖掘,则玩家获胜。

现在,我们开始编程试试看吧。

1.棋盘的初始化设计

        考虑到,游戏过程中‘ 雷 ’盘和展示给玩家观看扫‘ 雷 ’的棋盘如果在同一个二维数组中,会变得相对复杂,而且难以 *** 作,对此,我采用的是‘ 雷 ’盘和棋盘用两个不同的二维数组进行 *** 作。并且展示给玩家的棋盘直接为9*9数组表示的即可。

        考虑到待会对于数组行和列会频繁使用,我们将它定义为宏;

        考虑到游戏过程中会对选定位置周围‘ 雷 ’数的统计,我们用‘ 1 ’表示地雷,‘ 0 ’表示安全区,所以在初始化过程中我们将整个数组置为0;

        防止数组的泄露,我们先将9*9棋盘外围(上下各一行,即11*11)也考虑上,把‘ 雷 ’盘设计为(9+2)*(9+2)的二维数组。

        同时,对于‘ 雷 ’的个数,我们也可以设计为可变化的量。

        接着,我们要进行的是对数组的初始化 *** 作(对于ROWS*COLS数组),并且由于‘ 雷盘 ’和棋盘上放置的不是同一符号,我们可以将初始化符号也考虑上。(初始化实现过程如下)

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

        接下来,我们考虑一下棋盘向玩家展示的大致形状,考虑到今后棋盘尺寸的不唯一,我们可以将棋盘设计的灵活些。

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	//1~9
	int i = 0;
	int j = 0;

	//列号的打印
	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");
	}
}
2.‘ 雷 ’的布置

        按照之前的想法,我们在‘ 雷 ’盘随机分布上相应的‘ 雷 ’数。

void SetMine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;

	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

        同时,我们可以开始思考当玩家点击安全区后,怎样进行周围‘ 雷 ’计数的 *** 作。

        由于在我们之前的思考中,我们将‘ 雷 ’定为了‘ 1 ’,于是我们可以将玩家点击坐标周围(以给坐标为中心的3*3二维数组)的数据直接相加,得出的数据作为‘ 雷 ’数展示给大家。

static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
	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.扫‘ 雷 ’ *** 作

        让玩家输入一个排查的坐标,然后在‘ 雷 ’盘中判断玩家输入坐标位置的元素进行是否为‘ 雷 ’;若为雷,则游戏结束,玩家失败,并将‘ 雷 ’盘展示给玩家。若玩家排‘ 雷 ’次数已达安全区最大数量(即数组最大范围减去‘ 雷 ’数),则游戏结束,玩家获胜。

void FindMine(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)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你踩到雷了n");
				DisplayBoard(mine, row, col);
				break;
			}
			else
			{
				//计算x,y坐标周围有几个雷
				int n = get_mine_count(mine, x, y);
				show[x][y] = n + '0';
				DisplayBoard(show, row, col);
				win++;
			}
		}
		else
		{
			printf("输入坐标非法,无法排雷,请重新输入n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功n");
		DisplayBoard(mine, row, col);
	}

}

最后,不要忘记了在test函数里设置可以让玩家重复游戏的代码。

void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			//扫雷
			game();
			break;
		case 0:
			printf("退出游戏n");
			break;
		default:
			printf("选择错误n");
			break;
		}
	} while (input);
}

        好了,关于扫雷游戏的简单实现,先讲到这里,大家可以自己动手试试看呢。

        欢迎大家找出错误和分享更加好的方法。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5520859.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存