1、扫雷游戏函数game.c

#include "game.h"	//引用ROWS,COLS名称,在game.h文件中定义



void InintBoard(char arr[ROWS][COLS], int rows, int cols, char set)	//set用来辨别是哪个棋盘
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}



void DisplayBoard(char arr[ROWS][COLS], int row, int col)	//打印棋盘
{
	int i = 1;
	printf("************   扫雷   ************\n");

	//先打印列号
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");

	for (i = 1; i <= row; i++)
	{
		int j = 0;
		//打印行号
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}



void  SetMine(char arr[ROWS][COLS], int row, int col)
{
	//布置10个雷
	int count = EASY_COUNT;
	while (count)
	{
		//布置雷
		int x = rand() % row + 1;	//随机生成1-9,模9的余数是0-8,0-8加一就是1-9
		int y = rand() % col + 1;

		//布置成功一个雷,count--
		if (arr[x][y] == '0')	//位置没有雷才布置
		{
			arr[x][y] = '1';
			count--;
		}
	}
}



//统计雷个数
static int GetMineCount(char mine[ROWS][COLS], int x, int y)		//static防止别人看到代码
{
	//除了中心,周围的八个数字相加
	return mine[x - 1][y] + mine[x - 1][y - 1] +
		mine[x][y - 1] + mine[x + 1][y - 1] +
		mine[x + 1][y] + mine[x + 1][y + 1] +
		mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0';	//字符0ASCII为48
}



//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < row + col - EASY_COUNT)	//布置了10个雷,从剩下的71个位置排除
	{
		printf("请输入要排查的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("你被炸死了\n");
				DisplayBoard(mine, ROW, COL);	//查看棋盘看看是怎么炸死的
				break;
			}
			else
			{
				int n = GetMineCount(mine, x, y);	//不是雷,就统计该坐标周围有几个雷
				show[x][y] = n + '0';
				//数字字符转换为对应的数字-'0'
				//数字转换为对应的字符+'0'
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
	if(win==row+col- EASY_COUNT)	//所有位置都排完了
	{
		printf("恭喜你,排雷成功");
		DisplayBoard(mine, ROW, COL);	//排雷成功后查看雷的布局
	}
}

你可能感兴趣的:(游戏,算法)