1. 程式人生 > >純c語言版的打飛機遊戲出爐了^_^

純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程式設計界的"不歸之路",直至天涯盡頭……

相關推薦

no