系统学习之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. 该坐标未被排查过

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:系统学习之C复习(4)数组2-创新互联
URL标题:http://scyanting.com/article/ddohid.html