項目目錄結構
建立項目
在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上去供大家參考。