创建项目
在Visual Studio 2022中创建一个空白的项目,起名为:NumberMemoryGame。
创建游戏项目
命名规范
常规的变量、函数以及文件名等命名规范不再赘述,这里主要说一下项目中变量和函数的命名规范。
由于C语言没有命名空间的概念,所以在定义变量、函数的时候要避免与系统、第三方类库以及自身项目里的变量、函数重名,否则会出现难以预料的bug,本项目采取了增加前缀的措施来确保不会重名。
前缀构成:项目名首字母 文件名 表意函数名,中间用下划线连接,比如:NMG_view_init()。
目录结构
根据上一篇文章中提到的模块拆分,我们建立具体的源文件、头文件与之对应。
项目目录结构
下面简单介绍一下每个文件的作用:
- main.cpp是项目的入口文件,主函数main()就定义在这里
- 两个头文件:config.h定义一些常量,models.h定义项目里用到的数据结构模型
- data.cpp,文件读写模块,就是项目里用到的文件数据库
- game.cpp,游戏模块,控制整个游戏进程和交互
- rank.cpp,排行榜模块,排行榜的展示以及更新
- settings.cpp,设置模块,游戏设置中心
- timer.cpp,计时器模块,计时和展示,作为排行榜的依据
- views.cpp,窗口显示模块,控制整个项目的UI初始化、显示、更新等
MVC
以上文件目录结构创建好后,我们就往面向对象的编程思路上去靠拢,首选是常用的MVC模式:
- Model,定义在models.h中,管理所有抽象化对象的数据结构模型
- View,视图,相当于浏览器,只管展示视图,尽量不要参与业务逻辑的编码
- Controller,控制器,控制视图的数据展示以及用户和视图交互背后的逻辑处理
笔者GUI开发经验不多,再加上C语言自身的一些问题,很难去按照严格意义上的MVC模式去开发,但是我们的编程思想要向MVC看齐。
如果不理清关系、把逻辑分层、模块拆分开来,直接上手开发的话肯定会无从下手,而且过程会出现难以控制的bug,日后维护也很困难。
实例
下面来简单看一个实例,我们来实现排行榜这个模块的功能。
首先定义好数据模型,前期先加两个字段,后期实际开发中再去扩展。
定义排行榜数据模型
然后,在控制器中实现业务逻辑——做底层数据和外层视图的桥梁。排行榜模块功能很简单,前期就做两个功能:展示和更新。
排行榜模块的控制器
不过,在控制器中,并没有直接去数据库(当前项目的文件系统)去直接读写数据,而是又加了一个文件data.cpp专门去读写数据库,这样做能让底层的数据分离更加彻底,使得程序逻辑更加清晰。
文件读写模块
注意到,这里有些函数只是做了定义(输入和输出),这点上一篇文章提到过:先把逻辑走通,回头再完善具体的功能性的函数。
初步的窗口布局效果
由于要整理开发教程的步骤,所以整体进度上受点影响,今天先把初步的窗口布局实现以下,效果如下。
初步窗口布局
左侧就是游戏区了,目前已经划分好了棋盘,接下来就是把数字随机到棋盘格子里去,然后再接收玩家的鼠标点击事件,挑战成功则开启下一关,直至全部通关,基本上游戏的闭环就完成了。
右侧是功能区,主要是计时、排行榜、功能设置三块。
EasyX的使用
咱们项目的重点是通过EasyX来完成GUI开发,下面就来简单看一下EasyX的使用方法。
主函数
在主函数里调用,NMG_game_init()游戏初始化函数,然后在NMG_game_init()里调用NMG_view_init()视图初始化函数。
游戏初始化函数
至于为何要嵌套一层调用,这个就是我们上面提到的要使用MVC模式编程。这里的函数还有要完善的地方,到时候代码会变多,就能显现出MVC的优点了。
视图模块
在视图里简单实现一下窗口布局,EasyX主要就是在这里发挥它的作用的。
总结OK,到这一步我们游戏开发的基本框架算是搭建好了,接下来需要开发游戏的核心玩法了。
如果你对C语言的GUI编程感兴趣的话,请持续关注本系列文章,有建议意见欢迎留言或私信。
PS:需要源码的话请留言,人数多的话我就把项目推到GitHub上去供大家参考。
,