2、【C_Game002_扫雷】递归展开非雷区域+标记清除雷+显示剩余雷的个数

本文介绍了使用C语言实现扫雷游戏的详细过程,包括初始化棋盘、埋雷、扫雷功能。扫雷功能实现了递归展开非雷区域,标记和取消标记雷,以及显示剩余雷的数量。文章通过多文件组织结构,分为测试模块和游戏模块,提供了一个完整的扫雷游戏解决方案。
摘要由CSDN通过智能技术生成

C语言_游戏目录

  1. C_Game001_三子棋
  2. C_Game002_扫雷


前言

  • 游戏规则:游戏是根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。不太了解的可以点击 链接 玩几把体验一下。
  • 设计思路:多文件组织完成9×9的扫雷游戏,分为测试模块和游戏模块:
    1. 首先制作一个菜单让玩家选择是玩游戏还是退出游戏;
    2. 接着我们开始制作扫雷的两个棋盘(一个存放布置好的雷的信息,一个存放排查出的雷的信息),并初始化和打印;
    3. 下一步开始埋雷,置1为雷,0为非雷;
    4. 雷埋好了就开始扫雷:第一次扫雷实现展开一片的操作使游戏可玩性增加,后续扫雷可以标记雷和取消标记,并显示剩余雷的个数。

一、测试模块test.c

测试逻辑:

  1. 首先,我们封装函数,实现菜单和选择功能。
#include "game.h"

void menu()
{
   
	printf("*********************\n");
	printf("*******1. play*******\n");
	printf("*******0. exit*******\n");
	printf("*********************\n");
}
void test()
{
   
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
   
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
   
		case 1:
			printf("开始游戏!\n");
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("选择错误!\n");
			break;
		}
	} while (input);
}
int main()
{
   
	test();
	return 0;
}

玩游戏至少要出现一次,这里我们使用do-while循环。

  1. 定义game函数:(以下函数需要声明和定义,详见game.h和game.c)
    1. 游戏定义两个二维数组,一个存放布置好的雷的信息,一个存放排查出的雷的信息,如果二者都只用一个二维数组的话后面的实现逻辑会比较麻烦,所以这里我们创建两个二维数组。
      char mine[ROWS][COLS] = { 0 };存放布置好的雷的信息;
      char show[ROWS][COLS] = { 0 };存放排查出的雷的信息;
    2. 初始化棋盘:click
      InitBoard(mine, ROWS, COLS, '0');将棋盘mine全部设为字符0
      InitBoard(show, ROWS, COLS, '*');将棋盘show全部设为字符*
    3. 打印棋盘:click
      DisplayBoard(mine,ROW,COL); 将布置的信息打印出来,可以先打印看一看效果;
      DisplayBoard(show, ROW, COL, EASY_COUNT);将排查出的雷的信息打印出来;
    4. 埋雷:SetMine(mine, ROW, COL); 在mine数组埋下10个雷,即将符号'0'置为'1'click
    5. 扫雷:FindMine(mine, show, ROW, COL); 玩家输入扫雷坐标进行扫雷;click
void game()
{
   
	char mine[ROWS][COLS] = {
    0 };
	char show[ROWS][COLS] = {
    0 };

	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	//DisplayBoard(mine,ROW,COL);
	DisplayBoard(show, ROW, COL, EASY_COUNT);

	SetMine(mine, ROW, COL);
	//DisplayBoard(mine, ROW, COL);//可以打印出来查看布雷效果
	FindMine(mine, show, ROW, COL);
	//DisplayBoard(show, ROW, COL);
}

这里我们使用宏定义,定义ROW和COL为9;

效果图


二、游戏模块game.h

  1. 宏定义ROW、COL、ROWS、COLS
  2. 声明函数
#define ROW 9
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2
#define EASY_COUNT 10	//埋雷的个数

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 mine[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

三、游戏模块game.c

1、初始化函数

遍历数组使mine数组成员初始化为字符`0`,使show数组成员初始化为字符`*`。
void InitBoard(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;
		}
	}
}

为了方便后续排雷时计算边界位置周围雷的个数,我们将棋盘行扩大两行,列扩大两列,即:
#define ROWS ROW+2
#define COLS COL+2
注意这里传参传的是ROWS和COLS,因为初始化需要将mine棋盘11行11列都初始化为字符0,否则后续排雷时,9行9列以外的不方便计算。

在这里插入图片描述

2、打印函数

打印棋盘时我们将行号和列号也一同打印出来,这样方便玩家观察游戏;
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
   
	int i = 0;
	int j = 0;
	printf("————扫雷————\n");
	for (j = 0; j <= col; j++)
	{
   
		printf("%d ", j);	//控制列号
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
   
		printf("%d ", i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值