C语言实现扫雷(完整版)

作者介绍:友友们好我是沐曦希,可以叫我小沐
作者主页:沐曦希的个人博客主页.
作者的gitee:https://gitee.com/muxi-c-language.
零基础学习C语言系列:
https://blog.csdn.net/m0_68931081/category_11742786.html.
小沐和友友们一样喜欢编辑,天天敲代码,沉迷学习,日渐消瘦。很荣幸能向大家分享我的所学,和大家一起进步,成为合格的卷王。✨如果文章有错误,欢迎在评论区✏️指正。那么开始今天的学习吧!

文章目录

  • 扫雷游戏
      • ✨游戏介绍
      • 游戏菜单
      • ✨雷盘的初始化
      • ✨布置雷
      • 排查雷
      • 标记雷坐标
      • 获取雷的个数
      • 递归展开一片
  • 完整代码
      • ✨game.h
      • test.c
      • game.c
  • 写在最后

C语言实现扫雷(完整版)_第1张图片

扫雷游戏

✨游戏介绍

C语言实现扫雷(完整版)_第2张图片

大家都应该玩过扫雷游戏,上图是通过代码编写的雷盘,通过输入坐标进行扫雷。例如:
C语言实现扫雷(完整版)_第3张图片
输入坐标(1,1),显示1,表示该坐标附近有一个雷,如此下去,直到把所有的没有雷的位置全部翻完或者踩到雷,则游戏结束。
以下用test.c来测试游戏的逻辑,并打印游戏菜单。
game.h作为游戏的头文件,进行函数的声明。
game.c作为游戏的功能实现,是游戏代码实现的核心。

游戏菜单

#include
void meau()
{
	printf("**********************************\n");
	printf("*********   1.开始游戏    ********\n");
	printf("*********   0.退出游戏     *******\n");
	printf("**********************************\n");
}
int main()
{
	int input;
	srand((unsigned int)time(NULL));
	do
	{
		meau();
		printf("请输入选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始扫雷!\n");
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
}

C语言实现扫雷(完整版)_第4张图片

✨雷盘的初始化

通过建立两个二维数组,一个初始为*供玩家扫雷,并存储玩家游玩的过程,另一个初始化为0,该数组不能进行打印,存储布置雷的信息。

//game.h
#include
void meau();
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define count 10
void Initbord(char board[ROWS][COLS], int rows, int cols, char set);
void DisPaly(char board[ROWS][COLS], int row, int col);
//test.c
#include"game.h"
void game()
{
	char mine[ROWS][COLS] ;//存放布置好的雷的信息
	char show[ROWS][COLS] ;//存放排查好的雷的信息
	Initbord(mine, ROWS, COLS,'0');//初始化布置好的雷的数组全为‘0’,雷则为‘1’
	Initbord(show, ROWS, COLS,'*');//初始化排查好的雷的信息,全为‘*’,数字表示该数字周围有多少个雷。
}
//game.c
void Initbord(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}
void DisPaly(char board[ROWS][COLS], int row, int col)
{
	int j = 0;
	printf("-----扫雷游戏-----\n");
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}
	printf("\n");
	int i = 0;
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("-----扫雷游戏-----\n");
}

✨布置雷

void SetMine(char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int a = count;
	while (a)
	{
		x = rand() % row+1;
		y = rand() % col+1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			a--;
		}
	}
}

排查雷

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 - count)
	{
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (show[x][y] != '*')
			{
				printf("该坐标已被排除,不能重复排除!\n");
			}
			else
			{
				if (mine[x][y] == '1')
				{
					printf("很遗憾,你被炸死了!\n");
				    DisPaly(mine, row, col);
					break;
				}
				else
				{
					win++;
					int set = get_mine_conut(mine, x, y);
					show[x][y] = set + '0';
					DisPaly(show, row, col);
					int c = 0;
					printf("是否需要标记雷的位置,如果需要请输入1,不需要输入0!请输入:>");
					scanf("%d", &c);
					if (c == 1)
					{
						Mark(show, row, col);
					}
				}
			}
		}
		else
		{
			printf("输入的坐标超出范围,请重新输入!\n");
		}
	}
	if (win == row * col - count)
	{
		printf("恭喜你,挑战成功!\n");
		DisPaly(mine, row, col);
	}
}

标记雷坐标

void Mark(char show[ROWS][COLS], int row, int col)
{
	int input = 0;
		DisPaly(show, row, col);
		int x = 0;
		int y = 0;
			printf("请输入需要标记的坐标:>");
			scanf("%d %d", &x, &y);
			if (x >= 1 && x <= row && y >= 1 && y <= col)
			{
				if (show[x][y] == '*')
				{
					show[x][y] = '/';
					DisPaly(show, row, col);
				}
				else
				{
					printf("该坐标已被排除过,请重新输入。\n");
				}
			}
			else
			{
				printf("输入的坐标超出范围,请重新输入。\n");
			}
			printf("是否需要继续标记,如果需要请输入1,不需要请输入0。请输入选择:>");
			scanf("%d", &input);
			if (input == 1)
			{
				Mark(show, row, col);
			}
}

获取雷的个数

