純c語言版的打飛機遊戲出爐了^_^
我的郵箱:[email protected] 歡迎大家和我交流程式設計心得
經過昨天的苦戰,終於完成了純C版的打飛機遊戲——使用微信打飛機遊戲的素材,不過玩法有些不同,下面會有詳述
一、概述遊戲的玩法、實現效果
1. 遊戲第一步,簡單判斷一下,給你一個準備的時間:
2.選擇"是"進入遊戲介面:
3. 分數的記法規則和微信版的一樣——小飛機1000、中號飛機6000、大boss10000
4. 使用滑鼠點選響應的飛機,能實現爆炸效果
5. 你需要在飛機消失之前幹掉它,否則遊戲就結束了
6. 同樣支援微信中暫停和繼續的功能(左上角圖示可以看見)
7. 當遊戲結束的時候,還會提示你是否繼續重玩
二、寫遊戲過程中的一些心得
1. 連結串列和陣列的糾結:
大家應該都知道 , 要想不斷的加飛機、刪除飛機,那麼首選連結串列這個資料結構,因為它的優點就是插入、刪除的時間複雜度小。
的確,不過對於應該是使用連結串列還是簡單的陣列,我一開始確實糾結了很久,大家猜猜我最終選擇的是什麼呢?
呵呵,我選擇了簡單的陣列,原因如下: 我的演算法總是在陣列的最後新增飛機,飛機的數量有限(不多 , 最多10個),如果使用連結串列有些大材小用
使用越簡單的方式效率也就相應的越高
2. 記憶體的洩漏
從表面上聽著像是很嚴重——沒錯,它確實是我編寫過程中的一個BUG。當我完成第一個初始版本時,我迫不及待的運行了一下,開始沒什麼問題,執行尚好。
不過問題一會兒就出現了——飛機不動了,程式瞬間崩潰……
我還試了幾次,最終都是一樣的結果——於是我就想: 首先確定這應該是記憶體洩漏的問題,但是沒使用連結串列(指標),那會是什麼呢?
原來問題出現在一個很低階的錯誤上:
由於我使用雙緩衝技術來貼點陣圖,那麼必定會建立一個相容的記憶體Bitmap,然後我卻沒有在不使用它時釋放其所佔的記憶體,那麼問題自然就出現了。
在此,我必須再次強調一下,釋放資源所佔記憶體的重要性^_^
三、程式碼階段
這次呢,我不打算詳細的講解程式碼細節了,因為大部分技術都是之前詳述過的,例如貼點陣圖、透明點陣圖、雙緩衝技術==
但是呢,我還是將標頭檔案中的一些宣告註解一下,方便各位參看原始碼:
#ifndef BEATPLANE_H //呼叫TransparentBlt函式所需匯入的庫 #pragma comment(lib, "Msimg32.lib") //自定義訊息——開始或重玩 #define WM_START (WM_USER+100) #define TIMER 100//定時器ID #define WNDWIDTH 380//視窗寬度 #define WNDHEIGHT 550//視窗高度 #define SMALL 2 //飛機的型別——大中小 #define MIDDLE 3 #define BIG 4 #define GRADE 200000//等級 200000一個等級 #define MAX 10//視窗中一次顯示最多的飛機數 //飛機結構體 typedef struct { HBITMAP hBmp;//飛機點陣圖 POINT pos; //飛機當前的位置 SIZE size;//飛機的大小 int moveSpeed;//飛機當前飛行的速度 int type;//飛機的型別(大中小) }Plane, *PPlane; //play結構體(控制繼續或暫停) typedef struct { HBITMAP hBmp;//狀態點陣圖(暫停或繼續) SIZE size;//點陣圖大小 BOOL isPaused;//狀態(暫停或繼續) }Pause; int iBmpNames[] = {IDB_BK, IDB_SMALL, IDB_MIDDLE, IDB_BIG}; Plane pPlaneArr[MAX];//飛機陣列 Pause pauseBmp;//暫停、繼續 HBITMAP hBmp[4];//背景、大中小飛機點陣圖控制代碼 int iCurLen;//當前飛機數 int score;//標記分數 int grade;//等級(用於變速) BOOL isBigAdd=FALSE;//判斷打飛機是否已經新增 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//回撥函式 VOID StickPlanes(HDC);//用雙緩衝貼飛機點陣圖 VOID AddPlane(int, int);//新增飛機 BOOL Beat(HWND, POINT);//判斷打飛機是否成功 VOID Boost(HWND, PPlane);//實現爆炸效果 VOID DeletePlane(int);//刪除指定索引的飛機 BOOL Paused(POINT);//判斷是否點選了暫停 #endif
四、最後我做了一個gif,當作一個演示吧^_^
五、學習Win32的結束語
在此,我必須感謝中科院楊力祥老師,正是品讀了他關於<<windows高階程式設計>>的視訊,讓我受益匪淺,瞭解了許多關於windows程式設計的技巧和底層知識。此外,P先生的<<windows程式設計>>也是不用多說的經典之作……
今天以這個小遊戲結束我的Win32學習之旅的話題,也算是這個階段的結束,標誌新一階段的開始。儘管如此,鄙人還是新手一枚,但我將繼續走向IT程式設計界的"不歸之路",直至天涯盡頭……