C语言递归实战:扫雷游戏设计与实现

周叙
周叙
发布时间:2026-10-15| 5人浏览过
原创

本文将深入解析如何使用C语言实现一个功能完整的扫雷游戏。文章首先阐述游戏核心的设计规则,包括双棋盘架构与边界保护策略;随后详细拆解函数模块,重点讲解基于递归的空格自动展开算法,并提供包含main入口、游戏逻辑实现头文件定义在内的完整代码参考。

游戏规则与核心设计

在实现扫雷程序前,需明确底层数据结构与交互逻辑。本方案采用两个独立的二维数组(棋盘)来分离数据存储与显示:

  • 双棋盘机制:mine数组用于存储雷的真实分布,show数组用于玩家交互界面。初始状态下,show中所有位置填充为字符 *,玩家坐标对应 show中的值被翻开后,会根据 mine中的情况进行更新。
  • 边界与防溢出处理:为防止判断边缘坐标时发生数组越界,实际开辟的数组大小应大于可视范围。例如,9x9的可视棋盘,内部数组通常定义为11x11(ROWS=11, COLS=11),有效操作范围为中间9x9区域,四周一圈仅用于辅助计算相邻坐标。
  • 首发安全机制:为保证用户体验,第一次踩雷时将触发“保活”逻辑。系统会移除当前位置的雷,并在其他非雷区域随机生成一枚新雷,确保玩家首局不会直接失败。
  • 递归展开规则:当某坐标周围8个邻居均无雷时,该位置显示为空格(' ')。此时需对该位置的上下左右(及对角线)四个方向进行递归检查,若邻居也是0且未翻开,则继续展开,直到遇到有数字的边缘为止。此过程极大简化了大面积空白区域的翻开操作。

代码实现与模块解析

第1步:定义全局常量与函数声明

在 game.h 头文件中,统一定义棋盘尺寸与辅助宏,便于后续逻辑调用:

#include<stdlib.h>
#include<stdio.h>
#include<time.h>

#define ROWS 11
#define COLS 11
#define ROW 9
#define COL 9
#define low 10 // 假设雷数为10

// 函数原型声明
void menu();
void setboard(char board[ROWS][COLS], int rows, int cols, char n);
void displayboard(char board[ROWS][COLS], int rows, int cols);
void putmine(char mine[ROWS][COLS], int rows, int cols);
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
void recfindmine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
int minenum(char mine[ROWS][COLS], int x, int y);
int number(char show[ROWS][COLS]);
void firstsafe(char mine[ROWS][COLS], int x, int y);

第2步:构建主循环与初始化流程

test.c 负责游戏流程控制。引入 srand(time(NULL)) 设置随机种子,使用 while(1) 维持菜单循环,并根据用户输入调用具体游戏逻辑:

#include "game.h"

int main()
{
    srand((unsigned int)time(NULL)); 
    int x = 0;
    
    while (1)     
    { 
        menu();
        printf("请选择:>");
        scanf("%d", &x);
        if (x == 1)
        {
            char mine[ROWS][COLS] = { 0 };
            char show[ROWS][COLS] = { 0 };
            
            // 1. 初始化棋盘
            setboard(mine, ROWS, COLS, '0');
            setboard(show, ROWS, COLS, '*');
            
            // 2. 打印初始界面
            displayboard(show, ROW, COL);
            
            // 3. 布置地雷
            putmine(mine, ROW, COL); 
            
            // 4. 开始排雷交互
            findmine(mine, show, ROW, COL);
        }
        else if (x == 0)
        {
            printf("退出游戏!\n");
            break;
        }
        else
        {
            printf("输入错误,请重新输入!\n");
        }
    }
    return 0;
}

第3步:实现棋盘管理基础函数

game.c 包含具体的游戏逻辑。setboard用于清空或填充棋盘,displayboard负责格式化输出行列索引及内容,使界面更易读。

第4步:布雷逻辑与非重复检测

使用 rand() % ROW + 1 在有效范围内生成随机坐标。通过 if (mine[x][y] == '0') 判断该位置是否已被占用,确保每枚雷放置的位置唯一且不重复。

第5步:核心排查与递归展开逻辑

这是游戏最关键的环节。当玩家输入坐标且非雷时,调用 recfindmine:

  1. 获取周边雷数:minenum函数遍历当前坐标周围的8个邻居,累加其字符值并减去基准值,计算出雷的数量。
  2. 递归终止条件:如果周围雷数不为0,直接将数字填入 show 数组,递归结束。
  3. 递归扩展:如果周围雷数为0且当前格子未被翻开(== '*'),先将当前格子置为空(' ')。然后对上下左右四个方向(或八个方向,视实现复杂度而定)进行递归调用 recfindmine,直到触碰到有数字的边界或已翻开的区域。
// 简化的递归查找逻辑示意
void recfindmine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
    int i = minenum(mine, x, y);
    if (show[x][y] == '*' && i == 0)
    {
        show[x][y] = ' ';
        // 递归处理四周
        if (show[x-1][y] == '*') recfindmine(mine, show, x-1, y); // 上
        if (show[x+1][y] == '*') recfindmine(mine, show, x+1, y); // 下
        // ... 其他方向同理
    }
    else 
    {
        show[x][y] = i + '0';
    }
}

第6步:胜利判定

通过 number 函数统计当前 show 数组中剩余的 * 数量。若剩余数量等于预设的雷总数(low),说明所有非雷区域均已翻开,玩家获胜。

总结

本示例展示了如何利用C语言的二维数组特性模拟网格状态,并通过递归有效地处理局部连通域的展开问题。虽然上述代码为教学演示版本,但其涵盖了数据结构映射、随机数应用、用户交互及核心算法的基本形态。以上就是C语言递归实现扫雷游戏的具体代码与思路分析,更多关于C语言游戏开发的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。