C语言实现简单扫雷游戏

1.扫雷棋盘

2.游戏实现

目录

1.扫雷棋盘

2.游戏实现


一.棋盘

思路:对于扫雷游戏来说,整个游戏就是在基于棋盘上实现的,棋盘的重要性不言而喻。

我们打开市面上的一款扫雷游戏:

 

 从此图中可以看出棋盘为9 * 9的,棋盘上的数字代表它的四周有多少雷。所以此时我们则需要思考一个问题,就是位于边界的棋位,它的四周如果为9 * 9的,那么就会出现越界访问,所以,真实的棋盘应该为11 * 11的,而出现在玩家眼前的还是9 * 9的棋盘,这样就不会出现数组越界访问的问题,还能使用户保持观感。

扫雷实现的方法有很多,在这里我们用两个二维数组的方法,一个存放我们布置好的雷的棋盘,另一个存放每个棋位周围雷的个数,所以第二个二维数组是我们展现给用户的棋盘。

在第一个二维数组中我们用字符0表示非雷,字符1表示雷,第二个二维数组我们全用字符 * 表示,每选择了一个棋位就将周围雷的个数赋给该位置的字符 * ,展现给用户。

所以,思路有了,下面就是代码的实现

先将准备工作做好:

//表示行和列
#define Hang1 9
#define Lie1 9
#define Hang2 Hang1+2
#define Lie2 Lie1+2
#define Lei 10 //总的雷的个数
//表示2个二维数组
char mine[Hang2][Lie2];//存放布置的雷
char show[Hang2][Lie2];//存放点击后周围的雷

1.初始化棋盘:

因为我们此时还没有布置雷,所以我们只需要将2个二维数组初始化全没有雷即可。

//1.初始化棋盘
Chushi(mine, Hang2, Lie2, '0');
Chushi(show, Hang2, Lie2, '*');

void Chushi(char board[Hang2][Lie2], int hang, int lie, char c)
{
	int i = 0, j = 0;
	for (i = 0; i < hang; i++)
	{
		for (j = 0; j < lie; j++)
		{
			board[i][j] = c;
		}
	}
}

2.打印棋盘:

因为我们只需要展现9 * 9的棋盘给用户就可,而我们实际数组是11 * 11的,所以需要行和列的下标都从1出发一直到9。另外我们在打印整个数组前,应先把行和列坐标先打印出来,这样用户也就好进行输入其想要的坐标了。

//2.打印棋盘
//Dayin(mine, Hang1, Lie1);
Dayin(show, Hang1, Lie1);

void Dayin(char board[Hang2][Lie2], int hang, int lie)
{
	int i = 0, j = 0;
	printf("**** 扫雷游戏 ****\n");
	for (i = 0; i <= lie; i++)
	{
		printf("%d ", i);//打印列标
	}
	printf("\n");
	for (i = 1; i <= hang; i++)
	{   
		printf("%d ", i);//打印行标
		for (j = 1; j <= lie; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

二.游戏实现

思路:我们应首先用随机数来布置雷,然后再对用户输入的坐标的四周进行排查出看有几个雷,并且展现给用户,思路很清晰,这一部分的实现直接看代码。

1.布置雷

这一部分的实现主要注意一点随机数的使用就可以。

//3.布置雷
Buzhi(mine, Hang1, Lie1);

void Buzhi(char board[Hang2][Lie2], int hang, int lie)
{
	int count = Lei;
	while (count)
	{
		int x = rand() % hang + 1;//1 到 9
		int y = rand() % lie + 1;//1 到 9
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

2.排查雷

做排查雷的时候,那么这时候第一个二维数组用字符0和1表示的优势就体现出来了,具体实现看代码。

//4.排查雷
Pailei(mine, show,Hang1, Lie1);


int pc(int a, int b, char board[Hang2][Lie2])
{
	return board[a - 1][b] + board[a][b - 1] + board[a + 1][b] + board[a][b + 1] + board[a - 1][b - 1] + board[a + 1][b + 1] + board[a + 1][b - 1]
		+ board[a - 1][b + 1] - 8 * '0'; //利用了字符0的ASCII码值,这也就是其优势所在
}

void Pailei(char board1[Hang2][Lie2], char board2[Hang2][Lie2], int hang1, int lie1)
{   
	int a = 0, b = 0;
	int win = 0;
	while (1)
	{
		printf("请输入想要排查的坐标:>>");
		scanf("%d %d", &a, &b);
		if (a >= 1 && a <= hang1 && b >= 1 && b <= lie1)
		{
			if (board1[a][b] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				break;
			}
			else
			{
				int ret = pc(a, b, board1);//找出排查到的雷的个数
				board2[a][b] = ret + '0';
				Dayin(board2, hang1, lie1);//展现给用户
				win++;
			}
		}
		else
		{
			printf("您输入的坐标有误,请重新输入\n");
		}
		if (win == Hang1 * Lie1 - Lei)
		{
			printf("恭喜你获得了胜利\n");
			Dayin(board1, hang1, lie1);
			break;
		}
	}
}

以上就是简单扫雷游戏的实现,后续我将继续完善其展开一片的效果,请持续关注噢!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值