系统学习之C复习(4)数组2_扫雷

1. 设置框架,并确定游戏逻辑是否正常运行

        1.布置雷, 10个;

        2.扫雷

                输入坐标,

是雷 —— Game over

不是雷  ——告诉你这个坐标周围8个坐标范围内有几个雷

直到把所有非雷的位置全部找出,游戏结束,扫雷成功

2. 模块化,将游戏主体单独列一个C文件与h文件

3. 确定游戏信息

首先布置雷的信息

char mine[9][9];

'1' - 雷 

'0' -  非雷

注意:  

         由于扫雷中边缘的坐标出触发后,会扫描周围8个坐标,防止数组越界,我们设置两层           数组。避免数组越界

char mine[11][11]

排查出的雷的信息

char show[9][9];

* - 未排查

数组字符 - 已排查

char show[11][11];

初始化界面棋盘 和 打印棋盘 

void game(char board, int row, int col)
{
	char mine[ROWS][COLS] = { 0 };//'0'用于存放布置的雷的信息
	char show[ROWS][COLS] = { 0 };//'*'用于存放排查出的雷的信息
	//初始化棋盘
	init_board(mine, ROWS, COLS, '0');
	init_board(show, ROWS, COLS, '*');
	//打印棋盘
	show_board(mine, ROW, COL);    //用于查看
	show_board(show, ROW, COL);
}
void init_board(char arr[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++)
		{
			arr[i][j] = set;
            //用于设置这个棋盘中我需要填充哪个字符
		}
	}
}
void show_board(char arr[ROWS][COLS], int row, int col)
{
	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 ",arr[i][j]);
		}
		printf("\n"); 
	}
}

打印玩棋盘后,我们需要将雷 放入棋盘中。   所以布置雷的位置,在打印棋盘函数之前。

	set_mine(mine,ROW,COL);
	//打印棋盘
	show_board(mine, ROW, COL);	//打印棋盘
//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	int x = 0;
	int y = 0;
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';//布置雷
			count--;
		}
	}
}

由于后续需要计算某一坐标点周围的雷的数目,

此处将雷设置为‘1’,无雷的地方设置为0 。 方便后续的计算雷的数目。

当布置完雷,打印棋盘后,便是需要玩家去排除雷的位置了。

排查雷  在布置雷的棋盘内寻找,后传到排查出雷的棋盘内。故此两个数组都需要
    find_mine(mine, show, ROW, COL); 

//排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("请输入要排查的坐标");
	scanf("%d %d", &x, &y);
	if (1 <= x && x <= 9 && 1 <= y && y <= 9)//检查坐标是否合法
	{
		if (mine[x][y] == '1')
		{
			printf("寄——游戏结束\n");
			show_board(mine, ROW, COL);//死亡回放
		}
		else
		{
			int count = get_mine_count(mine, x, y);//计算周围雷的数目
			show[x][y] = count + '0';
			show_board(show, ROW, COL);
		}
	}
	else
	{
		printf("坐标非法,请重新输入");
	}

}
get_mine_count(mine, x, y)函数
将九宫格内的字符全部相加,再减去 '0'字符,那么剩下的便是九宫格范围内的 '1'的个数。
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
	int i = 0;
	int j = 0;
	int sum = 0;
	for (i = -1; i < 2 ; i++)
	{
		for (j = -1; j < 2; j++)
		{
			sum += mine[x + i][y + j];		
			//  x-1	y-1 y y+1 
			//  x	y-1 y y+1
			//	x+1 y-1 y y+1
		}
	}
	return sum = sum - 9 * '0';    
    由于中间那个x,y坐标一定不是雷,故此可以直接循环,然后减去9个'0'
}
也可以直接相加,那么就不必考虑X,Y。
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{

	return mine[x - 1][y] +
        mine[x - 1][y - 1] +
		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';
}

注意此处运行的结果

输入坐标1 1.为什么他只计算了里面的数据?

因为外面一圈都是一开始定义的'0' 。

这里只是显示 int 123456789,但是没有改变 本身的 mine[0][0] =  '0'

 

功能:展开一片空白区域。

条件:1:该坐标不是雷,2.该坐标周围8个坐标不是雷 3. 该坐标未被排查过

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值