打地鼠課程設計報告木槌打老鼠_第1頁
打地鼠課程設計報告木槌打老鼠_第2頁
打地鼠課程設計報告木槌打老鼠_第3頁
打地鼠課程設計報告木槌打老鼠_第4頁
打地鼠課程設計報告木槌打老鼠_第5頁
已閱讀5頁,還剩25頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、I / 30 文檔可自由編輯打印鹽城工學院鹽城工學院程序設計實踐報告程序設計實踐報告 段 佳 雯學學 院院 信息工程 專專 業業 計算機科學與技術計算機科學與技術班班 級級 Z111 學學 號號 1160704108 學生姓名學生姓名 段佳雯段佳雯 課程成績課程成績 完成日期完成日期 2014-1-16II / 30 文檔可自由編輯打印目目 錄錄1 引言.11.1 課程設計目的.11.2 開發工具的介紹.12 概要設計.22.1 系統總體分析.22.2 主模塊涉及的基本概念及說明.23 詳細設計.73.1 主要的函數和定義說明 .73.1 調試成果及講解 .165 心得體會.20參考文獻.21

2、附錄221 / 30 文檔可自由編輯打印打地鼠游戲程序設計打地鼠游戲程序設計1 1 引言引言本程序設計實踐是采用 C+語言,在 VC 平臺下設計。本課程設計提供了獨立實踐的機會,將課本上的理論知識和實際有機的結合起來,充分的鍛煉分析解決實際問題的能力。提高了適應實際,實踐編程的能力。1.1 課程設計目的程序設計實踐主要是培養學生利用系統綜合 C+語言進行程序設計的能力。(1)進一步鞏固和復習 C+程序設計的基礎知識。(2)培養結構化程序、模塊化程序設計的方法和能力。(3)了解軟件的編制過程及各環節的具體內容。(4)提高程序調試技巧、軟件設計能力和代碼規范化等素質。(5)提高分析問題、解決問題以

3、及實際運用能力。 (6)功能要求:基本要求:設計的系統界面要美觀大方,操作合理,有必要的提示。創新要求:在基本要求達到后,進行創新設計。對系統進行功能模塊分析、控制流程分析正確。系統設計要實用,編程簡練,可用,功能全面,并有一定的容錯能力。說明書、流程圖要清楚。要求程序設計合理,用戶界面良好,如采用菜單工作方式。1.2 開發工具的介紹關于關于 VisualVisual C+C+Visual C+6.0 是 Microsoft 公司在 1998 年推出的基于 Windows 9X 和 Windows NT 的優秀集成開發環境。該環境為用戶提供了良好的可視化編程環境,程序員可以里利用該開發環境輕松

4、地訪問 C+源代碼編輯器,資源編輯器和使用內部調試器,并且可以創建項目文件。Visual C+6.0 不僅包括編譯器,而且它還包括許多有用組件,通過這些組件的協同工作,可以在 Visual C+6.0 集成環境中輕松地完成創建源文件,編輯資源,以及對程序的編譯,連接和調試等各項工作。VC+6.0 是 Windows 95/98、XP 或 Windows NT 下的一個應用程序,本身對軟硬件沒有特殊要求。就是說它對環境的要求與 Windows 95/98、Windows NT 要求是一致的。硬件要求:一般在 586 以上的處理器、16MB 以上內存、100MB 以上的硬盤。軟件要求:Window

5、s 95/98 或 Windows NT3.51 以上版本。VC+ 6.0 系統可以在一張 CD 盤上,也可以在“Visual Studio( Visual C+、Visual 2 / 30 文檔可自由編輯打印Foxpro)”等產品的第一張 CD 盤上。一般都有一個 VC 的自動安裝程序,也可以執行 VC6 目錄下的 setup.exe,在安裝包的提示下進行,對初學者可采用“典型安裝”方式。在安裝好 VC 6.0 系統后,有時根據需要添加或刪除某些部件,可插入 CD 盤重新執行setup.exe 安裝程序,安裝程序會檢測當前系統安裝 VC6 的足件,用戶單擊“添加刪除”按鈕后,在“安裝維護”對

6、話框中選定要添加的部件或撤消選定要刪除的部件。與一般的應用軟件一樣,有以下兩種啟動方式:(1)通過“開始”按鈕,選擇“程序”菜單,然后打開“Microsoft Visual studio 6.0 中文版”子菜單中的“Microsoft Visual C+ 6.0 中文版”程序。(2)用戶也可以使用命令行啟動 VC。單擊“開始”按鈕后選擇“運行”命令,在“運行”對話框中輸入 c:Program FilesMicrosoft Visual StudioVC98VC6.exe(按默認盤符和路徑安裝)即可。1.3 功能說明:打地鼠是一種非常有趣的益智游戲。游戲進行時,地鼠會不斷從洞口探出頭來再縮回去,