int get_mine_conut(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][y + 1] + 
		mine[x + 1][y - 1] + 
		mine[x + 1][y] + 
		mine[x + 1][y + 1]-8*'0';
}

递归展开一片

void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col)
{

	if (row >= 1 && row <= ROW && col >= 1 && col <= COL)
	{
		int a = sum(board, row, col);
		if (a != 0)
		{
			show[row][col] = a + '0';
		}
		else if (show[row][col] != '_')
		{
			show[row][col] = '_';
			int i = 0, j = 0;
			for (i = row - 1; i <= row + 1; i++)
			{
				for (j = col - 1; j <= col + 1; j++)
				{

					Openboard(show, board, i, j);
				}
			}
		}
		else
		{
			return;
		}
	}
}

完整代码

✨game.h

#include
#include
#include
void meau();
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define count 10
void Initbord(char board[ROWS][COLS], int rows, int cols, char set);
void DisPaly(char board[ROWS][COLS], int row, int col);
void SetMine(char board[ROWS][COLS],int row,int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
void Openboard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
void Mark(char show[ROWS][COLS], int row, int col);

test.c

#include"game.h"
void game()
{
	char mine[ROWS][COLS] ;
	char show[ROWS][COLS] ;
	Initbord(mine, ROWS, COLS,'0');
	Initbord(show, ROWS, COLS,'*');
	SetMine(mine, ROW, COL);
	DisPaly(show, ROW, COL);
	FindMine(mine, show, ROW, COL);
}
int main()
{
	int input;
	srand((unsigned int)time(NULL));
	do
	{
		meau();
		printf("请输入选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始扫雷!\n");
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
}

game.c

#include"game.h"
void meau()
{
	printf("**********************************\n");
	printf("*********   1.开始游戏    ********\n");
	printf("*********   0.退出游戏     *******\n");
	printf("**********************************\n");
}
void Initbord(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int a = count;
	while (a)
	{
		x = rand() % row+1;
		y = rand() % col+1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			a--;
		}
	}
}
void DisPaly(char board[ROWS][COLS], int row, int col)
{
	int j = 0;
	printf("-----扫雷游戏-----\n");
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}
	printf("\n");
	int i = 0;
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("-----扫雷游戏-----\n");
}
int get_mine_conut(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][y + 1] + 
		mine[x + 1][y - 1] + 
		mine[x + 1][y] + 
		mine[x + 1][y + 1]-8*'0';
}
void Mark(char show[ROWS][COLS], int row, int col)
{
	int input = 0;
		DisPaly(show, row, col);
		int x = 0;
		int y = 0;
			printf("请输入需要标记的坐标:>");
			scanf("%d %d", &x, &y);
			if (x >= 1 && x <= row && y >= 1 && y <= col)
			{
				if (show[x][y] == '*')
				{
					show[x][y] = '/';
					DisPaly(show, row, col);
				}
				else
				{
					printf("该坐标已被排除过,请重新输入。\n");
				}
			}
			else
			{
				printf("输入的坐标超出范围,请重新输入。\n");
			}
			printf("是否需要继续标记,如果需要请输入1,不需要请输入0。请输入选择:>");
			scanf("%d", &input);
			if (input == 1)
			{
				Mark(show, row, col);
			}
}
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 - count)
	{
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (show[x][y] != '*')
			{
				printf("该坐标已被排除,不能重复排除!\n");
			}
			else
			{
				if (mine[x][y] == '1')
				{
					printf("很遗憾,你被炸死了!\n");
				    DisPaly(mine, row, col);
					break;
				}
				else
				{
					win++;
					int set = get_mine_conut(mine, x, y);
					show[x][y] = set + '0';
					DisPaly(show, row, col);
					int c = 0;
					printf("是否需要标记雷的位置,如果需要请输入1,不需要输入0!请输入:>");
					scanf("%d", &c);
					if (c == 1)
					{
						Mark(show, row, col);
					}
				}
			}
		}
		else
		{
			printf("输入的坐标超出范围,请重新输入!\n");
		}
	}
	if (win == row * col - count)
	{
		printf("恭喜你,挑战成功!\n");
		DisPaly(mine, row, col);
	}
}

void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col)
{

	if (row >= 1 && row <= ROW && col >= 1 && col <= COL)
	{
		int a = sum(board, row, col);
		if (a != 0)
		{
			show[row][col] = a + '0';
		}
		else if (show[row][col] != '_')
		{
			show[row][col] = '_';
			int i = 0, j = 0;
			for (i = row - 1; i <= row + 1; i++)
			{
				for (j = col - 1; j <= col + 1; j++)
				{

					Openboard(show, board, i, j);
				}
			}
		}
		else
		{
			return;
		}
	}
}

写在最后

那么今天的学习就到这里了。友友们觉得不错的可以给个关注,点赞或者收藏哦!感谢各位友友们的支持。以下的代码希望各位大佬们自行检验哦,毕竟亲手操作让记忆更加深刻。

你的❤️点赞是我创作的动力的源泉
你的✨收藏是我奋斗的方向
你的关注是对我最大的支持
你的✏️评论是我前进的明灯
创作不易,希望大佬你支持一下小沐吧

下一期见了!

你可能感兴趣的:(游戏,c语言)