扫雷

扫雷的主要函数部分

//初始化棋盘
void InitBorad(char board[][ROWS], int row, int col,int set);
//打印棋盘
void show(char board[][ROWS], int row, int col);
//设置雷
void SetMine(char board[][ROWS], int row, int col);
//扫雷
void FindMine(char mine[][ROWS], char mineInfo[][ROWS], int row, int col);
//判断一个位置周围有多少雷
int Saomiao(char mine[][COLS], int i, int j)
//展开附近没有雷的区域
void PutZhan(char mine[][ROWS], char mineInfo[][ROWS], int i, int j)
//判断雷是不是都排出来了
int isWin(char mineInfo[][ROWS], int row, int col)

初始化棋盘的部分

//初始化棋盘
void InitBorad(char board[][ROWS], int row, int col, int set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = set;	
		}
	}
}

打印棋盘部分

//打印棋盘
void show(char board[][ROWS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("====================================\n");
	for (j = 0; j <= col-2; j++)
	{
		printf(" %d", j);
	}
	printf("\n");
	for (i = 1; i < row-1; i++)
	{
		printf(" %d ", i);
		for (j = 1; j < col-1; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

设置雷的部分

//设置雷
void SetMine(char mine[][ROWS], int row, int col)
{
	int x = 0;
	int y = 0;
	int i = 0, j = 0;
	printf("请输入侦查的位置: ");
	scanf("%d%d", &i, &j);
	int count = 0;
	do
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if ((mine[x][y] == '0') && ((x != i) && (y != j)))
		{
			mine[x][y] = '1';
			count++;
		}
	} while (MINE_NUM > count);
}

扫雷部分

//扫雷
void FindMine(char mine[][ROWS], char mineInfo[][ROWS], int row, int col)
{
	int i = 0, j = 0;
	while (isWin(mineInfo,ROWS,COLS)> MINE_NUM)
	{
		printf("请输入侦查的位置: ");
		scanf("%d%d", &i, &j);
		if (i >= 1 && i <= 9 && j >= 1 && j <= 9)
		{
			if (mineInfo[i][j] != '0')
			{
				if (mine[i][j] == '0')
				{
					int num = Saomiao(mine, i, j);
					mineInfo[i][j] = num + '0';//输入位置附近雷的数量
					if (mineInfo[i][j] == '0')
					{
						PutZhan(mine, mineInfo, i, j);//将一片都没有雷的地区展开
					}
					//show(mine, ROWS, COLS);
					show(mineInfo, ROWS, COLS);//每走完一步,打印新的棋盘
				}
				else
				{
					printf("砰~~被炸死了\n");
					break;
				}
			}
			else
			{
				printf("该位置已经被发现\n");
			}
			
		}
		else
		{
			printf("请输入合法的位置!请重新输入~\n");
		}
		
	}
	
}

扫雷过程中,判断所下位置周围的雷数量,并进行展开,判断输赢

//判断一个位置周围有多少雷
int Saomiao(char mine[][COLS], int i, int j)
{
	return mine[i][j - 1]
		+ mine[i][j + 1]
		+ mine[i - 1][j - 1]
		+ mine[i - 1][j]
		+ mine[i - 1][j + 1]
		+ mine[i + 1][j - 1]
		+ mine[i + 1][j]
		+ mine[i + 1][j + 1] - 8 * '0';
}


//展开附近没有雷的区域
void PutZhan(char mine[][ROWS], char mineInfo[][ROWS], int i, int j)
{
	if (Saomiao(mine, i, j) == 0)//表示该位置附近没有雷,可以展开
	{
		mineInfo[i][j] = '0';
		if ((i - 1) >= 1 && (i - 1) <= ROW && (j - 1) >= 1 && (j - 1) <= COL&&mineInfo[i - 1][j - 1] == '*')
			PutZhan(mine, mineInfo, i - 1, j - 1);
		if ((i) >= 1 && (i) <= ROW && (j - 1) >= 1 && (j - 1) <= COL&&mineInfo[i][j - 1] == '*')
			PutZhan(mine, mineInfo, i, j - 1);
		if ((i + 1) >= 1 && (i + 1) <= ROW && (j - 1) >= 1 && (j - 1) <= COL&&mineInfo[i + 1][j - 1] == '*')
			PutZhan(mine, mineInfo, i + 1, j - 1);
		if ((i + 1) >= 1 && (i + 1) <= ROW && (j) >= 1 && (j) <= COL&&mineInfo[i + 1][j] == '*')
			PutZhan(mine, mineInfo, i + 1, j);
		if ((i + 1) >= 1 && (i + 1) <= ROW && (j + 1) >= 1 && (j + 1) <= COL&&mineInfo[i + 1][j + 1] == '*')
			PutZhan(mine, mineInfo, i + 1, j + 1);
		if ((i) >= 1 && (i) <= ROW && (i + 1) >= 1 && (j + 1) <= COL&&mineInfo[i][j + 1] == '*')
			PutZhan(mine, mineInfo, i, j + 1);
		if ((i - 1) >= 1 && (i - 1) <= ROW && (j + 1) >= 1 && (j + 1) <= COL&&mineInfo[i - 1][j + 1] == '*')
			PutZhan(mine, mineInfo, i - 1, j + 1);
		if ((i - 1) >= 1 && (i - 1) <= ROW && (j) >= 1 && (j) <= COL&&mineInfo[i - 1][j] == '*')
			PutZhan(mine, mineInfo, i - 1, j);
	}
	else
	{
		mineInfo[i][j] = Saomiao(mine, i, j) + '0';//返回该位置周围雷的数量
	}
}

//判断雷是不是都排出来了
int isWin(char mineInfo[][ROWS], int row, int col)
{
	int count = 0;//记录没有排出来位置的个数
	int i = 0, j = 0;
	for (i = 1; i < row - 1; i++)
	{
		for (j = 0; j < col - 1; j++)
		{
			if (mineInfo[i][j] == '*')
			{
				count++;
			}
		}
	}
	return count;
}

主函数部分

//打印菜单
void menu()
{
	printf("**********************************\n");
	printf("************ 0.退出 **************\n");
	printf("************ 1.游戏 **************\n");
	printf("**********************************\n");
}

//开始游戏
void game()
{
	//存放雷的信息
	char mine[ROWS][COLS] = { 0 };
	//排查雷的信息---》没有排查出来的话打印
	char mineInfo[ROWS][COLS] = { 0 };
	//还没有布置雷
	InitBorad(mine, ROWS, COLS, '0');
	//还没有排查出雷时的情况
	InitBorad(mineInfo, ROWS, COLS, '*');
	//打印棋盘
	show(mineInfo, ROWS, COLS);
    //设置雷的位置
	SetMine(mine, ROW, COL, '*');
	//打印二维数组
	//show(mine, ROWS, COLS);//打印雷的位置
	show(mineInfo, ROWS, COLS);//打印显示棋盘中的分布
	//扫雷
	FindMine(mine, mineInfo, ROW, COL);

}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//设置随机种子
	do
	{
		menu();//打印菜单
		printf("请输入你的选择:  ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("请输入正确的数字!\n");
			break;
		}
	} while (input);
	return 0;
}

头文件

#ifndef __GAME_H__
#define __GAME_H__

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 9
#define COL 9

#define MINE_NUM 10

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

//初始化棋盘
void InitBorad(char board[][ROWS], int row, int col,int set);
//打印棋盘
void show(char board[][ROWS], int row, int col);
//设置雷
void SetMine(char board[][ROWS], int row, int col);
//扫雷
void FindMine(char mine[][ROWS], char mineInfo[][ROWS], int row, int col);
#endif

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值