7、地鼠頭在洞外時,可以通過案件的方式打擊地鼠,時間到時游戲結束,打中地鼠次數越多分數越高,打中紅色地鼠會減分,灰色地鼠分數比棕色地鼠分數低。打破記錄可以刷新成績。點擊鼠標左鍵可以打擊地鼠。2 2 概要設計概要設計2.1 系統總體分析開發環境:Microsoft WindowsXP TASM2.2 主模塊涉及的基本概念及說明2.2.1Message 消息機制在 Windows 中發生的一切都可以用消息來表示,消息用于告訴操作系統發生了什么,所有的 Windows 應用程序都是消息驅動的。 一個消息是由消息的名稱(UINT)和兩個參數(WPARAM, LPARAM)組成。消息的參數中包含有重要的信息

8、。主要包括程序核心,輸入焦點,消息分類,消息隊列,消息循環,消息分類。一個消息由一個消息名稱(UINT) ,和兩個參數(WPARAM,LPARAM)組成。本設計中主要用 Msg 來調用 Messagebox 里的消息。從而來實現鼠標點擊實現功能的操作。例如對鼠標消息而言,LPARAM 中一般包含鼠標的位置信息。Msg 變量是型態為 MSG的結構。當鼠標在某個窗口內移動時,Windows 會不斷地發出鼠標移動消息WM_MOUSEMOVE,并把鼠標的最新位置傳給該窗口。如果在窗口的范圍內按下鼠標左鍵,系統就會發出“按下左鍵”的 WM_LBUTTONDOWN 消息給該窗口,等到用戶放開按鍵后,再發出

