My-Map结构分析
(说在前面)去https://www.luogu.com.cn/blog/somebody66xyyd/my-map-jie-gou-fen-xi我的博客观看体验更加,或者把下面文字使用Markdown格式打开也行!(bilibili的专栏格式没弄太会)
游戏github地址:[https://github.com/c-cpp-a/My-Map](https://github.com/c-cpp-a/My-Map),国内的话exe下载链接在[这里](https://kgithub.com/c-cpp-a/My-Map/blob/main/main.exe)。
核心文件结构:
```
My-Map
- defines
- sound
- 1st.mp3
- def
- Eggs.h
- help_func.h
- init.h (注:已弃用)
- Map.h
- People.h
- Screen.h
- main.cpp
- MapReader.cpp
```
粗略看很明显,最核心的代码就在`defines`文件夹里。查看代码可知这里存放着所有核心类的定义,而外面的`main.cpp`和`MapReader.cpp`其实只是调用类提供的接口。(为什么要分两个版本呢,因为一个是编辑模式一个是只读模式)
接下来我们一个文件一个文件分析。`defines`文件夹中有一个子文件夹`sound`,用于存放游戏中的音乐(目前只有背景音乐`1st.mp3`)。这没什么好说的。接下来是`def`,用于存放游戏中的常量定义。大到屏幕大小,小到模式由多少个,彩蛋坐标在哪个位置,都在里面有相应的定义。所有类的常量也在里面。(为什么不把只有一个类用到的常量封装到类里呢,因为这样不方便集中修改)
下一个是`Eggs.h`。这是用于存放彩蛋的文件。基本的逻辑是每一次主程序都会调用`Eggs.h`中的彩蛋判定和成就输出。这些函数都封装在`Egg`类内。不过由于是彩蛋内容,就不说太多了。
接下来的`help_func.h`可谓是帮了其它文件的大忙。这里面存放着各种辅助的函数,包括成就的控制位置输出、带模式判定的单位方格字符输出等。这里面还有一些通用的控制函数,比如在指定位置输出字符的`gotoxy`函数、显示/隐藏光标的`ShowCursor`函数等。~~都可以从网上借鉴~~
`init.h`目前已被弃用。这个文件原先的功能是初始化窗口,以及承担一些运行时的辅助输出内容。不过这些功能都被分拆到了`Screen.h`和`help_func.h`中,从而变得更加规范化。功能目前不作讲解。
`Map.h`管理着游戏的地图类。这是极为重要的功能之一:地图的管理及输出。同时,由于其支持任意坐标上的地图预览,所以具有较高的复用性。
`People.h`管理者图中的人员`#`的移动,以及它所带来的物品的位置改变。这个功能被极大地集成到了一个函数`move`中。该函数传入一个字符`ch`表示玩家的操作,并原地修改类内状态。甚至彩蛋的判定有一部分(特指大部分成就)都是在这里完成的。
`Screen.h`是新加进来的类。这个类将窗口初始化功能搬到了构造函数,保存功能搬到了析构函数。(不过这会带来一些问题,本文不做讨论。)这个类基本上继承了`init.h`中的函数功能,并添加了一些简短的实用函数,如`clear`,`pause`等。
把这些功能加在一起,就是完整的游戏`My-Map`了。目前该游戏仍在继续更新中,欢迎大家持续关注!