用c语言编写扫雷程序

用c语言编写扫雷程序

test.c文件

1.头文件(本游戏所用到的头文件均一写入game.h中):

#include"game.h"
void menu()
{
	printf("***************************************************\n");
	printf("*************    1.play     0.exist       *********\n");
	printf("***************************************************\n");
}

2.此函数用一个变量接收玩家选择的值,决定游戏是否开始

void test()
{
	int input;
	do
	{
		menu();
		printf("请选择:> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("输入错误,请重新选择:\n");
		}
	} while (input);
}

3.main()函数:
调用test()函数实现是否开始游戏的功能

int main()
{
	srand((unsigned)time(NULL));
	test();
	system("pause");
	return 0;
}

4.若要开始游戏,调用test()函数中的game()函数
(本函数具体功能,详见注释)

void game()
{
	char Mine[ROWS][COLS];//定义准备设置雷的数组
	char Show[ROWS][COLS];//定义显示的数组
	Init_board(Mine, ROWS, COLS, '0');//初始化准备设置雷的数组,全为‘0’
	Init_board(Show, ROWS, COLS, '*');//初始化排雷的数组
	Set_mine(Mine, ROW, COL);//设置雷
	print_board(Show, ROW, COL);//打印要排查雷的数组
	print_board(Mine, ROW, COL);//打印已知雷位置的数组
	Find_mine(Mine,Show, ROW, COL);//排雷
}

game.h文件

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

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY 10
void Init_board(char arr[ROWS][COLS],int rows,int cols,char ret);//初始化准备设置雷和排雷的数组,全为‘0’
void game();
void Set_mine(char arr[ROWS][COLS], int row, int col);//设置雷
void print_board(char arr[ROWS][COLS], int row, int col);//打印要排查雷的数组,打印已知雷位置的数组
void Find_mine(char Mine[ROWS][COLS],char Show[ROWS][COLS], int row, int col);//排雷
void open_white(char Mine[ROWS][COLS],char Show[ROWS][COLS], int x,int y);//点非雷位置,展开一片空白

game.c文件

#include"game.h"
//初始化数组的函数,ret接收传过来的字符
void Init_board(char arr[ROWS][COLS], int rows, int cols, char ret)
{
	int i, j;
	for (i = 0; i < rows; i++)
	{
		for(j = 0; j < cols; j++)
		{
			arr[i][j] = ret;
		}
	}
}
//设置雷的函数
void Set_mine(char arr[ROWS][COLS], int row, int col)
{
	int x, y;
	int count = EASY;//共设置EASY个雷,循环次EASY次
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		//使雷设置在数组Mine_board[ROWS][ROWS]1-9列和1-9行,最外面一圈不必设置雷
		if ((x > 0 && x <=row) && (y > 0 && y <=col))
		{
			if (arr[x][y] == '0')//保证设雷的位置不重复
			{
				arr[x][y] = '1';
				count--;
			}
		}
	}
}
//打印ROW*COL
void print_board(char arr[ROWS][COLS], int row, int col)
{
	int i, j;
	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");
	}
	printf("\n\n");
}
//计算输入坐标周围8个位置的雷的个数,返回值为个数
int Get_mine(char Mine[ROWS][COLS], int x, int y)
{
	return Mine[x - 1][y + 1] +
		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] - 8 * '0';//由于数组类型为字符型,雷的个数为整型,这8个坐标的字符均需减去字符‘0’
}
//排雷函数
void Find_mine(char Mine[ROWS][COLS], char Show[ROWS][COLS], int row, int col)
{
	int win = 0;
	int x, y;
	while (win < row*col - 10)//win不超过除去10个雷的所有非雷的位置个数,表示雷未排完
	{
		printf("请输入要排查的坐标:>");
		scanf("%d%d", &x, &y);
		if ((x > 0 && x <= row) && (y > 0 && y <= col))
		{
			if (Mine[x][y] != '1')
			{
				int count = Get_mine(Mine, x, y);//将此处周围雷的个数赋给count
				Show[x][y] = count + '0';//转换为字符型,赋给此处的数组元素
				open_white(Mine,Show, x, y);
				print_board(Show, ROW, COL);//打印棋盘
				win++;//以此判断是否全部排雷完成
			}
			else
			{
				printf("很遗憾!你被炸死了,游戏结束\n");
				Show[x][y] = '1';
				print_board(Show, ROW, COL);
				break;
			}
		}
		else
		{
			printf("输入错误,请重新输入!\n");
		}
	}
	if (win >= row * col - 10)
	{
		printf("扫雷成功!\n");
	}
}
//点非雷位置,展开一片空白的函数
void open_white(char Mine[ROWS][COLS], char Show[ROWS][COLS],int x, int y)
{
	if (Get_mine(Mine, x, y) == 0)
	{
		Show[x][y] = ' ';
		if ((x - 1) > 0 && (y - 1) > 0 && (Show[x - 1][y - 1] == '*'))
			open_white(Mine, Show, x - 1, y - 1);
		if ((x - 1) > 0 && (y) > 0 && (Show[x - 1][y] == '*'))
			open_white(Mine, Show, x - 1, y);
		if ((x - 1) > 0 && (y + 1) > 0 && (Show[x - 1][y + 1] == '*'))
			open_white(Mine, Show, x - 1, y + 1);
		if ((x) > 0 && (y - 1) > 0 && (Show[x][y - 1] == '*'))
			open_white(Mine, Show, x, y - 1);
		if ((x) > 0 && (y + 1) > 0 && (Show[x][y + 1] == '*'))
			open_white(Mine, Show, x, y + 1);
		if ((x + 1) > 0 && (y - 1) > 0 && (Show[x + 1][y - 1] == '*'))
			open_white(Mine, Show, x + 1, y - 1);
		if ((x + 1) > 0 && (y) > 0 && (Show[x + 1][y] == '*'))
			open_white(Mine, Show, x + 1, y);
		if ((x + 1) > 0 && (y + 1) > 0 && (Show[x + 1][y + 1] == '*'))
			open_white(Mine, Show, x + 1, y + 1);
	}
	else
		Show[x][y] = Get_mine(Mine,x,y) + '0';
}
	

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值