扫雷小游戏(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语言版)-创新互联
URL地址:https://www.cdcxhl.com/article16/eppdg.html

成都网站建设公司_创新互联,为您提供定制网站企业建站网站收录域名注册全网营销推广商城网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

微信小程序开发