9、“放開左鍵”的 WM_LBUTTONUP 消息給該窗口。消息可以看做是一個動作。操作系統把消息3 / 30 文檔可自由編輯打印給封裝成結構。本設計中主要用 WindowFunc 函數來調用消息循環。Windows 為當前執行的每個Windows 程序維護一個消息隊列。在發生輸入事件之后,Windows 將事件轉換為一個消息并將消息放入程序的消息隊列中。程序通過執行一塊稱之為消息循環的程序代碼從消息隊列中取出消息。本程序中在時鐘運行里運用到了消息循環。例while(1)if( PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)/消息循環if (!GetMessa

10、ge(&msg,NULL,0,0)/接收消息return msg.wParam;TranslateMessage(&msg);/翻譯消息DispatchMessage(&msg);/處理消息else if( bActive)UpdateFrame();elseWaitMessage();KillTimer(hwnd,1);/時鐘停止return msg.wParam;消息循環的過程如圖 11 所示:圖 1-1 在程序的時鐘里也運用到了消息隊列的思想。消息隊列就是 Windows 中有一個系統消息隊列,對于每一個正在執行的 Windows 應用程序,系統為其建立一個“消息

11、隊列” ,即4 / 30 文檔可自由編輯打印應用程序隊列,用來存放該程序可能創建的各種窗口的消息。應用程序中含有一段稱作“消息循環”的代碼,用來從消息隊列中檢索這些消息并把它們分發到相應的窗口函數中。在消息循環中沒有消息的話就排隊等待。沒有消息就創建空傳消息。2.2.2DirectDrawDirectDraw 是通過基于 COM 的接口提供服務。在 DirectX 5.0 版本中,這些接口分別是:IDirectDraw2、IDirectDrawSurface3、IDirectDrawPalette、IDirectDrawClipper和 IDirectDrawVideoPort。DirectX

12、 的這些組件是向下兼容的,它們仍然支持舊版本中的所有功能。 DirectDraw 是 DirectX 中的關于視頻輸入輸出的基本部分,使用 DirectDraw 可以方便地編制出高效的視頻處理程序,只要用戶的硬件支持 DirectDraw,就能保證你的代碼可以處理它們。與 DirectX 其它組件一樣,只要可能,DirectDraw 就會最高程度的利用硬件執行某特定功能,并且讓那些該硬件還不支持的特性也能用軟件仿真的方式加以實現。設備無關性通常是通過硬件抽象層(HAL:Hardware abstraction layer)實現的。DirectDraw 主要提供了完成以下任務的工具:管理多頁面

13、,直接訪問視頻 RAM ,換頁(Page flipping) ,后臺緩存(Back buffering) ,管理調色板(Palette) ,裁剪(Clipping) ,視頻端口(Video port) 。除此之外,DirectDraw 允許開發者在應用程序運行期測定顯示硬件的特性,然后,充分利用主機硬件設備的加速特性為用戶提供可能的最優的顯示速度和效果。DirectDraw 對象的創建和準備的每一步驟:1. 創建 DirectDraw 對象:創建 DirectDraw 對象的一個實例,應該用DirectDrawCreate API 函數,也可以用 COM 中的 CoCreateInstance

14、 函數。DirectDrawCreate 用一個全局統一標志符 GUID(Globally Unique IDentifier)來表征顯示設備,在大多數情況下 GUID 為 NULL(使用系統的缺省顯示設備,既“空設備” ) ;指針指向DirectDraw 對象的地址;第三個參數總是 NULL(供將來擴展使用)。下述代碼表明了如何創建一個 DirectDraw 對象,并且檢驗是否成功。2.設置顯示模式:設置 DirectDraw 應用程序的顯示模式需要兩步:首先調用IDirectDraw:SetCooperativeLevel 方法來設定該模式下的要求,一旦確定了要求,再用IDirectDra

15、w:SetDisplayMode 方法來選擇顯示分辨率。在改變顯示分辨率之前,還必須通過 IDirectDraw:SetCooperativeLevel 方法來指定 DDSCL_EXCLUSIVE 和DDSCL_FULLSCREEN 標志。這樣能使游戲程序完全控制顯示設備,其它的應用程序不能同時共享顯示設備。DDSCL_FULLSCREEN 標志表示將程序設為全屏模式。使用5 / 30 文檔可自由編輯打印IDirectDraw:SetCooperativeLevel 時,必須向窗口 (HWND)傳送一個句柄,讓窗口決定何時非正常地終止應用程序。例如,若發生了 GP 錯誤或 GDI 被翻轉(fl

16、ip)到了后臺緩沖區,用戶就無法訪問當前屏幕。為了避免這種情況,DirectDraw 有一個后臺等待進程,它俘獲所有發往該窗口的消息,用這些消息來確定應用程序何時終止。如果創建了新的窗口,必須確定該窗口為活動的,否則,就會有一系列的事件無法繼續工作。3.改變顯示模式一旦選擇了應用程序的工作模式,就可以使用方法來改變顯示模式。4.創建可翻轉表面(Flippable Surface) :設定了顯示模式后,必須創建放置應用程序的表面。5. 定義表面要求:創建可翻轉表面的的第一步是在 DDSURFACEDESC 結構中定義表面的要求。6. 創建表面: 填完了 DDSURFACEDESC 結構,就可以使

17、用該結構和 lpDD 了,lpDD 是用DirectDrawCreate 方法創建的 DirectDraw 對象的指針。7.取得后臺緩沖區的指針: 使用 IDirectDrawSurface:GetAttachedSurface 方法可以取得后臺緩沖區的指針。8.著色表面: 創建了主表面和后臺緩沖區后,DDEX1 使用標準的 Windows GDI 函數將一些文本提交到主表面和后臺緩沖區。一般來講,當向表面寫數據時,該表面就是后臺緩沖區,然后將緩沖區翻轉成主表面顯示出來。在 DDEX1 中,第一次翻轉表面之前有一個重要的延遲。于是 DDEX1 就將數據寫入主緩沖區,避免開始顯示時有太長的時間間

18、隔。后面將會講到,DDEX1 只在 WM_TIMER 期間向后臺寫數據。初始化函數或標題頭可能會寫入主緩沖區。應該注意的是,一旦使用 IDirectDrawSurface:Unlock 對表面解鎖,指向表面的指針就變成無效,必須再次使用 IDirectDrawSurface:Lock 方法才能獲取該表面內存的有效指針。9.寫表面及翻轉表面: 完成了初始化后,DDEX1 開始處理消息循環。在消息循環的過程中,完成鎖定后臺緩沖區寫入新的文本解鎖后臺緩沖區翻轉表面的過程。WM_TIMER 包含了寫數據和翻轉表面的大部分代碼。 WM_TIMER 消息的前半部分用于向后臺緩沖區寫數據, “phase”變

19、量決定是寫主緩沖區消息還是寫后臺緩沖區消息。如果 phase為 1,表示寫主緩沖區的消息,然后將 phase 改變為 0;若為 0,表示寫后臺緩沖區的消息,然后將 phase 改變為 1。注意,兩種情況中的消息都是寫向后臺緩沖區。后臺緩沖區寫入了消息后,使用 IDirectDrawSurface:ReleaseDC 方法解鎖。10. 釋放 DirectDraw 對象: 當按了 F12 后,DDEX1 程序在退出之前先處理WM_DESTROY 消息,該消息調用了 finiObjects 函數,而 finiObjects 函數包含了所有的IUnknown Release 的調用。11. 將位圖調入

20、表面: 如 DDEX1 中一樣,doInit 函數是 DDEX2 的初始化函數,兩者的實質一樣。6 / 30 文檔可自由編輯打印12.設置調色板,將位圖調入后臺緩沖區: 創建了調色板之后,可以通過調用IDirectDrawSurface:SetPalette 方法將 DirectDrawPalette 對象的指針 ddpal 傳送給主表面。13. 從屏外表面位塊傳輸: DDEX2 同 DDEX1 基本相同。DDEX2 打開一個位圖文件并將它送往后臺緩沖區,然后翻轉后臺緩沖區和主表面。但這對顯示位圖并不特別理想,DDEX3擴展了 DDEX2 的功能,它加入了兩個屏外緩沖區,每個緩沖區都存儲一個位

21、圖。14. 將位圖文件調入屏外表面: 創建了兩個屏外表面后,DDEX3 使用了 InitSurfaces函數將位圖從 Frntback.bmp 文件裝入到兩個表面。InitSurfaces 函數使用了DDCopyBitmap 函數調入兩個位圖。15. 將屏外表面位位塊傳輸到后臺緩沖區:WM_TIMER 包含了寫表面和翻轉表面的代碼。在 DDEX3 中,它選擇適當的屏外表面,并將其位塊傳輸到后臺緩沖區。16. 創建動畫: 1、Color Key 和位圖動畫在 DDEX3 例中描述了將位圖放入屏外緩沖區的一種主要方式。DDEX4 則使用了將背景和一系列的精靈(sprite,本例中精靈是圓環)裝入屏

22、外表面的技術,然后使用, IDirectDrawSurface:BltFast 方法將屏外表面的各部分拷貝到后臺緩沖區。doInit 函數除了具有前面例子中的功能外,還包括了為精靈設置Color key 的代碼。Color key 是用于設置透明度的顏色值。當使用硬件塊寫方式時,矩型區域內除了設為 color key 的像素,其它的像素都被塊寫,由此在表面上產生非矩型的精靈。17.動態改變調色板:DDEX5 描述了任何在程序運行時動態地改變調色板,盡管在游戲中這并不總是用到。DirectDraw 確實能很好地控制調色板。18. 替換調色板:DDEX5 中的 updateFrame 函數同 DD

23、EX4 中的基本相同,先將背景塊寫入后臺緩沖區,再將 3 個紅色圓環塊寫到前景。19. 使用覆蓋表面(Overlay): 創建一個主表面要使用覆蓋表面,必須先要初始化一個主表面,覆蓋表面將顯示在該主表面上。檢測硬件對覆蓋的支持 初始化 DirectDraw 后,需要檢測設備是否支持覆蓋表面。因為 DirectDraw 不能仿真覆蓋,所以如果硬件不支持覆蓋,就不能繼續下面的工作。你可以用方法獲取硬件設備驅動程序的能力檢測覆蓋支持。在調用該方法之后,查看 DDCAPS 結構中的 dwFlags 成員是否包含有 DDCAPS_OVERLAY 標志。若有就表明支持覆蓋,否則就不支持。創建一個覆蓋表面如

24、果知道顯示設備支持覆蓋表面,就可以創建一個。因為沒有指明設備怎樣支持覆蓋表面的標準,所以不能夠期望創建任意大小的像素格式的表面。另外,也不要期望第一次創建覆蓋表面就會成功。因此,必須作好準備進行多次創建的嘗試,直到有一個能夠工作為止。Mosquito 程序在創建表面時遵循“best case to worst case”的原則,首先嘗試創建一個三緩沖頁翻轉復雜覆蓋表面。如果嘗試失敗,程序就改變方法嘗試用其它通用的迅速格式來配置。顯示覆蓋表面創建了覆蓋表面之后就可以顯示它了。通常,硬件在用于顯示覆蓋的矩形的位置和像素格式上加上7 / 30 文檔可自由編輯打印對齊約束。另外,還需要經常通過調整目的

25、矩形的寬度來說明最小要求的拉伸因子以成功地顯示覆蓋表面。更新覆蓋的顯示位置顯示覆蓋表面之后,有時可能就不需要對覆蓋做其它的操作了。但有些軟件還需要重新放置覆蓋,改變覆蓋的顯示位置。隱藏覆蓋表面如果不再需要一個覆蓋表面或只想不讓覆蓋可見。UpdateOverlay UpdateOverlay 用于重新定位一個覆蓋頁面,或修改其視覺屬性。這些頁面在創建時必須提 DDSCAPS_OVERLAY 標志。3 3 詳細設計詳細設計3.1 主要的函數和定義說明3.1.1 WinMain 函數主函數的入口。和我們以前的 main()函數一樣。本次設計中的具體定義:INT WINAPI WinMain(HINS

26、TANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nMode)。3.1.2 WM_LBUTTONDOWN WM_LBUTTONDOWN 消息當用戶在 window 客戶區域點擊鼠標左鍵的時候發送。如果當前鼠標沒有被捕捉,消息發送給鼠標下面的 window 窗體。否則,消息發送給當前捕捉鼠標消息的方法。3.1.3 WindowFun 函數 窗口構造函數,注冊函數,自動調用,處理消息循環。本次設計中的具體定義:LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wP

27、aram,LPARAM lParam)。3.1.4 InitDDraw()函數運用了 directdraw 編程,初始化 directdraw。主要作用是創建 DirectDraw 對象,設置協作級別為窗口模式,創建主頁面,創建離屏頁面,創建老鼠頁面,創建木錘,創建火花,創建標題,創建背景,創建時間,創建分數頁面,創建 Clipper 裁剪器。本次設計中的具體定義:BOOL InitDDraw()DWORD dwFlags;DDSURFACEDESC ddsd;8 / 30 文檔可自由編輯打印/創建 DirectDraw 對象DirectDrawCreate(NULL, &lpDD,

28、NULL);/設置協作級別為窗口模式dwFlags = DDSCL_NORMAL;lpDD-SetCooperativeLevel(hwnd, dwFlags);/創建主頁面ZeroMemory(&ddsd, sizeof(ddsd);ddsd.dwSize = sizeof(ddsd);ddsd.dwFlags = DDSD_CAPS;ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;lpDD-CreateSurface(&ddsd, &lpDDSFront, NULL);/創建離屏頁面ddsd.dwFlags = DDSD_C

29、APS | DDSD_WIDTH | DDSD_HEIGHT; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;RECT rect;GetClientRect(hwnd, &rect);forewidth=rect.right-rect.left;foreheight=rect.bottom-rect.top;GetRect(&backrect, 0, 0, 433,348);ddsd.dwWidth = backwidth=forewidth;ddsd.dwHeight = backheight=foreheight;lpDD-Cre

30、ateSurface( &ddsd, &lpDDSBack, NULL );/創建老鼠頁面ddsd.dwWidth = 124;ddsd.dwHeight = 425;lpDD-CreateSurface( &ddsd, &lpDDSMouse0, NULL );lpDD-CreateSurface( &ddsd, &lpDDSMouse1, NULL );lpDD-CreateSurface( &ddsd, &lpDDSMouse2, NULL );DDReLoadBitmap(lpDDSMouse0, MOUSE00.BMP)

31、;9 / 30 文檔可自由編輯打印DDReLoadBitmap(lpDDSMouse1, MOUSE01.BMP);DDReLoadBitmap(lpDDSMouse2, MOUSE02.BMP);DDSetColorKey(lpDDSMouse0,RGB(0,0,255);DDSetColorKey(lpDDSMouse1,RGB(0,0,255);DDSetColorKey(lpDDSMouse2,RGB(0,0,255);/創建木錘ddsd.dwWidth = 68;ddsd.dwHeight = 136;lpDD-CreateSurface( &ddsd, &lpDDS

32、Hammer, NULL );DDReLoadBitmap(lpDDSHammer, HAM.BMP);DDSetColorKey(lpDDSHammer,RGB(0,0,255);/創建火花ddsd.dwWidth = 68;ddsd.dwHeight = 24;lpDD-CreateSurface( &ddsd, &lpDDSBow, NULL );DDReLoadBitmap(lpDDSBow, Bow.BMP);DDSetColorKey(lpDDSBow,RGB(255,0,127);/創建標題ddsd.dwWidth = 319;ddsd.dwHeight = 56

33、;lpDD-CreateSurface( &ddsd, &lpDDSLogo, NULL );DDReLoadBitmap(lpDDSLogo, logo.BMP);DDSetColorKey(lpDDSLogo,RGB(0,0,255);/創建背景ddsd.dwWidth = 433;ddsd.dwHeight = 348;lpDD-CreateSurface( &ddsd, &lpDDSBk, NULL );DDReLoadBitmap(lpDDSBk, BK.BMP);10 / 30 文檔可自由編輯打印/創建時間ddsd.dwWidth = 45;ddsd

34、.dwHeight = 13;lpDD-CreateSurface( &ddsd, &lpDDSTime, NULL );DDReLoadBitmap(lpDDSTime, Time.BMP);DDSetColorKey(lpDDSTime,RGB(255,0,127);/創建數字ddsd.dwWidth = 260;ddsd.dwHeight = 38;lpDD-CreateSurface( &ddsd, &lpDDSHamfig, NULL );DDReLoadBitmap(lpDDSHamfig, Hamfig.BMP);DDSetColorKey(lpD

35、DSHamfig,RGB(255,0,127);/創建數字ddsd.dwWidth = 160;ddsd.dwHeight = 23;lpDD-CreateSurface( &ddsd, &lpDDSFig, NULL );DDReLoadBitmap(lpDDSFig, fig.BMP);DDSetColorKey(lpDDSFig,RGB(255,0,127);/創建分數頁面ddsd.dwWidth = 43;ddsd.dwHeight = 25;lpDD-CreateSurface( &ddsd, &lpDDSScore0, NULL );lpDD-Cre

36、ateSurface( &ddsd, &lpDDSScore1, NULL );lpDD-CreateSurface( &ddsd, &lpDDSScore2, NULL );DDReLoadBitmap(lpDDSScore0, Score01.BMP);DDReLoadBitmap(lpDDSScore1, Score02.BMP);DDReLoadBitmap(lpDDSScore2, Score03.BMP);DDSetColorKey(lpDDSScore0,RGB(255,0,127);DDSetColorKey(lpDDSScore1,RGB(25

37、5,0,127);11 / 30 文檔可自由編輯打印DDSetColorKey(lpDDSScore2,RGB(255,0,127);/創建 Clipper 裁剪器lpDD-CreateClipper(0, &lpClipper, NULL);lpClipper-SetHWnd(0, hwnd);lpDDSFront-SetClipper(lpClipper);return TRUE;3.1.5 InitData()函數 在本次設計中的作用是數據初始化。實現老鼠洞位置數據的初始化,老鼠頭位置的初始化。本次設計中的具體定義:void InitData()int i;bActive = t

38、rue;delay = 5;dwLastTickCount = 0;hit = false;get = false;time = 20;score = 0;RECT Window;GameStatus = 0;GetClientRect(hwnd, &Window);pt.x=pt.y=0;ClientToScreen(hwnd, &pt);/初始化老鼠洞位置holepos0.x = 24;holepos0.y = 215;12 / 30 文檔可自由編輯打印holepos1.x = 160;holepos1.y = 215;holepos2.x = 296;holepos2.y

39、 = 215;holepos3.x = 1;holepos3.y = 150;holepos4.x = 137;holepos4.y = 150;holepos5.x = 274;holepos5.y = 150;holepos6.x = 32;holepos6.y = 87;holepos7.x = 159;holepos7.y = 87;holepos8.x = 287;holepos8.y = 87;/初始化老鼠頭位置for (i = 0 ;i 9;i+)mouseposi.x = holeposi.x + 25;mouseposi.y = holeposi.y +15;mousewid

40、th = 62;mouseheight = 62;/初始化老鼠洞for (i =0 ;i2)delay -= 2;break;case VK_ESCAPE:MessageBox(hwnd,送給你的.:)n From:n 耗子nn ,關于這個游戲,MB_OK);PostQuitMessage(0);break;break;3.1.10 WM_LBUTTONUP窗口消息當光標在窗口客戶區時,用戶釋放鼠標左鍵時發出的消息。如果鼠標沒有捕獲,這個消息被送到光標下的窗口。否則,該消息發布到捕獲鼠標的窗口。程序如下:case WM_LBUTTONUP: hit = false;break;3.1.11 W

41、M_DESTROY:WM_DESTROY 是關閉程序的,關閉程序時彈出對話框。程序如下:case WM_DESTROY:MessageBox(hwnd,送給你的.:)nFrom:n 關于這個游戲,MB_OK);PostQuitMessage(0);break;3.1.12 WM_MOUSEMOVE:作用是鼠標移動對應的坐標。程序如下:15 / 30 文檔可自由編輯打印case WM_MOUSEMOVE:pos.x = LOWORD(lParam);pos.y = HIWORD(lParam);break;3.1.13 WM_TIMERc+中定時器 告訴 windows 一個時間間隔,然后 wi

42、ndows 以此時間間隔周期性觸發程序。程序如下:case WM_TIMER:if (bActive)switch (wParam)case 1:StepAll();break;case 2:time -;break;break;default:return DefWindowProc(hwnd,message,wParam,lParam);break;return 0;3.1.14 hwnd 的作用 介紹如下程序:hwnd = CreateWindow(/設計窗口szClassName,打老鼠,WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX|WS_POPUP,/窗口

43、坐標180,/窗口的位置程序框頂點到顯示框頂點之間是 180 和 8016 / 30 文檔可自由編輯打印80,433,/窗口的長寬348,HWND_DESKTOP,NULL,hInstance,NULL);3.1.15 ShowWindow(hwnd,nMode);/顯示窗口 hwnd3.1.16 UpdateWindow(hwnd);/更新窗口3.1.17 InitData()如下程序含義定義的 SetTimer(窗口中設置時鐘,時鐘的編號,時鐘的速度,NUll) 。單位是毫秒,表示 1000 毫秒的時鐘,滴答一下。設置時鐘的目的是有消息 timer, 每滴答一下 ,響應消息 ,執行消息響應

44、。程序如下:SetTimer(hwnd,1,200,NULL);SetTimer(hwnd,2,1000,NULL);3 程序調試3.1 調試成果及講解 3.1.1 三種種類的老鼠17 / 30 文檔可自由編輯打印圖 3-1如圖 3-1 土黃老鼠是可愛的老鼠,是普通地鼠,分數也普通。圖 3-2如圖 3-2 粉紅色老鼠頭上有個可愛的蝴蝶結,不能隨便打,會倒扣分數。18 / 30 文檔可自由編輯打印圖 3-3如圖 3-3 黑老鼠有兇惡的眼神,速度很快,打擊難度高,分數也高。3.2 運行效果初始:圖 3-4點擊左鍵跳出如下對話框,點擊確定,進入游戲。19 / 30 文檔可自由編輯打印圖 3-5游戲結

45、束 出現如下對話框。點擊確定 ,再來一局。20 / 30 文檔可自由編輯打印再玩一局破紀錄后出現如下對話框,記錄刷新。圖 3-6打中的老鼠會頭金星,出現如下星星:21 / 30 文檔可自由編輯打印5 心得體會在學習 C+以前,我認為 C+只是在 C 語言的基礎上的一種延伸,認為只要學過 C 語言,就可以用 C 語言的那種設計思想來學習 C+、設計 C+程序。正是由于抱了這種錯誤的思想,使我在一開始學習 C+的時候遇到了很大的困難,我沒有辦法體會面向對象的設計思想,我在學習這門課的時候老是想著實現這個函數功能的具體過程,而沒太注意對象分類的重要性。隨著課程學習的深入,我感覺到了利用類和對象、繼承

46、、封裝等一系列知識可以把我們程序中很多繁雜、重復的部分省略掉,還可以解決一些利用面向過程的設計思想無法解決的問題,我自己也試著編寫一些小的 C+程序,當然在這個過程中遇到了很多困難,其中調試帶來的困難讓我無法忘記,在調試程序的同時,我也總結出來了一些調試的小技巧,讓我在 C 語言課程設計中也受用匪淺。雖然現在仍然會有一些問題不能解決比如插入透明圖片的問題。但是在今后的學習和努力中會發現更多的東西,更加的進步。在學習這門課的過程中,我感受到了自己親自動手編程序、調程序的重要性,我們要熟悉 C+的語法、體會調試的思想,最好的一個手段就是自己動手編程、調試,這會比我們一味的看書效果好得多。另外,我還

47、感覺到一個好的程序編出來需要很多人的團結合作。我在檢查自己編寫的程序是否有 BUG 未被找出的時候,我會讓我的同學作為一個程序使用者來找出未發現的BUG 并提出改進意見,這讓我們的工作更加高效。很高興能夠了解到 C+的神奇魅力和面向對象程序設計的獨特思想,它為我今后的程序設計奠定了基礎。感謝老師對我們的悉心教授!22 / 30 文檔可自由編輯打印參考文獻參考文獻1 譚浩強, C 程序設計 ,清華大學出版社2 劉振安,孫忱,劉燕君, C 程序設計課程設計 ,機械工業出版社3 汪詩林, 數據結構算法與應用 ,機械工業出版社4 陳錦昌,趙明秀.C 語言計算機繪圖教程.華南理工大學出版社.1998.9

48、23 / 30 文檔可自由編輯打印附錄(部分主要程序)#include #include #include ddutil.h#include stdio.h#include resource.h/函數聲明INT UpdateFrame();LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);BOOL InitDDraw( void );void GetRect(RECT* rect, long left, long top, long width, long height);void Flip(void);void DrawAll();vo

49、id InitData();void CheckHit();void StepAll();void StartGame();void DrawNumber(LPDIRECTDRAWSURFACE dd,LPDIRECTDRAWSURFACE ss,int num,int x,int y,int width,int height);/全局變量char szClassName = ForEpork;HWND hwnd;/showwindow 函數中whnd 的定義HINSTANCE hInst;BOOL bActive;DWORD delay;/延時DWORD dwTickCount,dwLast

50、TickCount;/關于游戲的全局變量BOOLhit,get;POINTpos;/木錘位置intforewidth, foreheight;/前臺頁面的寬度和高度RECTbackrect;/后臺頁面映射矩形intbackwidth, backheight;/后臺頁面的寬度和高度intmouse9;/老鼠洞出現東東的紀錄POINTholepos9;/老鼠洞的位置POINTmousepos9;/老鼠頭的位置intstatus9;/老鼠狀態,0-4intbehit9;/老鼠各個被打的紀錄intmousewidth;intmouseheight;POINT pt;inttime;/剩余時間intsc

51、ore;/分數intGameStatus;/游戲狀態2 / 30 文檔可自由編輯打印/DirectDraw 變量LPDIRECTDRAW lpDD;LPDIRECTDRAWCLIPPER lpClipper;LPDIRECTDRAWSURFACE lpDDSFront; /以下均為DirectDrawSurface 對象LPDIRECTDRAWSURFACE lpDDSBack; LPDIRECTDRAWSURFACE lpDDSMouse3;LPDIRECTDRAWSURFACE lpDDSHammer;LPDIRECTDRAWSURFACE lpDDSBk;LPDIRECTDRAWSURF

52、ACE lpDDSLogo;LPDIRECTDRAWSURFACE lpDDSBow;LPDIRECTDRAWSURFACE lpDDSFig;LPDIRECTDRAWSURFACE lpDDSHamfig;LPDIRECTDRAWSURFACE lpDDSTime;LPDIRECTDRAWSURFACE lpDDSScore3;INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nMode)/與 main 函數類似 是函數的入口MSG msg;/消息,基于消息的編程 什么是消息?

53、操作系統封裝消息 變成結構/在 Windows 中發生的一切都可以用消息來表示,消息用于告訴操作系統發生了什么,/所有的 Windows 應用程序都是消息驅動的。 一個消息是由消息的名稱(UINT)和兩個參數(WPARAM, LPARAM)組成。WNDCLASSEX wcl;wcl.cbClsExtra = 0;wcl.cbSize = sizeof(WNDCLASSEX);wcl.cbWndExtra = 0;wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH)/WHITE_BRUSH 表示窗口的顏色是白色的;wcl.hCursor

54、 = LoadCursor(NULL,IDC_ARROW);/LoadCursor 光標wcl.hIcon = LoadIcon(hInstance,IDI_ICON1);/LoadIcon 圖標wcl.hIconSm = LoadIcon(NULL,IDI_WINLOGO);/logowcl.hInstance = hInstance;wcl.lpfnWndProc = WindowFunc;wcl.lpszClassName = szClassName;wcl.lpszMenuName = NULL;wcl.style = 0;if (!RegisterClassEx(&wcl)

55、return 0;3 / 30 文檔可自由編輯打印hwnd = CreateWindow(/設計窗口szClassName,打老鼠,WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX|WS_POPUP,/窗口坐標180,/窗口的位置程序框頂點到顯示框頂點之間是 180 和 8080,433,/窗口的長寬348,HWND_DESKTOP,NULL,hInstance,NULL);ShowWindow(hwnd,nMode);/顯示窗口 hwndUpdateWindow(hwnd);/更新窗口if (!InitDDraw()MessageBox(GetActiveWindow

56、(), 初始化 DirectDraw 過程中出錯!請檢查你是否正確的安裝了 DirectX。, Error, MB_OK );return 0;hInst = hInstance;InitData();SetTimer(hwnd,1,200,NULL);/(窗口中設置時鐘,時鐘的編號,時鐘的速度,NUll)單位是毫秒 快SetTimer(hwnd,2,1000,NULL);/表示 1000 毫秒的時鐘 滴答一下 慢/設置時鐘的目的是有消息timer 每滴答一下 響應消息 執行消息響應while(1)if( PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)/消息循環if (!GetMessage(&msg,NULL,0,0)/接收消息return msg.wParam;TranslateMessage(&msg);/翻譯消息DispatchMessage(&msg);/處理消息else if( bActive)UpdateFrame();else4 / 30 文檔可自由編輯打印WaitMessage();Kill

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論