c语言——扫雷

发布于:2023-01-20 ⋅ 阅读:(13) ⋅ 点赞:(0) ⋅ 评论:(0)

最后有完整的代码

写扫雷逻辑

  1. 创造一个雷盘基本样子
  2. 初始化雷盘
  3. 埋雷
  4. 扫雷

1.创造一个雷盘基本样子

比如我们建立一个9*9大的雷盘,由于我们要考虑到假如玩家输入1,1坐标时(或者在边缘时如图)如何判断附近的雷,最简单的方法是建立一个11*11的雷盘

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2

创造雷盘的基本想法与三子棋有点一样,不一样的地方是我们初始化后雷埋后需要一个盖板(掩盖)如果不掩盖雷就暴露了。所以要初始化两个盘。

void mine_clearance()
{
	//board为底层
	//intboard为上层
	 char board[ROWS][COLS] = {0};
	 char intboard[ROWS][COLS] = {0};
}

 然后我们就可以来初始化雷盘,我们为了区分埋雷的与盖板的区别,埋雷的用字符0来代表,盖板用字符*来表。

void mine_clearance()
{
	//board为底层
	//intboard为上层
	 char board[ROWS][COLS] = {0};
	 char intboard[ROWS][COLS] = {0};
	 //初始化
	 frame(board, ROWS, COLS,'0');
	 frame(intboard, ROWS, COLS, '*');
}
//set代替字符
void frame(char board[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++)
		{
			board[i][j] = set;

		}
	}
}

初始化后我们就可以打印扫雷了

void mine_clearance()
{
	//board为底层
	//intboard为上层
	 char board[ROWS][COLS] = {0};
	 char intboard[ROWS][COLS] = {0};
	 //初始化
	 frame(board, ROWS, COLS,'0');
	 frame(intboard, ROWS, COLS, '*');
	 //打印画面
	 print_board(intboard, ROW, COL);//上面
     //下面后期要隐藏掉
	 print_board(board,ROW,COL);//下面
}
//打印画面
void print_board(char borad[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
    //打印横坐标
	for ( i = 0; i <=row; i++)
	{
		printf(" %d",i);
	}

	printf("\n");
    //为什么i为1应为雷盘初始为11*11前面也讲到了
	for ( i = 1; i <= row; i++)
	{
        //打印竖坐标
		printf(" %d",i);

		for ( j = 1; j <= col; j++)
		{
			printf(" %c",borad[i][j]);
		}
		printf("\n");
	}
}

现在就像种地,已经开荒了咱们就要种雷了。(埋雷肯定是电脑埋,所以我们要搞时间戳,随机值)随机值我不做过多的讲解

void mine_clearance()
{
	//board为底层
	//intboard为上层
	 char board[ROWS][COLS] = {0};
	 char intboard[ROWS][COLS] = {0};
	 //初始化
	 frame(board, ROWS, COLS,'0');
	 frame(intboard, ROWS, COLS, '*');
	 //打印画面
	 print_board(intboard, ROW, COL);//上面
	 //print_board(board,ROW,COL);//下面
	
	 //埋雷
	 bury(board,ROW,COL);//埋雷
srand((unsigned int)time(NULL));
void bury(char board[ROWS][COLS], int row, int col) 
{
	
	
	int count = easily;
	while (count)
	{
		int x = rand() % row + 1;//比如一随机数X%4必然X的余数小于4大于等于0
		int y = rand() % col + 1;
		if (board[x][y]=='0')
		{
			
			board[x][y] = '1';
			count--;
		}
	}
}

雷已经下好后,就可以扫雷了

void mine_clearance()
{
	//board为底层
	//intboard为上层
	 char board[ROWS][COLS] = {0};
	 char intboard[ROWS][COLS] = {0};
	 //初始化
	 frame(board, ROWS, COLS,'0');
	 frame(intboard, ROWS, COLS, '*');
	 //打印画面
	 print_board(intboard, ROW, COL);//上面
	 //print_board(board,ROW,COL);//下面
	
	 //埋雷
	 bury(board,ROW,COL);//埋雷
	 //扫雷
	 sweep(board,intboard,ROW,COL);	 
}
//判断附近雷的个数
int judge(char board[ROWS][COLS], int x, int y)
{
	return board[x][y - 1] + board[x - 1][y - 1] + board[x - 1][y] +
		board[x - 1][y + 1] + board[x][y + 1] + board[x + 1][y + 1] + 
		board[x + 1][y] + board[x + 1][y - 1] - 8 * '0';
}
void sweep(char board[ROWS][COLS], char intboard[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int sum = 0;
	while (sum<row*col-easily)//9*9=81  81-10个雷为71不然扫完都不会结束。
	{
		
		printf("请输入坐标:\n");
		scanf_s("%d%d", &x, &y);

		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//踩中雷
			if (board[x][y]=='1')
			{
				printf("很遗憾,你踩雷了!\n");
				print_board(board, ROW, COL);//告知你总答案
				break;
			}
			//没有踩中
			else if(board[x][y] == '0')
			{
				//判断附近雷
				int count = judge(board, x, y)
				intboard[x][y] = count + '0';
				print_board(intboard, ROW, COL);
				sum++;
			}
		}
	}
	if (sum == col * row - easily)
	{
		printf("恭喜你成功了,扫雷!!!\n");
		print_board(board, ROW, COL);
	}
}

特别讲解一下

int count = judge(board, x, y)
intboard[x][y] = count + '0';

judge自定义函数它是勘察附近8个是否有有雷并且统计雷数,由于我我们用的是字符所有不可以直接计算,但有一个小诀窍就是ASCII码当字符1-字符0=数字1

我们就可以计算当8个全部为0时512-512=0,当7个为0一个为1时就是513-512=1

然后count=1+字符0=65==字符1

 --------------------------------------------------------------------------------------------------------------------------------


网站公告

欢迎关注微信公众号

今日签到

点亮在社区的每一天
签到