【c语言】 我使用c语言基础做了一个老少皆宜的“国民小游戏【扫雷】“

前言

扫雷小游戏是一款非常优秀悠闲的小游戏,在各个pc端上都会有他的身影出现,我们学习了编程,为何不自己做一个游扫雷小戏游戏呢?说做就做,来先看一下大概的效果图。
在这里插入图片描述
在开始前,先来看看我们的游戏功能实现,要在哪一个文件中具体实现什么,要分开实现,这样方便我们未来的一个调整优化。

test.c - 扫雷游戏的测试

game.c - 游戏的实现

game.h - 游戏的函数声明

在这里插入图片描述

游戏菜单

在这里插入图片描述

menu函数实现简易菜单

游戏的开始我们是写了一个do循环(条件是输入的选项),如果选择的不等于0 ,那我们是一直在玩的。


地雷盘的实现

  • 我们先来看看棋盘
    在这里插入图片描述

我们这个小程序的规定是
雷----1
不是雷----0

在这里插入图片描述
但是可以看见上面的 蓝色1 ,这个并不是 ,**而是提示信息(提示周围有几个雷,**但是这个 蓝1和我们的 1冲突了,我们的1 设定的是雷,但是我们也需要提示信息,所以我们的解决方法是,创建2个棋盘,一个是放雷的,还有一个是显示周围雷的信息,

布雷的:
在这里插入图片描述

显示提示信息的:
在这里插入图片描述
以上是布置雷的相关想法,接下来来看一下,怎么实现排查雷吧。


盘查雷

首先有一个问题,来看下图
在这里插入图片描述
我要是想看这里有没有雷那么 ,它右边的一圈,和下面的周围是不是没有雷盘了,那可能会影响到游戏。
在这里插入图片描述

解决方法:
我们上面的灰色棋盘,是9*9的 ,但是为了不让他越界,我们可以试着扩大2行2列,变成11 * 11 :
在这里插入图片描述
我们先去game.h 定义我们需要的变量
在这里插入图片描述
test.c
在这里插入图片描述

在这里插入图片描述

初始化棋盘

mine的棋盘全部放0
show的棋盘全部放*
在这里插入图片描述
game.h定义
在这里插入图片描述
game.c 实现
在这里插入图片描述
char set 这个参数是可以改变的 ,前台传过来的值,这边是可以变化的,增加了灵活性


打印棋盘

test.c
在这里插入图片描述
game.h
在这里插入图片描述
game.c 函数的实现
在这里插入图片描述

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");

}

具体效果是这样的
在这里插入图片描述

以上代码棋盘显示出来了


布置雷

game.h定义雷
在这里插入图片描述
game.c实现设置雷的函数
算法思想:
1:布置10个雷
2:让这个10个雷下标随机
3:种雷
在这里插入图片描述

void SetMine(char mine[ROWS][COLS], int row, int col)
{
    
    
	//布置10个雷
	int count = 10;
	while (count)
	{
    
    
		//生产随机的下标
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0') {
    
     //看看当前格子是不是空的

			mine[x][y] = '1';	//如果是空的就种一颗雷

			count--;
		}
	}
}

test.c引用
在这里插入图片描述
可以看看自己布置的雷
在这里插入图片描述
成功了


排查雷

game.h定义一个变量 ,用于调整游戏难度,这个是雷的个数
在这里插入图片描述

game.h
在这里插入图片描述
game.c
在这里插入图片描述

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    
    
	//1、输入排查的坐标
	//2.检查坐标处是不是雷
		//(1) 是雷 = 炸死了
		//(2) 不是雷 - 统计坐标周围有几个雷- 存储排查雷的信息到show数组,游戏继续
	int x = 0;
	int y = 0;
	int win = 0; //定义一个变量,如果全部排查完了就 提示排查成功
	while (win < row*col - EASY_Count)  //game.h 定义的
	{
    
    
		printf("请输入要排查雷的坐标");
		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
			{
    
    
				//不是雷 统计周围有几个雷,xy
				int count = get_mine_count(mine,x,y);
				show[x][y]=count+'0';
				//显示排查的信息
				DisPlayBoard(show,row,col);
				win++;  //每进来一次就 记录一次
			}
		}
		else
		{
    
    
			printf("坐标不合法,请重新输入\n");
		}
	}	
	if (win==row * col -EASY_Count)  //如果计数的等于 空格子数就赢了
	{
    
    
		printf("恭喜你排雷成功\n");
		DisPlayBoard(mine, row, col);//看一下怎么炸死的
	}
}

显示雷的个数信息,不需要在头文件定义,因为它只是在FindMine函数里面起作用,加static 只在本文件里使用,别的文件不可以使用
在这里插入图片描述

//雷的个数信息
static int get_mine_count(char mine[ROWS][COLS],int x  , int y )
{
    
    
	return 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] +
		mine[x - 1][y + 1] - 8 * '0';
}

可以看看效果
刚刚那个代码放出来排查的信息
在这里插入图片描述
test.c 显示出来
在这里插入图片描述
来看看效果 这里图片已经是正常的了
在这里插入图片描述

来看看排雷成功的效果(这里是把雷改成80,棋盘是9*9 81格)
在这里插入图片描述
以上差不多扫雷基础已经成功了,当然这还有好多可以扩展的,展开,标记雷


源代码

扫雷小游戏

其他文章推荐

三字棋

.NET动态验证码

猜你喜欢

转载自blog.csdn.net/qq_46874327/article/details/116399651