扫雷小游戏(C语言版)-创新互联

文章目录
  • 1.案例分析
  • 2.解题思路
  • 3.具体实现
    • 3.1文件创建
    • 3.2设置游戏界面
    • 3.3雷盘的初始化
    • 3.4打印雷盘
    • 3.5布雷
    • 3.6排查雷
  • 4.完整代码
    • 4.1game.h文件
    • 4.2game.c文件
    • 4.3test.c文件

成都创新互联公司始终致力于在企业网站建设领域发展。秉承“创新、求实、诚信、拼搏”的企业精神,致力为企业提供全面的网络宣传与技术应用整体策划方案,为企业提供包括“网站建设、响应式网站、手机网站建设、微信网站建设、微信小程序开发商城网站建设、平台网站建设秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。1.案例分析

扫雷是一款经典的小游戏,让我们用C语言来实现一遍吧!
如下图所示,当我们点击一个方块时,如果该方块下方不是雷,那么它就会显示该方块四周有几个雷
如果是雷的话,游戏结束
直到玩家找出所有不是雷的方块,游戏胜利

在这里插入图片描述

2.解题思路

在这里插入图片描述
在这里插入图片描述

3.具体实现 3.1文件创建

为了养成良好的编程习惯,方便代码的管理,创建三个文件
扫雷的实现需要多个模块的功能相互串联,多个文件可以分别处理各自模块的功能,能更好处理各个模块之间的逻辑并且便于后期调试,也使得代码的可读性提高

在这里插入图片描述在这里插入图片描述

3.2设置游戏界面
void menu()
{printf("************************************\n");
	printf("*****1.Play           0.exit  ******\n");
	printf("************************************\n");
}

int main()
{srand((unsigned int)time(NULL));
	int input = 0;
	do
	{menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{case 1:game();
			break;
		case 0:printf("退出\n");
			break;
		default:
			printf("选择错误,请重新选择:\n");
			break;
		}
	} while (input);
	return 0;
}

在game()函数中,调用各个功能

void game()
{char mine[ROWS][COLS] = {'0'};//存放布置好的雷的信息
	char show[ROWS][COLS] = {'*'};//存放排查的雷的信息
	//初始化
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	//打印
	DisPlayBoard(show, ROW, COL);
	//DisPlayBoard(mine, ROW, COL);

	//布雷
	setMine(mine, ROW, COL);
	//DisPlayBoard(mine, ROW, COL);
	//排查雷
	FindMine(mine,show,ROW,COL);

}
3.3雷盘的初始化

在此,设置两个雷盘
mine雷盘:只存放雷的信息在未埋雷之前,雷盘中所有位置均为‘0’
show雷盘:存放排查的雷的信息在未排查之前,雷盘中所有位置均为‘*’

//board:传过来的雷盘
//set:雷盘中放的元素
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;
	int j = 0;
	for (i = 0; i< rows; i++)
	{for (j = 0; j< cols; j++)
		{	board[i][j] = set;
		}
	}
}
3.4打印雷盘

为了玩家方便选择位置,在雷盘中也要标记出行、列

void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;
	int j = 0;
	printf("----------扫雷------------\n");
	//打印行号
	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 ", board[i][j]);
		}
		printf("\n");
	}
	printf("-------------------------\n");
}
3.5布雷

雷的布置是随机的,因此采用rand()函数产生1-9的随机数,来实现随机坐标布雷
雷的布置均在wine雷盘中

