版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 程序設計實踐報告</b></p><p><b> </b></p><p> 學 院 信息工程 專 業(yè) 計算機科學與技術</p><p><b> 目 錄</b></p><p><b> 1 引言
2、1</b></p><p> 1.1課程設計目的1</p><p> 1.2開發(fā)工具的介紹1</p><p><b> 2 概要設計2</b></p><p> 2.1 系統(tǒng)總體分析2</p><p> 2.2 主模塊涉及的基本概念及說明2</p>
3、<p><b> 3 詳細設計7</b></p><p> 3.1 主要的函數(shù)和定義說明7</p><p> 3.1 調試成果及講解16</p><p><b> 5 心得體會20</b></p><p><b> 參考文獻21</b></p
4、><p> 附錄…………………………………………………………………………………………………………22</p><p><b> 打地鼠游戲程序設計</b></p><p><b> 1 引言</b></p><p> 本程序設計實踐是采用C++語言,在VC平臺下設計。本課程設計提供了獨立實踐的機
5、會,將課本上的理論知識和實際有機的結合起來,充分的鍛煉分析解決實際問題的能力。提高了適應實際,實踐編程的能力。</p><p><b> 1.1課程設計目的</b></p><p> 程序設計實踐主要是培養(yǎng)學生利用系統(tǒng)綜合C++語言進行程序設計的能力。</p><p> ?。?)進一步鞏固和復習C++程序設計的基礎知識。</p>
6、<p> ?。?)培養(yǎng)結構化程序、模塊化程序設計的方法和能力。</p><p> ?。?)了解軟件的編制過程及各環(huán)節(jié)的具體內容。</p><p> ?。?)提高程序調試技巧、軟件設計能力和代碼規(guī)范化等素質。</p><p> ?。?)提高分析問題、解決問題以及實際運用能力。 </p><p><b> (6)功能要求
7、:</b></p><p> 基本要求:設計的系統(tǒng)界面要美觀大方,操作合理,有必要的提示。</p><p> 創(chuàng)新要求:在基本要求達到后,進行創(chuàng)新設計。對系統(tǒng)進行功能模塊分析、控制流程分析正確。系統(tǒng)設計要實用,編程簡練,可用,功能全面,并有一定的容錯能力。說明書、流程圖要清楚。要求程序設計合理,用戶界面良好,如采用菜單工作方式。</p><p>
8、1.2開發(fā)工具的介紹</p><p> 關于Visual C++</p><p> Visual C++6.0 是Microsoft公司在1998年推出的基于Windows 9X和Windows NT的優(yōu)秀集成開發(fā)環(huán)境。該環(huán)境為用戶提供了良好的可視化編程環(huán)境,程序員可以里利用該開發(fā)環(huán)境輕松地訪問C++源代碼編輯器,資源編輯器和使用內部調試器,并且可以創(chuàng)建項目文件。Visual C++6
9、.0不僅包括編譯器,而且它還包括許多有用組件,通過這些組件的協(xié)同工作,可以在Visual C++6.0集成環(huán)境中輕松地完成創(chuàng)建源文件,編輯資源,以及對程序的編譯,連接和調試等各項工作。</p><p> VC++6.0是Windows 95/98、XP或Windows NT下的一個應用程序,本身對軟硬件沒有特殊要求。就是說它對環(huán)境的要求與Windows 95/98、Windows NT要求是一致的。</p
10、><p> 硬件要求:一般在586以上的處理器、16MB以上內存、100MB以上的硬盤。</p><p> 軟件要求:Windows 95/98或Windows NT3.51以上版本。</p><p> VC++ 6.0系統(tǒng)可以在一張CD盤上,也可以在“Visual Studio( Visual C++、Visual Foxpro)”等產(chǎn)品的第一張CD盤上。一般都
11、有一個VC的自動安裝程序,也可以執(zhí)行VC6目錄下的setup.exe,在安裝包的提示下進行,對初學者可采用“典型安裝”方式。</p><p> 在安裝好VC 6.0系統(tǒng)后,有時根據(jù)需要添加或刪除某些部件,可插入CD盤重新執(zhí)行setup.exe安裝程序,安裝程序會檢測當前系統(tǒng)安裝VC6的足件,用戶單擊“添加/刪除”按鈕后,在“安裝維護”對話框中選定要添加的部件或撤消選定要刪除的部件。</p><
12、;p> 與一般的應用軟件一樣,有以下兩種啟動方式:</p><p> (1)通過“開始”按鈕,選擇“程序”菜單,然后打開“Microsoft Visual studio 6.0中文版”子菜單中的“Microsoft Visual C++ 6.0 中文版”程序。</p><p> (2)用戶也可以使用命令行啟動VC。單擊“開始”按鈕后選擇“運行”命令,在“運行”對話框中輸入c:\
13、Program Files\Microsoft Visual Studio\VC98\VC6.exe(按默認盤符和路徑安裝)即可。</p><p> 1.3功能說明:打地鼠是一種非常有趣的益智游戲。游戲進行時,地鼠會不斷從洞口探出頭來再縮回去,地鼠頭在洞外時,可以通過案件的方式打擊地鼠,時間到時游戲結束,打中地鼠次數(shù)越多分數(shù)越高,打中紅色地鼠會減分,灰色地鼠分數(shù)比棕色地鼠分數(shù)低。打破記錄可以刷新成績。點擊鼠標左
14、鍵可以打擊地鼠。</p><p><b> 2 概要設計</b></p><p> 2.1 系統(tǒng)總體分析</p><p> 開發(fā)環(huán)境:Microsoft WindowsXP TASM</p><p> 2.2 主模塊涉及的基本概念及說明</p><p> 2.2.1Message 消息機
15、制</p><p> 在Windows中發(fā)生的一切都可以用消息來表示,消息用于告訴操作系統(tǒng)發(fā)生了什么,所有的Windows應用程序都是消息驅動的。 一個消息是由消息的名稱(UINT)和兩個參數(shù)(WPARAM, LPARAM)組成。消息的參數(shù)中包含有重要的信息。主要包括程序核心,輸入焦點,消息分類,消息隊列,消息循環(huán),消息分類。一個消息由一個消息名稱(UINT),和兩個參數(shù)(WPARAM,LPARAM)組成。&l
16、t;/p><p> 本設計中主要用Msg 來調用Messagebox里的消息。從而來實現(xiàn)鼠標點擊實現(xiàn)功能的操作。例如對鼠標消息而言,LPARAM中一般包含鼠標的位置信息。Msg變量是型態(tài)為MSG的結構。當鼠標在某個窗口內移動時,Windows會不斷地發(fā)出鼠標移動消息WM_MOUSEMOVE,并把鼠標的最新位置傳給該窗口。如果在窗口的范圍內按下鼠標左鍵,系統(tǒng)就會發(fā)出“按下左鍵”的WM_LBUTTONDOWN消息給該窗
17、口,等到用戶放開按鍵后,再發(fā)出“放開左鍵”的WM_LBUTTONUP消息給該窗口。消息可以看做是一個動作。操作系統(tǒng)把消息給封裝成結構。</p><p> 本設計中主要用WindowFunc函數(shù)來調用消息循環(huán)。Windows為當前執(zhí)行的每個Windows程序維護一個消息隊列。在發(fā)生輸入事件之后,Windows將事件轉換為一個消息并將消息放入程序的消息隊列中。程序通過執(zhí)行一塊稱之為消息循環(huán)的程序代碼從消息隊列中取出
18、消息。本程序中在時鐘運行里運用到了消息循環(huán)。例</p><p><b> while(1)</b></p><p><b> {</b></p><p> if( PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))//消息循環(huán)</p><p><b&g
19、t; {</b></p><p> if (!GetMessage(&msg,NULL,0,0))//接收消息</p><p><b> {</b></p><p> return msg.wParam;</p><p><b> }</b></p>&l
20、t;p> TranslateMessage(&msg);//翻譯消息</p><p> DispatchMessage(&msg);//處理消息</p><p><b> }</b></p><p> else if( bActive)</p><p><b> {</b&
21、gt;</p><p> UpdateFrame();</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> WaitMessage();</p>
22、<p><b> }</b></p><p><b> }</b></p><p> KillTimer(hwnd,1);//時鐘停止</p><p> return msg.wParam;</p><p><b> }</b></p>&l
23、t;p> 消息循環(huán)的過程如圖1—1所示:</p><p><b> 圖1-1</b></p><p> 在程序的時鐘里也運用到了消息隊列的思想。消息隊列就是Windows中有一個系統(tǒng)消息隊列,對于每一個正在執(zhí)行的Windows應用程序,系統(tǒng)為其建立一個“消息隊列”,即應用程序隊列,用來存放該程序可能創(chuàng)建的各種窗口的消息。應用程序中含有一段稱作“消息循環(huán)”的
24、代碼,用來從消息隊列中檢索這些消息并把它們分發(fā)到相應的窗口函數(shù)中。在消息循環(huán)中沒有消息的話就排隊等待。沒有消息就創(chuàng)建空傳消息。</p><p> 2.2.2DirectDraw</p><p> DirectDraw是通過基于COM的接口提供服務。在DirectX 5.0版本中,這些接口分別是:IDirectDraw2、IDirectDrawSurface3、IDirectDrawPa
25、lette、IDirectDrawClipper和IDirectDrawVideoPort。DirectX的這些組件是向下兼容的,它們仍然支持舊版本中的所有功能。</p><p> DirectDraw是DirectX中的關于視頻輸入輸出的基本部分,使用DirectDraw可以方便地編制出高效的視頻處理程序,只要用戶的硬件支持DirectDraw,就能保證你的代碼可以處理它們。</p><p
26、> 與DirectX其它組件一樣,只要可能,DirectDraw就會最高程度的利用硬件執(zhí)行某特定功能,并且讓那些該硬件還不支持的特性也能用軟件仿真的方式加以實現(xiàn)。設備無關性通常是通過硬件抽象層(HAL:Hardware abstraction layer)實現(xiàn)的。</p><p> DirectDraw主要提供了完成以下任務的工具:</p><p> 管理多頁面 ,直接訪問視頻
27、RAM ,換頁(Page flipping) ,后臺緩存(Back buffering) ,管理調色板(Palette) ,裁剪(Clipping) ,視頻端口(Video port)。</p><p> 除此之外,DirectDraw允許開發(fā)者在應用程序運行期測定顯示硬件的特性,然后,充分利用主機硬件設備的加速特性為用戶提供可能的最優(yōu)的顯示速度和效果。</p><p> Direct
28、Draw對象的創(chuàng)建和準備的每一步驟:</p><p> 1. 創(chuàng)建DirectDraw 對象:創(chuàng)建DirectDraw 對象的一個實例,應該用DirectDrawCreate API 函數(shù),也可以用COM中的CoCreateInstance函數(shù)。DirectDrawCreate用一個全局統(tǒng)一標志符GUID(Globally Unique IDentifier)來表征顯示設備,在大多數(shù)情況下GUID為NULL(使
29、用系統(tǒng)的缺省顯示設備,既“空設備”);指針指向DirectDraw對象的地址;第三個參數(shù)總是NULL(供將來擴展使用)。下述代碼表明了如何創(chuàng)建一個DirectDraw對象,并且檢驗是否成功。</p><p> 2.設置顯示模式:設置DirectDraw 應用程序的顯示模式需要兩步:首先調用IDirectDraw::SetCooperativeLevel方法來設定該模式下的要求,一旦確定了要求,再用IDirect
30、Draw::SetDisplayMode 方法來選擇顯示分辨率。在改變顯示分辨率之前,還必須通過IDirectDraw::SetCooperativeLevel方法來指定DDSCL_EXCLUSIVE和DDSCL_FULLSCREEN 標志。這樣能使游戲程序完全控制顯示設備,其它的應用程序不能同時共享顯示設備。DDSCL_FULLSCREEN標志表示將程序設為全屏模式。使用IDirectDraw::SetCooperativeLevel
31、時,必須向窗口 (HWND)傳送一個句柄,讓窗口決定何時非正常地終止應用程序。例如,若發(fā)生了GP錯誤或GDI被翻轉(flip)到了后臺緩沖區(qū),用戶就無法訪問當前屏幕。為了避免這種情況,DirectDraw有一個后臺等待進程,它俘獲所有發(fā)往該窗口的消息,用這些消息來確定應用程序何時終止。如果創(chuàng)建了新的窗口,必須確定該窗口為活動的,否則,就會有一系列的事件無</p><p> 3.改變顯示模式一旦選擇了應用程序的工
32、作模式,就可以使用方法來改變顯示模式。</p><p> 4.創(chuàng)建可翻轉表面(Flippable Surface) :設定了顯示模式后,必須創(chuàng)建放置應用程序的表面。</p><p> 5. 定義表面要求:創(chuàng)建可翻轉表面的的第一步是在DDSURFACEDESC結構中定義表面的要求。</p><p> 6. 創(chuàng)建表面: 填完了DDSURFACEDESC結構,就可以
33、使用該結構和lpDD了,lpDD是用DirectDrawCreate 方法創(chuàng)建的DirectDraw 對象的指針。</p><p> 7.取得后臺緩沖區(qū)的指針: 使用IDirectDrawSurface::GetAttachedSurface 方法可以取得后臺緩沖區(qū)的指針。</p><p> 8.著色表面: 創(chuàng)建了主表面和后臺緩沖區(qū)后,DDEX1使用標準的Windows GD
34、I 函數(shù)將一些文本提交到主表面和后臺緩沖區(qū)。一般來講,當向表面寫數(shù)據(jù)時,該表面就是后臺緩沖區(qū),然后將緩沖區(qū)翻轉成主表面顯示出來。在DDEX1中,第一次翻轉表面之前有一個重要的延遲。于是DDEX1就將數(shù)據(jù)寫入主緩沖區(qū),避免開始顯示時有太長的時間間隔。后面將會講到,DDEX1只在 WM_TIMER期間向后臺寫數(shù)據(jù)。初始化函數(shù)或標題頭可能會寫入主緩沖區(qū)。應該注意的是,一旦使用IDirectDrawSurface::Unlock對表面解鎖,指向
35、表面的指針就變成無效,必須再次使用IDirectDrawSurface::Lock方法才能獲取該表面內存的有效指針。</p><p> 9.寫表面及翻轉表面: 完成了初始化后,DDEX1開始處理消息循環(huán)。在消息循環(huán)的過程中,完成鎖定后臺緩沖區(qū)——寫入新的文本——解鎖后臺緩沖區(qū)——翻轉表面的過程。WM_TIMER包含了寫數(shù)據(jù)和翻轉表面的大部分代碼。 WM_TIMER消息的前半部分用于向后臺緩沖區(qū)寫數(shù)據(jù),“phas
36、e”變量決定是寫主緩沖區(qū)消息還是寫后臺緩沖區(qū)消息。如果phase為1,表示寫主緩沖區(qū)的消息,然后將phase改變?yōu)?;若為0,表示寫后臺緩沖區(qū)的消息,然后將phase改變?yōu)?。注意,兩種情況中的消息都是寫向后臺緩沖區(qū)。后臺緩沖區(qū)寫入了消息后,使用IDirectDrawSurface::ReleaseDC方法解鎖。</p><p> 10. 釋放DirectDraw 對象: 當按了F12后,DDEX1程序在退出之
37、前先處理WM_DESTROY消息,該消息調用了finiObjects函數(shù),而finiObjects函數(shù)包含了所有的IUnknown Release的調用。</p><p> 11. 將位圖調入表面: 如DDEX1中一樣,doInit函數(shù)是DDEX2的初始化函數(shù),兩者的實質一樣。</p><p> 12.設置調色板,將位圖調入后臺緩沖區(qū): 創(chuàng)建了調色板之后,可以通過調用IDirectDr
38、awSurface::SetPalette 方法將DirectDrawPalette 對象的指針ddpal傳送給主表面。</p><p> 13. 從屏外表面位塊傳輸: DDEX2同DDEX1基本相同。DDEX2打開一個位圖文件并將它送往后臺緩沖區(qū),然后翻轉后臺緩沖區(qū)和主表面。但這對顯示位圖并不特別理想,DDEX3擴展了DDEX2的功能,它加入了兩個屏外緩沖區(qū),每個緩沖區(qū)都存儲一個位圖。</p>
39、<p> 14. 將位圖文件調入屏外表面: 創(chuàng)建了兩個屏外表面后,DDEX3使用了InitSurfaces函數(shù)將位圖從Frntback.bmp文件裝入到兩個表面。InitSurfaces函數(shù)使用了DDCopyBitmap函數(shù)調入兩個位圖。</p><p> 15. 將屏外表面位位塊傳輸?shù)胶笈_緩沖區(qū):WM_TIMER包含了寫表面和翻轉表面的代碼。在DDEX3中,它選擇適當?shù)钠镣獗砻?,并將其位塊傳輸?shù)胶?/p>
40、臺緩沖區(qū)。</p><p> 16. 創(chuàng)建動畫: 1、Color Key和位圖動畫在DDEX3例中描述了將位圖放入屏外緩沖區(qū)的一種主要方式。DDEX4則使用了將背景和一系列的精靈(sprite,本例中精靈是圓環(huán))裝入屏外表面的技術,然后使用, IDirectDrawSurface::BltFast方法將屏外表面的各部分拷貝到后臺緩沖區(qū)。doInit函數(shù)除了具有前面例子中的功能外,還包括了為精靈設置Color k
41、ey的代碼。Color key是用于設置透明度的顏色值。當使用硬件塊寫方式時,矩型區(qū)域內除了設為 color key的像素,其它的像素都被塊寫,由此在表面上產(chǎn)生非矩型的精靈。</p><p> 17.動態(tài)改變調色板:DDEX5描述了任何在程序運行時動態(tài)地改變調色板,盡管在游戲中這并不總是用到。DirectDraw確實能很好地控制調色板。</p><p> 18. 替換調色板:DDEX5
42、中的updateFrame函數(shù)同DDEX4中的基本相同,先將背景塊寫入后臺緩沖區(qū),再將3個紅色圓環(huán)塊寫到前景。</p><p> 19. 使用覆蓋表面(Overlay): 創(chuàng)建一個主表面要使用覆蓋表面,必須先要初始化一個主表面,覆蓋表面將顯示在該主表面上。檢測硬件對覆蓋的支持 初始化DirectDraw后,需要檢測設備是否支持覆蓋表面。因為DirectDraw不能仿真覆蓋,所以如果硬件不支持覆蓋,就不能繼續(xù)下面
43、的工作。你可以用方法獲取硬件設備驅動程序的能力檢測覆蓋支持。在調用該方法之后,查看DDCAPS結構中的dwFlags成員是否包含有DDCAPS_OVERLAY標志。若有就表明支持覆蓋,否則就不支持。創(chuàng)建一個覆蓋表面如果知道顯示設備支持覆蓋表面,就可以創(chuàng)建一個。因為沒有指明設備怎樣支持覆蓋表面的標準,所以不能夠期望創(chuàng)建任意大小的像素格式的表面。另外,也不要期望第一次創(chuàng)建覆蓋表面就會成功。因此,必須作好準備進行多次創(chuàng)建的嘗試,直到有一個能夠
44、工作為止。Mosquito程序在創(chuàng)建表面時遵循“best case to worst case”的原則,首先嘗試創(chuàng)建一個三緩沖頁翻轉復雜覆蓋表面。如果嘗試失敗,程序就改變方法嘗試用其它通用的迅速格式來配置。顯示覆蓋表面創(chuàng)建了覆蓋表面之后就可以顯示它了。通常,硬件在用于顯示覆蓋</p><p><b> 3 詳細設計</b></p><p> 3.1 主要的函數(shù)和定
45、義說明</p><p> 3.1.1 WinMain函數(shù)</p><p> 主函數(shù)的入口。和我們以前的main()函數(shù)一樣。</p><p> 本次設計中的具體定義:</p><p> INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCm
46、dLine,int nMode)。</p><p> 3.1.2 WM_LBUTTONDOWN </p><p> WM_LBUTTONDOWN消息當用戶在window客戶區(qū)域點擊鼠標左鍵的時候發(fā)送。如果當前鼠標沒有被捕捉,消息發(fā)送給鼠標下面的window窗體。否則,消息發(fā)送給當前捕捉鼠標消息的方法。</p><p> 3.1.3 WindowFun函
47、數(shù)</p><p> 窗口構造函數(shù),注冊函數(shù),自動調用,處理消息循環(huán)。</p><p> 本次設計中的具體定義:LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)。</p><p> 3.1.4 InitDDraw()函數(shù)</p>&l
48、t;p> 運用了directdraw編程,初始化directdraw。主要作用是創(chuàng)建DirectDraw對象,設置協(xié)作級別為窗口模式,創(chuàng)建主頁面,創(chuàng)建離屏頁面,創(chuàng)建老鼠頁面,創(chuàng)建木錘,創(chuàng)建火花,創(chuàng)建標題,創(chuàng)建背景,創(chuàng)建時間,創(chuàng)建分數(shù)頁面,創(chuàng)建Clipper裁剪器。</p><p> 本次設計中的具體定義:</p><p> BOOL InitDDraw()</p>
49、<p><b> {</b></p><p> DWORD dwFlags;</p><p> DDSURFACEDESC ddsd;</p><p> //創(chuàng)建DirectDraw對象</p><p> DirectDrawCreate(NULL, &lpDD, NULL);</p
50、><p> //設置協(xié)作級別為窗口模式</p><p> dwFlags = DDSCL_NORMAL;</p><p> lpDD->SetCooperativeLevel(hwnd, dwFlags);</p><p><b> //創(chuàng)建主頁面</b></p><p> ZeroM
51、emory(&ddsd, sizeof(ddsd));</p><p> ddsd.dwSize = sizeof(ddsd);</p><p> ddsd.dwFlags = DDSD_CAPS;</p><p> ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;</p><p>
52、lpDD->CreateSurface(&ddsd, &lpDDSFront, NULL);</p><p><b> //創(chuàng)建離屏頁面</b></p><p> ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; </p><p> ddsd.ddsCap
53、s.dwCaps = DDSCAPS_OFFSCREENPLAIN;</p><p> RECT rect;</p><p> GetClientRect(hwnd, &rect);</p><p> forewidth=rect.right-rect.left;</p><p> foreheight=rect.botto
54、m-rect.top;</p><p> GetRect(&backrect, 0, 0, 433,348);</p><p> ddsd.dwWidth = backwidth=forewidth;</p><p> ddsd.dwHeight = backheight=foreheight;</p><p> lpDD-&
55、gt;CreateSurface( &ddsd, &lpDDSBack, NULL );</p><p><b> //創(chuàng)建老鼠頁面</b></p><p> ddsd.dwWidth = 124;</p><p> ddsd.dwHeight = 425;</p><p> lpDD->C
56、reateSurface( &ddsd, &lpDDSMouse[0], NULL );</p><p> lpDD->CreateSurface( &ddsd, &lpDDSMouse[1], NULL );</p><p> lpDD->CreateSurface( &ddsd, &lpDDSMouse[2], NULL
57、);</p><p> DDReLoadBitmap(lpDDSMouse[0], "MOUSE00.BMP");</p><p> DDReLoadBitmap(lpDDSMouse[1], "MOUSE01.BMP");</p><p> DDReLoadBitmap(lpDDSMouse[2], "MOU
58、SE02.BMP");</p><p> DDSetColorKey(lpDDSMouse[0],RGB(0,0,255));</p><p> DDSetColorKey(lpDDSMouse[1],RGB(0,0,255));</p><p> DDSetColorKey(lpDDSMouse[2],RGB(0,0,255));</p>
59、;<p><b> //創(chuàng)建木錘</b></p><p> ddsd.dwWidth = 68;</p><p> ddsd.dwHeight = 136;</p><p> lpDD->CreateSurface( &ddsd, &lpDDSHammer, NULL );</p>&l
60、t;p> DDReLoadBitmap(lpDDSHammer, "HAM.BMP");</p><p> DDSetColorKey(lpDDSHammer,RGB(0,0,255));</p><p><b> //創(chuàng)建火花</b></p><p> ddsd.dwWidth = 68;</p>
61、<p> ddsd.dwHeight = 24;</p><p> lpDD->CreateSurface( &ddsd, &lpDDSBow, NULL );</p><p> DDReLoadBitmap(lpDDSBow, "Bow.BMP");</p><p> DDSetColorKey(lp
62、DDSBow,RGB(255,0,127));</p><p><b> //創(chuàng)建標題</b></p><p> ddsd.dwWidth = 319;</p><p> ddsd.dwHeight = 56;</p><p> lpDD->CreateSurface( &ddsd, &lp
63、DDSLogo, NULL );</p><p> DDReLoadBitmap(lpDDSLogo, "logo.BMP");</p><p> DDSetColorKey(lpDDSLogo,RGB(0,0,255));</p><p><b> //創(chuàng)建背景</b></p><p> d
64、dsd.dwWidth = 433;</p><p> ddsd.dwHeight = 348;</p><p> lpDD->CreateSurface( &ddsd, &lpDDSBk, NULL );</p><p> DDReLoadBitmap(lpDDSBk, "BK.BMP");</p>&
65、lt;p><b> //創(chuàng)建時間</b></p><p> ddsd.dwWidth = 45;</p><p> ddsd.dwHeight = 13;</p><p> lpDD->CreateSurface( &ddsd, &lpDDSTime, NULL );</p><p>
66、 DDReLoadBitmap(lpDDSTime, "Time.BMP");</p><p> DDSetColorKey(lpDDSTime,RGB(255,0,127));</p><p><b> //創(chuàng)建數(shù)字</b></p><p> ddsd.dwWidth = 260;</p><p
67、> ddsd.dwHeight = 38;</p><p> lpDD->CreateSurface( &ddsd, &lpDDSHamfig, NULL );</p><p> DDReLoadBitmap(lpDDSHamfig, "Hamfig.BMP");</p><p> DDSetColorKey(
68、lpDDSHamfig,RGB(255,0,127));</p><p><b> //創(chuàng)建數(shù)字</b></p><p> ddsd.dwWidth = 160;</p><p> ddsd.dwHeight = 23;</p><p> lpDD->CreateSurface( &ddsd, &a
69、mp;lpDDSFig, NULL );</p><p> DDReLoadBitmap(lpDDSFig, "fig.BMP");</p><p> DDSetColorKey(lpDDSFig,RGB(255,0,127));</p><p><b> //創(chuàng)建分數(shù)頁面</b></p><p&g
70、t; ddsd.dwWidth = 43;</p><p> ddsd.dwHeight = 25;</p><p> lpDD->CreateSurface( &ddsd, &lpDDSScore[0], NULL );</p><p> lpDD->CreateSurface( &ddsd, &lpDDSSco
71、re[1], NULL );</p><p> lpDD->CreateSurface( &ddsd, &lpDDSScore[2], NULL );</p><p> DDReLoadBitmap(lpDDSScore[0], "Score01.BMP");</p><p> DDReLoadBitmap(lpDDS
72、Score[1], "Score02.BMP");</p><p> DDReLoadBitmap(lpDDSScore[2], "Score03.BMP");</p><p> DDSetColorKey(lpDDSScore[0],RGB(255,0,127));</p><p> DDSetColorKey(lpD
73、DSScore[1],RGB(255,0,127));</p><p> DDSetColorKey(lpDDSScore[2],RGB(255,0,127));</p><p> //創(chuàng)建Clipper裁剪器</p><p> lpDD->CreateClipper(0, &lpClipper, NULL);</p><p&
74、gt; lpClipper->SetHWnd(0, hwnd);</p><p> lpDDSFront->SetClipper(lpClipper);</p><p> return TRUE;</p><p><b> }</b></p><p> 3.1.5 InitData()函數(shù)<
75、;/p><p> 在本次設計中的作用是數(shù)據(jù)初始化。實現(xiàn)老鼠洞位置數(shù)據(jù)的初始化,老鼠頭位置的初始化。</p><p> 本次設計中的具體定義:</p><p> void InitData()</p><p><b> {</b></p><p><b> int i;</b&
76、gt;</p><p> bActive = true;</p><p> delay = 5;</p><p> dwLastTickCount = 0;</p><p> hit = false;</p><p> get = false;</p><p> time = 20;
77、</p><p> score = 0;</p><p> RECT Window;</p><p> GameStatus = 0;</p><p> GetClientRect(hwnd, &Window);</p><p> pt.x=pt.y=0;</p><p>
78、ClientToScreen(hwnd, &pt);</p><p> //初始化老鼠洞位置</p><p> holepos[0].x = 24;</p><p> holepos[0].y = 215;</p><p> holepos[1].x = 160;</p><p> holepos[1
79、].y = 215;</p><p> holepos[2].x = 296;</p><p> holepos[2].y = 215;</p><p> holepos[3].x = 1;</p><p> holepos[3].y = 150;</p><p> holepos[4].x = 137;&l
80、t;/p><p> holepos[4].y = 150;</p><p> holepos[5].x = 274;</p><p> holepos[5].y = 150;</p><p> holepos[6].x = 32;</p><p> holepos[6].y = 87;</p>&l
81、t;p> holepos[7].x = 159;</p><p> holepos[7].y = 87;</p><p> holepos[8].x = 287;</p><p> holepos[8].y = 87;</p><p> //初始化老鼠頭位置</p><p> for (i = 0 ;
82、i <9;i++)</p><p><b> {</b></p><p> mousepos[i].x = holepos[i].x + 25;</p><p> mousepos[i].y = holepos[i].y +15;</p><p><b> }</b></p>
83、;<p> mousewidth = 62;</p><p> mouseheight = 62;</p><p><b> //初始化老鼠洞</b></p><p> for (i =0 ;i<9;i++)</p><p><b> {</b></p>
84、<p> mouse[i] = 1;</p><p> status[i] = 0;</p><p> holepos[i].y -= 21;</p><p> mousepos[i].y -= 21;</p><p> behit[i] = 0;</p><p><b> }</
85、b></p><p><b> }</b></p><p> 3.1.6 DrawAll()函數(shù)</p><p> 本次設計中主要功能是畫出所需要的圖片,包括背景,老鼠,木槌。</p><p> 本次設計中的具體定義:</p><p> void DrawAll()//畫出所需
86、要的圖片</p><p><b> {</b></p><p><b> int i;</b></p><p> HRESULT rval;</p><p> RECT rect,rect1;</p><p><b> ……</b></p
87、><p><b> }</b></p><p> 3.1.7 WM_LBUTTONDOWN</p><p> WM_LBUTTONDOWN消息當用戶在window客戶區(qū)域點擊鼠標左鍵的時候發(fā)送。如果當前鼠標沒有被捕捉,消息發(fā)送給鼠標下面的window窗體。否則,消息發(fā)送給當前捕捉鼠標消息的方法。</p><p><
88、;b> 程序如下:</b></p><p> case WM_LBUTTONDOWN:</p><p> if (GameStatus == 1)</p><p><b> {</b></p><p> hit = true;</p><p> get = false
89、;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> StartGame();</p><p><b> }</b></p>
90、;<p><b> break;</b></p><p> 3.1.8 WM_SETCURSOR:</p><p><b> 作用是光標消息。</b></p><p><b> 程序如下:</b></p><p> case WM_SETCURSOR:
91、</p><p> SetCursor(NULL);</p><p> 3.1.9 WM_KEYDOWN</p><p><b> 作用是鍵盤消息。</b></p><p> case WM_KEYDOWN:</p><p> switch (char(wParam))</p&g
92、t;<p><b> {</b></p><p> case VK_SUBTRACT:</p><p> delay += 2;</p><p><b> break;</b></p><p> case VK_ADD:</p><p> if (d
93、elay>2)delay -= 2;</p><p><b> break;</b></p><p> case VK_ESCAPE:</p><p> MessageBox(hwnd,"送給你的...:)\n From:\n 耗子\nhttp://rpg.3322.
94、net\n Raynor@ah163.com","關于這個游戲",MB_OK);</p><p> PostQuitMessage(0);</p><p><b> break;</b></p><p><b> }</b></p><p><b>
95、 break;</b></p><p> 3.1.10 WM_LBUTTONUP</p><p> 窗口消息當光標在窗口客戶區(qū)時,用戶釋放鼠標左鍵時發(fā)出的消息。如果鼠標沒有捕獲,這個消息被送到光標下的窗口。否則,該消息發(fā)布到捕獲鼠標的窗口。</p><p><b> 程序如下:</b></p><p&g
96、t; case WM_LBUTTONUP: </p><p> hit = false;</p><p><b> break;</b></p><p> 3.1.11 WM_DESTROY:</p><p> WM_DESTROY 是關閉程序的,關閉程序時彈出對話框。</p><p&g
97、t;<b> 程序如下:</b></p><p> case WM_DESTROY:</p><p> MessageBox(hwnd,"送給你的...:)\nFrom:\n "關于這個游戲",MB_OK);</p><p> PostQuitMessage(0);</p><p>
98、;<b> break;</b></p><p> 3.1.12 WM_MOUSEMOVE:</p><p> 作用是鼠標移動對應的坐標。</p><p><b> 程序如下:</b></p><p> case WM_MOUSEMOVE:</p><p>
99、pos.x = LOWORD(lParam);</p><p> pos.y = HIWORD(lParam);</p><p><b> break;</b></p><p> 3.1.13 WM_TIMER</p><p> c++中定時器 告訴windows一個時間間隔,然后windows以此時間間隔周期性
100、觸發(fā)程序。</p><p><b> 程序如下:</b></p><p> case WM_TIMER:</p><p> if (bActive)</p><p><b> {</b></p><p> switch (wParam)</p><
101、;p><b> {</b></p><p><b> case 1:</b></p><p> StepAll();</p><p><b> break;</b></p><p><b> case 2:</b></p>&
102、lt;p><b> time --;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> break;</b>&
103、lt;/p><p><b> default:</b></p><p> return DefWindowProc(hwnd,message,wParam,lParam);</p><p><b> break;</b></p><p><b> }</b></p&g
104、t;<p><b> return 0;</b></p><p><b> }</b></p><p> 3.1.14 hwnd的作用 介紹如下程序:</p><p> hwnd = CreateWindow(//設計窗口</p><p> szClassName,<
105、/p><p><b> "打老鼠",</b></p><p> WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX|WS_POPUP,//窗口坐標</p><p> 180,//窗口的位置程序框頂點到顯示框頂點之間是180 和80</p><p><b> 80,&
106、lt;/b></p><p> 433,//窗口的長寬</p><p><b> 348,</b></p><p> HWND_DESKTOP,</p><p><b> NULL,</b></p><p> hInstance,</p><
107、;p><b> NULL);</b></p><p> 3.1.15 ShowWindow(hwnd,nMode);//顯示窗口hwnd</p><p> 3.1.16 UpdateWindow(hwnd);//更新窗口</p><p> 3.1.17 InitData()</p><p>
108、如下程序含義定義的SetTimer(窗口中設置時鐘,時鐘的編號,時鐘的速度,NUll)。</p><p> 單位是毫秒,表示1000毫秒的時鐘,滴答一下。設置時鐘的目的是有消息timer, 每滴答一下 ,響應消息 ,執(zhí)行消息響應。</p><p><b> 程序如下:</b></p><p> SetTimer(hwnd,1,200,NU
109、LL);</p><p> SetTimer(hwnd,2,1000,NULL);</p><p><b> 3 程序調試</b></p><p> 3.1 調試成果及講解</p><p> 3.1.1三種種類的老鼠</p><p><b> 圖3-1</b><
110、;/p><p> 如圖3-1 土黃老鼠是可愛的老鼠,是普通地鼠,分數(shù)也普通。</p><p><b> 圖3-2</b></p><p> 如圖3-2 粉紅色老鼠頭上有個可愛的蝴蝶結,不能隨便打,會倒扣分數(shù)。</p><p><b> 圖3-3</b></p><p>
111、 如圖3-3 黑老鼠有兇惡的眼神,速度很快,打擊難度高,分數(shù)也高。</p><p><b> 3.2運行效果</b></p><p><b> 初始:</b></p><p><b> 圖3-4</b></p><p> 點擊左鍵跳出如下對話框,點擊確定,進入游戲。
112、</p><p><b> 圖3-5</b></p><p> 游戲結束 出現(xiàn)如下對話框。點擊確定 ,再來一局。</p><p> 再玩一局破紀錄后出現(xiàn)如下對話框,記錄刷新。</p><p><b> 圖3-6</b></p><p> 打中的老鼠會頭金星,出現(xiàn)如下
113、星星:</p><p><b> 5 心得體會</b></p><p> 在學習C++以前,我認為C++只是在C語言的基礎上的一種延伸,認為只要學過C語言,就可以用C語言的那種設計思想來學習C++、設計C++程序。正是由于抱了這種錯誤的思想,使我在一開始學習C++的時候遇到了很大的困難,我沒有辦法體會面向對象的設計思想,我在學習這門課的時候老是想著實現(xiàn)這個函數(shù)功能
114、的具體過程,而沒太注意對象分類的重要性。</p><p> 隨著課程學習的深入,我感覺到了利用類和對象、繼承、封裝等一系列知識可以把我們程序中很多繁雜、重復的部分省略掉,還可以解決一些利用面向過程的設計思想無法解決的問題,我自己也試著編寫一些小的C++程序,當然在這個過程中遇到了很多困難,其中調試帶來的困難讓我無法忘記,在調試程序的同時,我也總結出來了一些調試的小技巧,讓我在C語言課程設計中也受用匪淺。雖然現(xiàn)在
115、仍然會有一些問題不能解決比如插入透明圖片的問題。但是在今后的學習和努力中會發(fā)現(xiàn)更多的東西,更加的進步。</p><p> 在學習這門課的過程中,我感受到了自己親自動手編程序、調程序的重要性,我們要熟悉C++的語法、體會調試的思想,最好的一個手段就是自己動手編程、調試,這會比我們一味的看書效果好得多。</p><p> 另外,我還感覺到一個好的程序編出來需要很多人的團結合作。我在檢查自己
116、編寫的程序是否有BUG未被找出的時候,我會讓我的同學作為一個程序使用者來找出未發(fā)現(xiàn)的BUG并提出改進意見,這讓我們的工作更加高效。</p><p> 很高興能夠了解到C++的神奇魅力和面向對象程序設計的獨特思想,它為我今后的程序設計奠定了基礎。感謝老師對我們的悉心教授!參考文獻</p><p> [1] 譚浩強,《C程序設計》,清華大學出版社</p><p>
117、 [2] 劉振安,孫忱,劉燕君,《C程序設計課程設計》,機械工業(yè)出版社</p><p> [3] 汪詩林,《數(shù)據(jù)結構算法與應用》,機械工業(yè)出版社</p><p> [4] 陳錦昌,趙明秀.C語言計算機繪圖教程.華南理工大學出版社.1998.9</p><p> 附錄(部分主要程序)</p><p> #include <wind
118、ows.h></p><p> #include <ddraw.h></p><p> #include "ddutil.h"</p><p> #include "stdio.h"</p><p> #include "resource.h"</p&
119、gt;<p><b> //函數(shù)聲明</b></p><p> INT UpdateFrame();</p><p> LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);</p><p> BOOL InitDDraw( void );</p><
120、p> void GetRect(RECT* rect, long left, long top, long width, long height);</p><p> void Flip(void);</p><p> void DrawAll();</p><p> void InitData();</p><p> voi
121、d CheckHit();</p><p> void StepAll();</p><p> void StartGame();</p><p> void DrawNumber(LPDIRECTDRAWSURFACE dd,LPDIRECTDRAWSURFACE ss,int num,int x,int y,int width,int height);&l
122、t;/p><p><b> //全局變量</b></p><p> char szClassName[] = "ForEpork";</p><p> HWND hwnd;//showwindow函數(shù)中whnd的定義</p><p> HINSTANCE hInst;</p><
123、;p> BOOL bActive;</p><p> DWORD delay;//延時</p><p> DWORD dwTickCount,dwLastTickCount;</p><p> //關于游戲的全局變量</p><p> BOOLhit,get;</p><p> POI
124、NTpos;//木錘位置</p><p> intforewidth, foreheight;//前臺頁面的寬度和高度</p><p> RECTbackrect;//后臺頁面映射矩形</p><p> intbackwidth, backheight;//后臺頁面的寬度和高度</p><p> intm
125、ouse[9];//老鼠洞出現(xiàn)東東的紀錄</p><p> POINTholepos[9];//老鼠洞的位置</p><p> POINTmousepos[9];//老鼠頭的位置</p><p> intstatus[9];//老鼠狀態(tài),0-4</p><p> intbehit[9];//老鼠
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 打地鼠vb課程設計
- 虛擬儀器打地鼠課程設計
- 單片機課程設計--打地鼠
- 基于plc的打地鼠游戲課程設計
- 嵌入式課程設計報告--基于arm平臺的打地鼠游戲
- 打地鼠游戲
- 打磚塊游戲課程設計報告
- 打地鼠程序設計.docx
- 中班體育游戲《打地鼠》
- 打地鼠游戲-項目總結.docx
- 實例六打地鼠主體部分
- 打老鼠-300字優(yōu)秀作文
- 打老鼠-600字優(yōu)秀作文
- 從“打地鼠”到“22條軍規(guī)”
- java打地鼠游戲畢業(yè)論文
- 打地鼠游戲-功能點描述.xlsx
- 打地鼠游戲-功能點描述.xlsx
- java打地鼠游戲畢業(yè)論文
- 基于51單片機的打地鼠游戲設計
- 中一班戶外游戲《打地鼠》
評論
0/150
提交評論