【C语言】扫雷2.0完善版——最接近原版的扫雷

今天我们用C语言实现一个扫雷游戏,升级版哦,可以展开,标记,取消标记,记录已排查坐标数。直接来看看效果吧除了没用鼠标点以外,是很接近原版的。扫雷主体思路扫雷游戏主体的实现1.游戏菜单的实现2.初始化棋盘/雷盘3.打印棋盘/雷盘4.布置雷5.排查雷6.展开雷生成Release版全部代码game.hgame.ctest.c 扫雷主体思路需要实现扫雷游戏...
摘要由CSDN通过智能技术生成

今天我们用C语言实现一个扫雷游戏,升级版哦

可以展开,标记,取消标记,记录已排查坐标数

直接来看看效果吧

除了没用鼠标点以外,是很接近原版的。

目录

扫雷主体思路

扫雷游戏主体的实现

 1.游戏菜单的实现

 2.初始化棋盘/雷盘

 3.打印棋盘/雷盘

 4.布置雷 

 5.排查雷/标记雷的实现

5.1 排查雷

 5.2 标记雷/取消标记

5.3 判断输赢和显示当前已排查的坐标

           6.展开雷

生成Release版         

全部代码

game.c

game.h

tese.c





                                        扫雷主体思路

需要实现扫雷游戏,我们可以先看看别人的扫雷是如何实现的, 

 可以看出,棋盘是具有两层的,第一层是我们想让玩家直接可以看到的,第二层则是隐藏起来的,存放的是雷。

所以我们需要生成两个二维数组,一个二维数组,用来存放棋盘,另一个二维数组用来存放雷(可以称为雷盘)。

棋盘初始化为*

雷盘初始化为0 然后随机放入雷(随机就可以想到用rand函数)

然后再进行排查雷,展开雷区等功能的实现。

可能有点抽象,我们来实现看看吧。等实现完就会觉得其实并不难啦,很好理解的。


                                    扫雷游戏主体的实现

我们先创建三个文件

 1.游戏菜单的实现

我们需要打印一个简单的游戏菜单,就像我们平时玩游戏也是有菜单的,让玩家选择。

使用do while循环语句与switch 选择语句 实现

代码实现如下:

void menu()
{
    //  \033[34m \033[0m 是实现字体颜色 34代表蓝色 31代表红色
	printf("*********************\n");
	printf("******\033[34m 1.play\033[0m *******\n");
	printf("******\033[31m 0.exit\033[0m *******\n");
	printf("*********************\n");
}
void test()
{
   int input = 0;
	do
	{
		//菜单
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		system("cls");//输入后清理屏幕
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误!\n");
			break;
		}
	} while (input);
}

int main()
{
	test();
	return 0;
}

这里的菜单 1.play   0.exit 字体颜色 进行了设置,我觉得这样看起来有趣一些,不那么的枯燥。

2.初始化棋盘/雷盘

我们需要创建两个char类型二维数组

一个用于存放展示给玩家看的棋盘,另一个用于存放雷。

为了方便后期的更改,我们可以用#define 定义常量 作为数组大小。

我们创建个9*9的棋盘吧

 但是这里有一个问题,如果我们创建 9*9的,想要展示给玩家看的就是9*9的棋盘,如果玩家要查找棋盘边缘的坐标,周围的雷的数量,

像上面图中那样,就会出现数组越界访问的问题,所以我们最好把数组创建大一点,打印的时候仍然打印9*9的,但是创建数组,可以创建11*11的这样就避免了数组越界的情况。

所以可以这样定义

 现在来看看代码实现:

test.c里
//扫雷游戏的实现
void game()
{
	//创建棋盘
	//mine数组是用来存放布置好的雷的信息
	char mine[ROWS][COLS] = { 0 };//'0'
	//show数组是存放排查出的雷的信息
	char show[ROWS][COLS] = { 0 };// '*'
	//创建棋盘初始化
	InisBoard(mine, ROWS, COLS,'0');//传个字符'0'过去,代表把雷盘初始化为全'0'
	InisBoard(show, ROWS, COLS, '*'); //传个字符'*'过去,代表把雷盘初始化为全'0'
	
}

game.c里

//初始化mine雷盘/show棋盘 都可以调用这个函数实现
void InisBoard(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;
		}
	}
}

gama.h里

#define ROW 9  // 展示给玩家看的行
#define COL 9  //

#define ROWS ROW+2  //实际创建的行
#define COLS COL+2

//初始化雷盘的声明
void InisBoard(char arr[ROWS][COLS], int rows, int cols,char set);

头文件别忘了引用哦,我代码块里没有加进去,但是文章末尾的完整代码里都会有的。

3.打印棋盘/雷盘

实际游戏中雷盘不会打印给玩家看的。 

为了方便玩家识别行列位置,我们可以加上打印行号 和列号

为了更加接近平时玩的扫雷,我设置了不同数字以不同颜色显示,1 蓝色 2白色 3黄色 标记(!)雷红色显示

来看看代码吧:

  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 34
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值