C语言实现的扫雷

本文详细介绍了使用C语言实现扫雷游戏的程序设计过程,包括程序结构、模块划分及核心功能实现,如初始化、布雷、显示地图和游戏控制等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序结构

程序结构图

扫雷程序结构图

程序入口模块

  • main函数主要用来作为整个程序的入口,它的功能是打印菜单并接受用户的输入。如果用户输入0则直接退出程序。如果用户输入1则进入游戏控制模块。当用户输入其他的值的时候,告诉用户输入有误,请重新输入。
#define EASY 10
#define ROW 9
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2
void menu()
{
	printf("****************************\n");
	printf("**     1. play   0. exit  **\n");
	printf("****************************\n");
}
int main()
{
	int input = 0;
	do {
		menu();
		printf("请选择:> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			play();
			break;
		case 0:
			printf("游戏已退出!\n");
			break;
		default:
			printf("选择有误!请重新输入");
			break;
		}
	} while (input);
	return 0;
}

游戏控制模块

  • 游戏控制模块的主要功能是实现游戏的整个逻辑控制。它做的事情主要是将初始化模块打印地图模块布雷模块统计雷的数量模块以及扫雷模块合理的组织起来进而实现整个游戏的逻辑控制。
void play() 
{
	char bomb[ROWS][COLS];
	char show[ROWS][COLS];
	srand((unsigned)time(NULL));
	//1.初始化
	init_board(bomb, ROWS, COLS, '0');
	init_board(show, ROWS, COLS, '*');
	display_board(show, ROW, COL);
	//2.布雷
	set_bomb(bomb, ROW, COL);
	display_board(bomb, ROW, COL);
	//3.扫雷
	find_bomb(bomb, show, ROW, COL);

}

初始化模块

  • 初始化模块的主要功能是将模拟地图的数组char board[ROWS][COLS]中的每个元素都初始化为参数ch指定的字符。
void init_board(char board[ROWS][COLS], int rows, int cols, char ch)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = ch;
		}
	}
}

打印地图模块

  • 打印棋盘模块的主要功能是在DOS界面下,根据数组char board[ROW][COL]中的内容模拟打印出一个地图。
void display_board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("--------------------\n");
	printf("0 1 2 3 4 5 6 7 8 9\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("--------------------\n");

}

布雷模块

  • 布雷模块的主要功能是通过随机数函数rand()产生合法的随机坐标(x, y),并在地图上随机地布上EASY个雷,其中EASY是一个宏定义常量。
void set_bomb(char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = 0;
	while (count < EASY) {
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count++;
		}
	}
}

统计雷的数量模块

  • 统计雷的数量模块的主要功能是计算坐标(x, y)周围的格子上有多少个雷,并将雷的个数作为函数的返回值。
char get_bomb_num(char board[ROWS][COLS], int x, int y)
{
	return 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]
		+ board[x][y + 1]+ board[x - 1][y + 1] - 7 * '0';
}

扫雷模块

  • 扫雷模块的主要功能是获得用户输入的位置(x, y)并判断用户的输入是否合法。如果用户的输入是合法的就接着判断看用户是否踩到了雷,如果踩到了雷,就告诉用户游戏结束 ,并将雷的分布图打印出来。如果用户没有踩到雷,就通过调用get_bomb_num(bomb, x, y)来获得雷的个数,并将show地图的对应位置置为相应的值,然后更新地图。继续这个过程,直到踩到雷或者把雷扫光,游戏才会结束。
void find_bomb(char bomb[ROWS][COLS],\ 
     char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = 0;
	while (count < row * col - EASY) 
	{
		printf("请输入要排雷的位置:> ");
		scanf("%d %d", &x, &y);
		if (x > 0 && x <= row && y > 0 && y <= col) 
		{
			if (bomb[x][y] == '1')
			{
				printf("恭喜你!你被炸死了!~");
				display_board(bomb, ROW, COL);
				break;
			}
			else 
			{
				show[x][y] = get_bomb_num(bomb, x, y);
				display_board(show,ROW,COL);
				count++;

			}
		}
		else 
		{
			printf("输入位置不合法,请重新输入!~");
		}

	}
	if (count == row * col - EASY)
		printf("恭喜你排雷成功!");
}

程序源码

  • 点击下面的程序源码可以查看并下载我的程序代码

        程序源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值