当前位置: 首页 > news >正文

第九篇 扫雷游戏 上(末版·精简)

扫雷游戏开发(上):函数封装与基础功能实现

本文Gitee代码链接:2025.11.11 扫雷游戏代码https://gitee.com/donghua-wanli/blog-code/tree/master/2025.11.11

一、前置知识:函数封装的“说明书与零件”——头文件与源文件

之前我们学过函数的声明与定义,今天实战“将代码拆分到多个文件”,核心是理解头文件(.h)和源文件(.c)的分工:

1.1 核心比喻:用洗衣机理解封装逻辑

  • 头文件(.h)= 洗衣机使用说明书:只写“能做什么、怎么用”——比如有“标准洗”“脱水”功能,需放入衣物、按启动键;不暴露内部电机、水管等细节。

  • 源文件(.c)= 洗衣机内部零件:具体实现说明书的功能——比如“标准洗”时电机如何转、阀门如何开关;用户无需关心,照说明书操作即可。

简单总结:.h是“使用指南”(函数声明),.c是“实现细节”(函数定义);.c文件中#include "xxx.h",相当于把说明书“拷贝”到零件图上做对照。

二、扫雷游戏实战:从菜单到布雷

扫雷目标:在9×9方格中找出所有非雷区域,不踩雷。我们分步骤实现基础功能,全程用多文件封装代码。

2.1 第一步:游戏菜单与入口设计

核心逻辑:打印菜单→接收用户输入→用switch分支控制“开始/退出”,这是控制台游戏的标准入口。

#include<stdio.h>int main()
{int x;// 菜单打印printf("*******************************************\n");printf("*************** 扫雷游戏 *****************\n");printf("***    请选择:1.开始游玩  2.退出游戏    ***\n");printf("*******************************************\n");scanf("%d",&x);// 分支控制switch (x){case 1:printf("************* 开始游戏 ***************\n");// game(); // 后续实现游戏主体break;case 2:printf("************* 退出游戏 ***************\n");break;default:printf("************* 输入错误 ***************\n");break;}
}

