第二个小游戏---扫雷

在写完三子棋之后,扫雷写起来就更加简单了,甚至我只用了两百行就实现了最简单的扫雷游戏,当然也是最简陋的,但我在这里还是写一下主要步骤和思路,注意事项以及不足。

想要实现扫雷,我们主要注意以下几个步骤:棋盘的初始化和绘制----雷的随机放置----玩家排雷和判断

1.棋盘的初始化和绘制:

有些方面和三子棋一样:

(1)棋盘是由二维数组构成,通过玩家手动输入坐标来判断和改变数组中的元素,通过循环来实现数组的输出。

有的方面不像三子棋:

(1)扫雷的棋盘更大,我们往往难以一眼看到自己想要输入的坐标,我们就需要数字来帮助我们看到我们想要输入的坐标,这些通过循环和条件来输出即可。

(2)我们定义的棋盘(数组)需要比展示给玩家的棋盘大一圈,因为我们需要统计一个坐标周围坐标地雷的数量,如果是在边缘的坐标就很难遍历计数,所以我们让棋盘大一圈,但是只给玩家展示内部的棋盘,玩家也只能输入内部棋盘的坐标,

(3)扫雷需要两个棋盘,也就意味着我们需要定义两个数组,其中一个用来安置地雷(这里的感叹号表示地雷),玩家在游戏过程中不可见的,只有在游戏结束的时候会展示给玩家。另一个则是展示给玩家的棋盘,玩家只能看到数字和’ * ‘,玩家输入的是后者的坐标,判断的是前者的元素。

(4)棋盘(数组)的初始化:在隐藏棋盘中全部初始化为’0‘;在玩家棋盘中全部初始化为’*‘。

2.雷的随机放置:

首先进行两个随机数的生成,随机到的隐藏数组元素会被改为‘!’,如果随机得到已经被定义为雷的元素,则再次生成,直到生成指定数量地雷即可。

注意:在生成随机数的过程中不要把随机数的初始化放在循环里面,否则会运行得很慢。

3.玩家排雷和判断:

玩家输入坐标和隐藏棋盘中的坐标进行对照,如果输入的坐标为雷则游戏结束,向玩家展示隐藏棋盘。如果输入的坐标不是雷,则将玩家棋盘中该坐标中的“*”改为隐藏棋盘中相同坐标周围的雷的数目。如果在游戏中输入一个不是雷的坐标,就记一次数,如果输入相同的坐标则不计数,直到计数为玩家棋盘大小减去雷数量的时候才能获得胜利。 

注意:

1.由于定义的数组最好是字符数组,写代码的时候要注意整型数字和字符数字的区别。

2.定义宏来规定棋盘的大小,和雷的数量。

void playerdo(char mine[ROWS][LINES], char show[ROWS][ROWS], int line, int row)
{
	int x = 0, y = 0;
	int win = 0;
		while (ROW*LINE-BOOM>win)
		{
			int count = 0;
			printf("请排除一个没有雷的坐标:");
			scanf("%d %d", &x, &y);
			if (mine[x][y] != '*')
			{
				printf("坐标已经被占用,请重新输入\n");
			}
			else
			{
				if (show[x][y] == '!')
				{
					printf("很遗憾,你被炸死了\n");
					print2(show, LINES, ROWS);
					break;
				}
				else
				{
					win++;
					for (int i = x - 1;i <= x + 1;i++)
					{
						for (int j = y - 1;j <= y + 1;j++)
						{
							if (show[i][j] == '!')
							{
								count = count + 1;
							}
						}
					}
					mine[x][y] = '0' + count;
					printf("%d\n", count);
					system("cls");
					print1(mine, LINES, ROWS);
				}
			}
			if (win ==ROW*LINE- BOOM)
			{
				printf("恭喜你,排雷成功!\n");
				print2(show, LINES, ROWS);
				break;
			}
		}
}

不足:

代码太过于简单导致游戏难度偏大。应当改善的地方有:

(1)第一次输入坐标不可能是雷,也就不能在输入第一个坐标值之后因为运气太差直接输掉游戏

(2)当输入坐标周围的坐标没有雷,也就是该坐标被定义为0时,自动将周围的坐标点亮

(3)再输入一个坐标不是雷的时候,周围坐标也应该被改为周围雷的数量

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值