c语言实现扫雷


扫雷是一款大家都熟知的小游戏,今天我们将使用c语言实现一个简易版本的扫雷

需要的功能

1.保证第一次下子时,不被炸死
2.输入的坐标周围没雷,可以直接展开周围的坐标
3.输入的坐标周围有雷时,应该显示周围有多少个雷

注意事项

1.应该定义两个数组,一个用来向玩家展示排雷的情况,一个来存放雷
2.定义的数组的大小,应该大于扫雷游戏的棋盘的真实大小,防止数组越界
(如:在扫雷的棋盘为99时,我们应该定义1111的数组,防止数组越界)
3.可以将代码分文件实现

代码的实现

分文件

将代码分别写入game.c,game.h,test.c文件里,可以让代码更加有条理
test.c主要写游戏主要框架
game.c实现需要的函数
game.h定义需要的函数
在这里插入图片描述

对两个数组初始化

//board-需要初始化的数组
//set-初始化的元素(这里我将'1'设置为雷,'0'代表没有雷;将玩家看到的棋盘初始化为'*')
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
	int i;
	int j;
	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)
{
	int i;
	int j=1;
	printf("-----------------------------\n");//分割每次打印的棋盘,防止混淆
	for (i = 0; i <= row; 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");
	}
	printf("-----------------------------\n");

}

布置雷

//布置雷
//count-布置的雷的数量
void SetMineBoard(char board[ROWS][COLS], int row, int col, int count)
{
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

排查雷

//排查雷
//num-雷的数量
void FineMine(int row, int col, int num)
{
	int flag = 1;
	int a = 1;
	while (flag)
	{
		printf("请输入一个坐标:");
		int x;
		int y;
		scanf("%d%d", &x, &y);
		if (a == 1)//第一次输入坐标需要进行判断,防止第一次就踩到了雷
		{
			a--;
		    safe(x, y,ROW,COL);//安全函数,保证第一次不会踩到雷
		}

		if (x >= 1 && x <= row&&y >= 1 && y <= col)//坐标合法
		{
			if (mine[x][y] != '1')//如果该位置不是雷,应该搜索周围有多少雷
			{
				int count = GetMineCount(x, y);//查找周围雷的数量
				show[x][y] = count + '0';
				if (show[x][y] == '0')
				{//该位置没有雷时,应该继续展开搜索周围的坐标
					open_mine(x, y);//展开周围坐标功能
					int z = count_show_mine(row, col);
					if (z == num)
					{
						printf("你已经找出全部的雷,游戏胜利\n");
						DisplayBoard(show, ROW, COL);//打印
						break;
					}
				}
				DisplayBoard(show, ROW, COL);//打印
			}
			else
			{
				printf("你踩到雷,游戏结束\n");
				DisplayBoard(mine, ROW, COL);//打印
				flag = 0;
			}
		}
		else
		{
			printf("坐标有误,请重新输入");
		}
	}
}

保证第一次下子时,不被炸死

//保证不会在第一次时踩到雷
void safe(int x, int y, int row, int col)
{
	int q = 1;
	if (mine[x][y] == '1')
	{//如果此处是雷,将雷换到其他地方
		mine[x][y] = '0';
		while (q)
		{
			int a = rand() % row + 1;
			int b = rand() % col + 1;
			if (mine[a][b] == '0'&&a!=x&&b!=y)
			{
				q--;
				mine[a][b] = '1';
			}
		}
	}
}

统计周围有几个雷;

//统计坐标(x,y)周围有几个雷;
int GetMineCount(int x, int y)
{
	return (mine[x - 1][y - 1])
		+ (mine[x - 1][y])
		+ (mine[x - 1][y + 1])
		+ (mine[x][y - 1])
		+ (mine[x][y + 1])
		+ (mine[x + 1][y - 1])
		+ (mine[x + 1][y])
		+ (mine[x + 1][y + 1])
		- 8 * '0';	
}

展开周围坐标

//展开排查周围坐标的情况
void open_mine(int x, int y)//坐标周围展开函数
{
	if (mine[x - 1][y - 1] == '0')
	{
		show[x - 1][y - 1] = GetMineCount(x - 1, y - 1) + '0';//显示该坐标周围雷数
	}
	if (mine[x - 1][y] == '0')
	{
		show[x - 1][y] = GetMineCount(x - 1, y) + '0';//显示该坐标周围雷数
	}
	if (mine[x - 1][y + 1] == '0')
	{
		show[x - 1][y + 1] = GetMineCount(x - 1, y + 1) + '0';//显示该坐标周围雷数
	}
	if (mine[x][y - 1] == '0')
	{
		show[x][y - 1] = GetMineCount(x, y - 1) + '0';//显示该坐标周围雷数
	}
	if (mine[x][y + 1] == '0')
	{
		show[x][y + 1] = GetMineCount(x, y + 1) + '0';//显示该坐标周围雷数
	}
	if (mine[x + 1][y - 1] == '0')
	{
		show[x + 1][y - 1] = GetMineCount(x + 1, y - 1) + '0';//显示该坐标周围雷数
	}
	if (mine[x + 1][y] == '0')
	{
		show[x + 1][y] = GetMineCount(x + 1, y) + '0';//显示该坐标周围雷数
	}
	if (mine[x + 1][y + 1] == '0')
	{
		show[x + 1][y + 1] = GetMineCount(x + 1, y + 1) + '0';//显示该坐标周围雷数
	}
}

判断胜利

//判断剩余未知区域的个数,个数为雷数时玩家赢
int count_show_mine(int row,int col)
{
	int count = 0;
	int i = 0;
	int j = 0;
	for (i = 1; i <= row - 2; i++)
	{
		for (j = 1; j <= col - 2; j++)
		{
			if (show[i][j] == '*')
			{
				count++;
			}
		}
	}
	return count;
}

效果展示

1.打印和布置

第一个数组是玩家在游戏看到的数组,第二个数组是存放雷的数组,在游戏中第二个数组不会被打印

2.safe函数的检查
第一个数组为本来存放雷的数组,可以看到此时(1,7)位置是有雷的,但是,我们在输入(1,7)坐标时,因为safe函数的功能,使得(1,7)位置的雷转移到其他地方
在这里插入图片描述
3.由上图可知(2,8)存放的有雷,这时我们输入(2,8)(不是第一次输入),游戏结束

在这里插入图片描述
4.展开功能

第一个数组仍然为布置雷后打印出的数组,我们可以看到(3,3)位置及周围都没有雷,所以我们输入(3,3)看到其周围8个位置也被搜索

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值