2.2 第二步:核心工具——宏定义(#define)

用9×9方阵存雷,但不直接写“9”,而是用宏定义。先搞懂宏定义与变量的核心区别:

2.2.1 宏定义 vs 变量:本质差异

对比维度

#define 宏定义

变量定义

本质

预处理阶段的“文本替换”,不占内存

内存中的存储空间,占内存

类型

无类型检查,易因写法出错

有明确类型(int/float),安全

用途

定义固定常量(数组大小、π值)

存储运行中需修改的数据

2.2.2 实战:用宏定义声明方阵大小

优势:后续想改16×16方阵,只需改宏定义,不用改所有代码。

#define Hang 9  // 行:宏定义,预处理时替换为9
#define Lie 9   // 列:宏定义,预处理时替换为9// 用宏定义创建方阵,后续修改更方便
int landmine[Hang][Lie] = {0};

2.3 第三步:封装核心函数(多文件实现)

按“声明放.h,定义放.c”原则,拆分3个核心函数:初始化方阵、打印方阵、布置雷。

2.3.1 头文件(game.h):函数声明+依赖引入

存放宏定义、库函数头文件、自定义函数声明(相当于“洗衣机说明书”)。

#define _CRT_SECURE_NO_WARNINGS
// 引入库函数头文件
#include<stdio.h>
#include<stdlib.h>  // rand()/srand()依赖
#include<time.h>    // time()依赖// 宏定义方阵大小
#define Hang 9
#define Lie 9// 函数声明(说明书:告诉用户有这些功能)
void chushihua(int landmine[Hang][Lie]);  // 初始化方阵为0
void zhanshi(int landmine[Hang][Lie]);    // 打印方阵
void setmine(int landmine[Hang][Lie]);    // 布置10个雷

2.3.2 源文件(game.c):函数定义

实现头文件声明的函数(相当于“洗衣机零件”),需用#include "game.h"关联头文件。

#include"game.h"  // 关联头文件,获取声明// 1. 初始化方阵:所有元素设为0(0表示无雷)
void chushihua(int landmine[Hang][Lie])
{for (int a = 0; a < Hang; a++){for (int b = 0; b < Lie; b++){landmine[a][b] = 0;}}
}// 2. 打印方阵:展示当前雷区状态
void zhanshi(int landmine[Hang][Lie])
{for (int a = 0; a < Hang; a++){for (int b = 0; b < Lie; b++){printf("%d", landmine[a][b]);}printf("\n");}
}// 3. 布置10个雷:1表示雷(后续修复索引问题)
void setmine(int landmine[Hang][Lie])
{int count = 10;  // 雷的总数while (count){// 生成随机坐标(暂存问题,下文修复)int x = rand() % Hang + 1;int y = rand() % Lie + 1;// 只在无雷位置布置if (landmine[x][y] == 0){landmine[x][y] = 1;count--;}}
}

2.3.3 主文件(11.11.c):程序入口

包含头文件,调用game.c中的函数,控制游戏流程。

#include"game.h"int landmine[Hang][Lie];  // 存放雷的方阵int main()
{// 设置随机数种子(确保每次雷位置不同,仅需调用一次)srand((unsigned int)time(NULL));// 1. 初始化方阵为0chushihua(landmine);printf("布置雷前的方阵:\n");zhanshi(landmine);// 2. 布置10个雷setmine(landmine);printf("\n布置雷后的方阵:\n");zhanshi(landmine);return 0;
}

2.4 关键问题:布雷时的“隐形bug”与修复

运行上述代码会发现:雷的数量不足10个,这是新手常踩的数组索引越界错误!

2.4.1 错误原因

  • C语言数组索引从0开始:Hang=9时,行索引是0~8(共9个元素);

  • 原代码随机坐标:rand()%Hang +1 → 范围1~9,当x/y=9时,超出数组有效索引(0~8),雷无法正确布置。

2.4.2 修复方案

去掉“+1”,让随机坐标范围匹配数组索引(0~8),修改game.c中的setmine函数:

void setmine(int landmine[Hang][Lie])
{int count = 10;while (count){// 修复:范围0~8,与数组索引匹配int x = rand() % Hang;  int y = rand() % Lie;if (landmine[x][y] == 0){landmine[x][y] = 1;count--;}}
}

三、未完待续:隐藏的核心难题

目前我们实现了“初始化-布雷-打印”,但还有两个关键问题没解决,这也是当初说“9×9方阵笨拙”的原因:

  1. 排查雷时,边界坐标(如(0,0))周围只有3个格子,中间坐标有8个,需写多套逻辑;

  2. 用同一数组存“雷(1)”和“周围雷数(0~8)”,会混淆“无雷”和“周围雷数为0”。

这些问题将在下篇文章中彻底解决,让扫雷游戏真正可玩。

结尾

嗯,希望能够得到你的关注,希望我的内容能够给你带来帮助,希望有幸能够和你一起成长。

写这篇博客的时候天气有点凉,冷风吹过阳台,裹着深夜的孤独。我走到阳台拍下了一张宿舍对面的照片作为本文的封面。

http://www.dtcms.com/a/614396.html

相关文章:

  • ⚡️2025-11-15GitHub日榜Top5|热点智能推送工具
  • python做项目的网站国家标准下载网免费
  • 网站建设服务费属于基于asp网站开发 论文
  • 高斯数据库 (GaussDB) 使用指南
  • 安徽茶叶网站建设网站抽奖模块怎么做
  • 建立自己的影视网站快手免费推广软件
  • 织梦网站调整网店如何推广自己的产品
  • 构建AI智能体:九十五、YOLO视觉大模型入门指南:从零开始掌握目标检测
  • 【文档】Aerial CUDA-Accelerated RAN , Aerial cuBB 部分
  • 育儿心理学
  • 建网站公司 快云淘宝客优惠券的网站是怎么做的
  • 黑马Redis A-基础
  • 一小时速通Pytorch之神经网络相关知识(三)
  • 帝国cms小说网站模板清美未来广告设计公司
  • 从编译角度来理解匿名函数与闭包
  • 【C++】3:函数重载、内联函数和nullptr
  • 如何做旅游网站的思维导图wordpress无法访问上传的图面
  • 赣州网站推广广州市天河区发布
  • python函数(三)———学员管理系统
  • 张北县网站建设广州网站网站建设
  • 电磁场中的静态与定态两个概念
  • 南京网站建设 小程序phpcms网站模板下载
  • 昌邑网站建设公司国外有什么做网站的软件吗
  • Qt QTreeView深度解析:从原理到实战应用
  • 建设网站需要哪些经营范围免费发帖推广的平台
  • 用C语言编译好玩的程序 | 探索编程世界的奇妙乐趣
  • 【开发备忘】GeoServer相关两则:发布时间维ImageMosaic+客户端WMS样式
  • 山东外贸国际网站建设南昌做网站多少钱
  • 3-Linux驱动开发-简单内核模块代码详解
  • 北京住房城乡建设部网站云南技术网站建设销售