扫雷

头文件

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

#define ROW 9     //显示的扫雷盘
#define COL 9

#define ROWS 11	  //内置的扫雷盘
#define COLS 11

#define Mine_number 10	//雷的个数

void Set_Mine(char Mine[ROWS][COLS], int row, int col, int n);			//放雷
//n为放雷个数

void Print(char Mine[ROWS][COLS], int row, int col);			//显示扫雷盘

void In_mine(char Mine[ROWS][COLS], int row, int col);			//内置扫雷盘重置
//需要将附近的雷数显示 内置为符号数字

void Out_mine(char Show[ROWS][COLS], int row, int col);			//玩家扫雷盘重置
// 用'*'遮盖下方的内置扫雷盘

int Find_mine(char Mine[ROWS][COLS],char Show[ROWS][COLS], int row, int col);			//找雷

头文件实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"mine_clearance扫雷.h"

void In_mine(char Mine[ROWS][COLS], int row, int col)			//内置扫雷盘重置
{
	memset(Mine, '0', row*col * sizeof(Mine[0][0]));
}

void Out_mine(char Show[ROWS][COLS], int row, int col)			//玩家扫雷盘重置
{
	memset(Show, '*', row*col * sizeof(Show[0][0]));
}

void Print(char Mine[ROWS][COLS], int row, int col)				//显示扫雷盘
{
	int i = 0;
	int j = 0;
	for (i = 0; i <= row; i++)			//打印行标
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)			
	{
		for (j = 1; j <= col; j++)
		{
			if (j == 1)					//顺便打印列标
				printf("%d %c", i, Mine[i][j]);
			else
				printf(" %c", Mine[i][j]);
		}
		printf("\n");
	}
}

void Set_Mine(char Mine[ROWS][COLS], int row, int col, int n)			//放雷
{
	int x = 0;
	int y = 0;
	while (n)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (Mine[x][y] == '0')
		{
			Mine[x][y] = '1';
			n--;
		}
	}
}

static void Move_Mine(char Mine[ROWS][COLS], int x, int y)			//当第一次猜到了 将雷移开
{
	Mine[x][y] = '0';				//将雷清掉
	int a = 0;
	int b = 0;
	while (1)
	{
		a = rand() % ROW + 1;
		b = rand() % COL + 1;
		if (Mine[a][b] != '1')			//防止随机到的雷放到原本有雷的区域
		{
			Mine[a][b] = '1';
			break;
		}
	}
}

static int Mine_Count(char Mine[ROWS][COLS], int x, int y)			//统计一圈雷的个数
{
	int number = 0;
	number = 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';
	return number;
}

static int Open_Mine(char Mine[ROWS][COLS],char Show[ROWS][COLS], int x, int y)
{
	if (Mine_Count(Mine, x, y) == 0)
	{
		Show[x][y] = '0';
		if ((x - 1) >= 1 && (x - 1) <= ROW && (y - 1) >= 1 && (y - 1) <= COL && Show[x - 1][y - 1] == '*')
			Open_Mine(Mine, Show, x - 1, y - 1);
		if ((x) >= 1 && (x) <= ROW && (y - 1) >= 1 && (y - 1) <= COL && Show[x][y - 1] == '*')
			Open_Mine(Mine, Show, x, y - 1);
		if ((x + 1) >= 1 && (x + 1) <= ROW && (y - 1) >= 1 && (y - 1) <= COL && Show[x + 1][y - 1] == '*')
			Open_Mine(Mine, Show, x + 1, y - 1);
		if ((x + 1) >= 1 && (x + 1) <= ROW && (y) >= 1 && (y) <= COL && Show[x + 1][y] == '*')
			Open_Mine(Mine, Show, x + 1, y);
		if ((x + 1) >= 1 && (x + 1) <= ROW && (y + 1) >= 1 && (y + 1) <= COL && Show[x + 1][y + 1] == '*')
			Open_Mine(Mine, Show, x + 1, y + 1);
		if ((x) >= 1 && (x) <= ROW && (y - 1) >= 1 && (y - 1) <= COL && Show[x][y - 1] == '*')
			Open_Mine(Mine, Show, x, y - 1);
		if ((x - 1) >= 1 && (x - 1) <= ROW && (y + 1) >= 1 && (y + 1) <= COL && Show[x - 1][y + 1] == '*')
			Open_Mine(Mine, Show, x - 1, y + 1);
		if ((x - 1) >= 1 && (x - 1) <= ROW && (y) >= 1 && (y) <= COL && Show[x - 1][y] == '*')
			Open_Mine(Mine, Show, x - 1, y);
	}
	else
	{
		Show[x][y] = Mine_Count(Mine, x, y) + '0';
	}
	return 0;
}

static int Win(char Show[ROWS][COLS], int row, int col)			//获胜条件
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= col; j++)
		{
			if (Show[i][j] == '*')
				count++;
		}
	}
	return count;
}

int Find_mine(char Mine[ROWS][COLS],char Show[ROWS][COLS], int row, int col)			//找雷
{
	int x = 0;
	int y = 0;
	int flag = 1;		//判断是否为第一步
	while (Win(Show,row, col) != Mine_number)
	{
		//Print(Mine, ROW, COL);
		printf("请输入坐标:");
		scanf("%d %d", &x, &y);
		if (x < 1 || x > row || y < 1 || y > col)
		{
			printf("输入坐标有误\n");
		}
		if (Show[x][y] != '*')
		{
			printf("该坐标已经显示\n");
		}
		if (Mine[x][y] == '1' && flag == 1)		//第一次触雷
		{
			Move_Mine(Mine, x, y);				//移动雷
			Open_Mine(Mine, Show, x, y);		//将附近没有雷的地方开了
			Print(Show, ROW, COL);				//显示棋盘
			flag = 0;
		}
		if (Mine[x][y] == '1')					//待测试
		{
			printf("你被炸死了\n");
			Print(Mine, ROW, COL);
			return 0;
		}
		if (Mine[x][y] == '0')
		{
			Open_Mine(Mine, Show, x, y);
			Print(Show, ROW, COL);
			flag = 0;
		}
	}
	printf("成功扫雷\n");
	return 0;
}```

测试
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"mine_clearance扫雷.h"

void menu()
{
	{
		printf("**********************\n");
		printf("*****  1. play   *****\n");
		printf("*****  0. exit   *****\n");
		printf("**********************\n");
	}
}

void mine_clear()
{
	char Mine[ROWS][COLS];
	char Show[ROWS][COLS];
	In_mine(Mine, ROWS, COLS);
	Out_mine(Show, ROWS, COLS);
	Set_Mine(Mine, ROW, COL, Mine_number);
	Print(Show, ROW, COL);
	Find_mine(Mine, Show, ROW, COL);
}

int main()
{
	int number = 0;
	srand((unsigned)time(NULL));
	do
	{
		menu();
		scanf("%d", &number);
		switch(number)
		{
		case 1:
			mine_clear();
			break;
		case 0:
			break;
		default:
			printf("输入错误");
			break;
		}
	} while (number);
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值