void setMine(char mine[ROWS][COLS], int row, int col)
{int count = easy_count;//布置10个雷
	while (count)
	{int x = rand() % row + 1;
		int y = rand() % col + 1;
		//判断该位置是否有雷
		if (mine[x][y] == '0')
		{	mine[x][y] = '1';
			count--;
		}
		//若该位置已有雷,则重新生成随机坐标
	
3.6排查雷

雷的排查首先检查该位置是不是雷
如果是雷:被炸死,游戏结束
如果不是雷:显示该坐标周围雷的个数

//统计周围雷的个数
static int get_mine_count(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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{//1.输入排查的坐标,检查坐标
	//2.判断是不是雷
		//是,很遗憾你被炸了,游戏结束,打印一下所有雷的位置
		//不是,统计该坐标周围有几个雷,然后将雷的数量显示在该坐标上
	int x = 0;
	int y = 0;
	int win = 0;
	//判断排完的位置的个数 与雷盘中安全位置的关系
	while (winprintf("请输入你要排查的坐标:");
		scanf("%d%d", &x, &y);
		//判断坐标合法性
		if ((x >= 1 && x<= row) && (y >= 1 && y<= col))
		{	if (mine[x][y] == '1')
			{		printf("很遗憾,你被炸死了\n");
				//让你死的明白,打印一下雷区
				DisPlayBoard(mine, row, col);
				break;
			}
			else
			{		//不是雷,统计周围几个雷
				int count = get_mine_count(mine, x, y);
				//由于数组中放的是字符,所以要加上‘0’
				show[x][y] = count + '0';
				DisPlayBoard(show, row, col);
				win++;
			}
		}
		else
		{	printf("坐标不合法,请重新输入!\n");
		}
	}
	//安全位置全部找到
	if (win == row*col - easy_count)
	{printf("恭喜你,排雷成功!\n");
		printf("雷区分布如下:\n");
		DisPlayBoard(mine, row, col);
	}
}
4.完整代码 4.1game.h文件
#include//显示雷盘的大小
#define ROW 9
#define COL 9
//实际雷盘的大小
#define ROWS ROW+2
#define COLS COL+2
//雷的数量
#define easy_count 79

//初始化雷盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//打印雷盘
void DisPlayBoard(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);
4.2game.c文件
#include"game.h"

//初始化雷盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;
	int j = 0;
	for (i = 0; i< rows; i++)
	{for (j = 0; j< cols; j++)
		{	board[i][j] = set;
		}
	}
}
//打印雷盘
void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;
	int j = 0;
	printf("----------扫雷------------\n");
	//打印行号
	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 ", board[i][j]);
		}
		printf("\n");
	}
	printf("-------------------------\n");
}
void setMine(char mine[ROWS][COLS], int row, int col)
{int count = easy_count;//布置10个雷
	while (count)
	{int x = rand() % row + 1;
		int y = rand() % col + 1;
		//判断该位置是否有雷
		if (mine[x][y] == '0')
		{	mine[x][y] = '1';
			count--;
		}
		//若该位置已有雷,则重新生成随机坐标
	}
}
//统计周围雷的个数
static int get_mine_count(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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{//1.输入排查的坐标,检查坐标
	//2.判断是不是雷
		//是,很遗憾你被炸了,游戏结束,打印一下所有雷的位置
		//不是,统计该坐标周围有几个雷,然后将雷的数量显示在该坐标上
	int x = 0;
	int y = 0;
	int win = 0;
	//判断排完的位置的个数 与雷盘中安全位置的关系
	while (winprintf("请输入你要排查的坐标:");
		scanf("%d%d", &x, &y);
		//判断坐标合法性
		if ((x >= 1 && x<= row) && (y >= 1 && y<= col))
		{	if (mine[x][y] == '1')
			{		printf("很遗憾,你被炸死了\n");
				//让你死的明白,打印一下雷区
				DisPlayBoard(mine, row, col);
				break;
			}
			else
			{		//不是雷,统计周围几个雷
				int count = get_mine_count(mine, x, y);
				//由于数组中放的是字符,所以要加上‘0’
				show[x][y] = count + '0';
				DisPlayBoard(show, row, col);
				win++;
			}
		}
		else
		{	printf("坐标不合法,请重新输入!\n");
		}
	}
	//安全位置全部找到
	if (win == row*col - easy_count)
	{printf("恭喜你,排雷成功!\n");
		printf("雷区分布如下:\n");
		DisPlayBoard(mine, row, col);
	}
}
4.3test.c文件
#include"game.h"
#include#includevoid menu()
{printf("************************************\n");
	printf("*****1.Play           0.exit  ******\n");
	printf("************************************\n");
}
void game()
{char mine[ROWS][COLS] = {'0'};//存放布置好的雷的信息
	char show[ROWS][COLS] = {'*'};//存放排查的雷的信息
	//初始化
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	//打印
	DisPlayBoard(show, ROW, COL);
	//DisPlayBoard(mine, ROW, COL);

	//布雷
	setMine(mine, ROW, COL);
	//DisPlayBoard(mine, ROW, COL);
	//排查雷
	FindMine(mine,show,ROW,COL);

}
int main()
{srand((unsigned int)time(NULL));
	int input = 0;
	do
	{menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{case 1:game();
			break;
		case 0:printf("退出\n");
			break;
		default:
			printf("选择错误,请重新选择:\n");
			break;
		}
	} while (input);
	return 0;
}

欢迎大家批评指正

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站标题:扫雷小游戏(C语言版)-创新互联
网页路径:http://myzitong.com/article/eppdg.html