版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 程序設(shè)計實踐報告</b></p><p><b> </b></p><p> 學(xué) 院 信息工程 專 業(yè) 計算機科學(xué)與技術(shù)</p><p><b> 目 錄</b></p><p><b> 1 引言
2、1</b></p><p> 1.1課程設(shè)計目的1</p><p> 1.2開發(fā)工具的介紹1</p><p><b> 2 概要設(shè)計2</b></p><p> 2.1 系統(tǒng)總體分析2</p><p> 2.2 主模塊涉及的基本概念及說明2</p>
3、<p><b> 3 詳細(xì)設(shè)計7</b></p><p> 3.1 主要的函數(shù)和定義說明7</p><p> 3.1 調(diào)試成果及講解16</p><p><b> 5 心得體會20</b></p><p><b> 參考文獻21</b></p
4、><p> 附錄…………………………………………………………………………………………………………22</p><p><b> 打地鼠游戲程序設(shè)計</b></p><p><b> 1 引言</b></p><p> 本程序設(shè)計實踐是采用C++語言,在VC平臺下設(shè)計。本課程設(shè)計提供了獨立實踐的機
5、會,將課本上的理論知識和實際有機的結(jié)合起來,充分的鍛煉分析解決實際問題的能力。提高了適應(yīng)實際,實踐編程的能力。</p><p><b> 1.1課程設(shè)計目的</b></p><p> 程序設(shè)計實踐主要是培養(yǎng)學(xué)生利用系統(tǒng)綜合C++語言進行程序設(shè)計的能力。</p><p> ?。?)進一步鞏固和復(fù)習(xí)C++程序設(shè)計的基礎(chǔ)知識。</p>
6、<p> ?。?)培養(yǎng)結(jié)構(gòu)化程序、模塊化程序設(shè)計的方法和能力。</p><p> ?。?)了解軟件的編制過程及各環(huán)節(jié)的具體內(nèi)容。</p><p> (4)提高程序調(diào)試技巧、軟件設(shè)計能力和代碼規(guī)范化等素質(zhì)。</p><p> ?。?)提高分析問題、解決問題以及實際運用能力。 </p><p><b> ?。?)功能要求
7、:</b></p><p> 基本要求:設(shè)計的系統(tǒng)界面要美觀大方,操作合理,有必要的提示。</p><p> 創(chuàng)新要求:在基本要求達到后,進行創(chuàng)新設(shè)計。對系統(tǒng)進行功能模塊分析、控制流程分析正確。系統(tǒng)設(shè)計要實用,編程簡練,可用,功能全面,并有一定的容錯能力。說明書、流程圖要清楚。要求程序設(shè)計合理,用戶界面良好,如采用菜單工作方式。</p><p>
8、1.2開發(fā)工具的介紹</p><p> 關(guān)于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++源代碼編輯器,資源編輯器和使用內(nèi)部調(diào)試器,并且可以創(chuàng)建項目文件。Visual C++6
9、.0不僅包括編譯器,而且它還包括許多有用組件,通過這些組件的協(xié)同工作,可以在Visual C++6.0集成環(huán)境中輕松地完成創(chuàng)建源文件,編輯資源,以及對程序的編譯,連接和調(diào)試等各項工作。</p><p> VC++6.0是Windows 95/98、XP或Windows NT下的一個應(yīng)用程序,本身對軟硬件沒有特殊要求。就是說它對環(huán)境的要求與Windows 95/98、Windows NT要求是一致的。</p
10、><p> 硬件要求:一般在586以上的處理器、16MB以上內(nèi)存、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,在安裝包的提示下進行,對初學(xué)者可采用“典型安裝”方式。</p><p> 在安裝好VC 6.0系統(tǒng)后,有時根據(jù)需要添加或刪除某些部件,可插入CD盤重新執(zhí)行setup.exe安裝程序,安裝程序會檢測當(dāng)前系統(tǒng)安裝VC6的足件,用戶單擊“添加/刪除”按鈕后,在“安裝維護”對話框中選定要添加的部件或撤消選定要刪除的部件。</p><
12、;p> 與一般的應(yīng)用軟件一樣,有以下兩種啟動方式:</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(按默認(rèn)盤符和路徑安裝)即可。</p><p> 1.3功能說明:打地鼠是一種非常有趣的益智游戲。游戲進行時,地鼠會不斷從洞口探出頭來再縮回去,地鼠頭在洞外時,可以通過案件的方式打擊地鼠,時間到時游戲結(jié)束,打中地鼠次數(shù)越多分?jǐn)?shù)越高,打中紅色地鼠會減分,灰色地鼠分?jǐn)?shù)比棕色地鼠分?jǐn)?shù)低。打破記錄可以刷新成績。點擊鼠標(biāo)左
14、鍵可以打擊地鼠。</p><p><b> 2 概要設(shè)計</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應(yīng)用程序都是消息驅(qū)動的。 一個消息是由消息的名稱(UINT)和兩個參數(shù)(WPARAM, LPARAM)組成。消息的參數(shù)中包含有重要的信息。主要包括程序核心,輸入焦點,消息分類,消息隊列,消息循環(huán),消息分類。一個消息由一個消息名稱(UINT),和兩個參數(shù)(WPARAM,LPARAM)組成。&l
16、t;/p><p> 本設(shè)計中主要用Msg 來調(diào)用Messagebox里的消息。從而來實現(xiàn)鼠標(biāo)點擊實現(xiàn)功能的操作。例如對鼠標(biāo)消息而言,LPARAM中一般包含鼠標(biāo)的位置信息。Msg變量是型態(tài)為MSG的結(jié)構(gòu)。當(dāng)鼠標(biāo)在某個窗口內(nèi)移動時,Windows會不斷地發(fā)出鼠標(biāo)移動消息WM_MOUSEMOVE,并把鼠標(biāo)的最新位置傳給該窗口。如果在窗口的范圍內(nèi)按下鼠標(biāo)左鍵,系統(tǒng)就會發(fā)出“按下左鍵”的WM_LBUTTONDOWN消息給該窗
17、口,等到用戶放開按鍵后,再發(fā)出“放開左鍵”的WM_LBUTTONUP消息給該窗口。消息可以看做是一個動作。操作系統(tǒng)把消息給封裝成結(jié)構(gòu)。</p><p> 本設(shè)計中主要用WindowFunc函數(shù)來調(diào)用消息循環(huán)。Windows為當(dāng)前執(zhí)行的每個Windows程序維護一個消息隊列。在發(fā)生輸入事件之后,Windows將事件轉(zhuǎn)換為一個消息并將消息放入程序的消息隊列中。程序通過執(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應(yīng)用程序,系統(tǒng)為其建立一個“消息隊列”,即應(yīng)用程序隊列,用來存放該程序可能創(chuàng)建的各種窗口的消息。應(yīng)用程序中含有一段稱作“消息循環(huán)”的
24、代碼,用來從消息隊列中檢索這些消息并把它們分發(fā)到相應(yīng)的窗口函數(shù)中。在消息循環(huán)中沒有消息的話就排隊等待。沒有消息就創(chuàng)建空傳消息。</p><p> 2.2.2DirectDraw</p><p> DirectDraw是通過基于COM的接口提供服務(wù)。在DirectX 5.0版本中,這些接口分別是:IDirectDraw2、IDirectDrawSurface3、IDirectDrawPa
25、lette、IDirectDrawClipper和IDirectDrawVideoPort。DirectX的這些組件是向下兼容的,它們?nèi)匀恢С峙f版本中的所有功能。</p><p> DirectDraw是DirectX中的關(guān)于視頻輸入輸出的基本部分,使用DirectDraw可以方便地編制出高效的視頻處理程序,只要用戶的硬件支持DirectDraw,就能保證你的代碼可以處理它們。</p><p
26、> 與DirectX其它組件一樣,只要可能,DirectDraw就會最高程度的利用硬件執(zhí)行某特定功能,并且讓那些該硬件還不支持的特性也能用軟件仿真的方式加以實現(xiàn)。設(shè)備無關(guān)性通常是通過硬件抽象層(HAL:Hardware abstraction layer)實現(xiàn)的。</p><p> DirectDraw主要提供了完成以下任務(wù)的工具:</p><p> 管理多頁面 ,直接訪問視頻
27、RAM ,換頁(Page flipping) ,后臺緩存(Back buffering) ,管理調(diào)色板(Palette) ,裁剪(Clipping) ,視頻端口(Video port)。</p><p> 除此之外,DirectDraw允許開發(fā)者在應(yīng)用程序運行期測定顯示硬件的特性,然后,充分利用主機硬件設(shè)備的加速特性為用戶提供可能的最優(yōu)的顯示速度和效果。</p><p> Direct
28、Draw對象的創(chuàng)建和準(zhǔn)備的每一步驟:</p><p> 1. 創(chuàng)建DirectDraw 對象:創(chuàng)建DirectDraw 對象的一個實例,應(yīng)該用DirectDrawCreate API 函數(shù),也可以用COM中的CoCreateInstance函數(shù)。DirectDrawCreate用一個全局統(tǒng)一標(biāo)志符GUID(Globally Unique IDentifier)來表征顯示設(shè)備,在大多數(shù)情況下GUID為NULL(使
29、用系統(tǒng)的缺省顯示設(shè)備,既“空設(shè)備”);指針指向DirectDraw對象的地址;第三個參數(shù)總是NULL(供將來擴展使用)。下述代碼表明了如何創(chuàng)建一個DirectDraw對象,并且檢驗是否成功。</p><p> 2.設(shè)置顯示模式:設(shè)置DirectDraw 應(yīng)用程序的顯示模式需要兩步:首先調(diào)用IDirectDraw::SetCooperativeLevel方法來設(shè)定該模式下的要求,一旦確定了要求,再用IDirect
30、Draw::SetDisplayMode 方法來選擇顯示分辨率。在改變顯示分辨率之前,還必須通過IDirectDraw::SetCooperativeLevel方法來指定DDSCL_EXCLUSIVE和DDSCL_FULLSCREEN 標(biāo)志。這樣能使游戲程序完全控制顯示設(shè)備,其它的應(yīng)用程序不能同時共享顯示設(shè)備。DDSCL_FULLSCREEN標(biāo)志表示將程序設(shè)為全屏模式。使用IDirectDraw::SetCooperativeLevel
31、時,必須向窗口 (HWND)傳送一個句柄,讓窗口決定何時非正常地終止應(yīng)用程序。例如,若發(fā)生了GP錯誤或GDI被翻轉(zhuǎn)(flip)到了后臺緩沖區(qū),用戶就無法訪問當(dāng)前屏幕。為了避免這種情況,DirectDraw有一個后臺等待進程,它俘獲所有發(fā)往該窗口的消息,用這些消息來確定應(yīng)用程序何時終止。如果創(chuàng)建了新的窗口,必須確定該窗口為活動的,否則,就會有一系列的事件無</p><p> 3.改變顯示模式一旦選擇了應(yīng)用程序的工
32、作模式,就可以使用方法來改變顯示模式。</p><p> 4.創(chuàng)建可翻轉(zhuǎn)表面(Flippable Surface) :設(shè)定了顯示模式后,必須創(chuàng)建放置應(yīng)用程序的表面。</p><p> 5. 定義表面要求:創(chuàng)建可翻轉(zhuǎn)表面的的第一步是在DDSURFACEDESC結(jié)構(gòu)中定義表面的要求。</p><p> 6. 創(chuàng)建表面: 填完了DDSURFACEDESC結(jié)構(gòu),就可以
33、使用該結(jié)構(gòu)和lpDD了,lpDD是用DirectDrawCreate 方法創(chuàng)建的DirectDraw 對象的指針。</p><p> 7.取得后臺緩沖區(qū)的指針: 使用IDirectDrawSurface::GetAttachedSurface 方法可以取得后臺緩沖區(qū)的指針。</p><p> 8.著色表面: 創(chuàng)建了主表面和后臺緩沖區(qū)后,DDEX1使用標(biāo)準(zhǔn)的Windows GD
34、I 函數(shù)將一些文本提交到主表面和后臺緩沖區(qū)。一般來講,當(dāng)向表面寫數(shù)據(jù)時,該表面就是后臺緩沖區(qū),然后將緩沖區(qū)翻轉(zhuǎn)成主表面顯示出來。在DDEX1中,第一次翻轉(zhuǎn)表面之前有一個重要的延遲。于是DDEX1就將數(shù)據(jù)寫入主緩沖區(qū),避免開始顯示時有太長的時間間隔。后面將會講到,DDEX1只在 WM_TIMER期間向后臺寫數(shù)據(jù)。初始化函數(shù)或標(biāo)題頭可能會寫入主緩沖區(qū)。應(yīng)該注意的是,一旦使用IDirectDrawSurface::Unlock對表面解鎖,指向
35、表面的指針就變成無效,必須再次使用IDirectDrawSurface::Lock方法才能獲取該表面內(nèi)存的有效指針。</p><p> 9.寫表面及翻轉(zhuǎn)表面: 完成了初始化后,DDEX1開始處理消息循環(huán)。在消息循環(huán)的過程中,完成鎖定后臺緩沖區(qū)——寫入新的文本——解鎖后臺緩沖區(qū)——翻轉(zhuǎn)表面的過程。WM_TIMER包含了寫數(shù)據(jù)和翻轉(zhuǎn)表面的大部分代碼。 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 對象: 當(dāng)按了F12后,DDEX1程序在退出之
37、前先處理WM_DESTROY消息,該消息調(diào)用了finiObjects函數(shù),而finiObjects函數(shù)包含了所有的IUnknown Release的調(diào)用。</p><p> 11. 將位圖調(diào)入表面: 如DDEX1中一樣,doInit函數(shù)是DDEX2的初始化函數(shù),兩者的實質(zhì)一樣。</p><p> 12.設(shè)置調(diào)色板,將位圖調(diào)入后臺緩沖區(qū): 創(chuàng)建了調(diào)色板之后,可以通過調(diào)用IDirectDr
38、awSurface::SetPalette 方法將DirectDrawPalette 對象的指針ddpal傳送給主表面。</p><p> 13. 從屏外表面位塊傳輸: DDEX2同DDEX1基本相同。DDEX2打開一個位圖文件并將它送往后臺緩沖區(qū),然后翻轉(zhuǎn)后臺緩沖區(qū)和主表面。但這對顯示位圖并不特別理想,DDEX3擴展了DDEX2的功能,它加入了兩個屏外緩沖區(qū),每個緩沖區(qū)都存儲一個位圖。</p>
39、<p> 14. 將位圖文件調(diào)入屏外表面: 創(chuàng)建了兩個屏外表面后,DDEX3使用了InitSurfaces函數(shù)將位圖從Frntback.bmp文件裝入到兩個表面。InitSurfaces函數(shù)使用了DDCopyBitmap函數(shù)調(diào)入兩個位圖。</p><p> 15. 將屏外表面位位塊傳輸?shù)胶笈_緩沖區(qū):WM_TIMER包含了寫表面和翻轉(zhuǎn)表面的代碼。在DDEX3中,它選擇適當(dāng)?shù)钠镣獗砻?,并將其位塊傳輸?shù)胶?/p>
40、臺緩沖區(qū)。</p><p> 16. 創(chuàng)建動畫: 1、Color Key和位圖動畫在DDEX3例中描述了將位圖放入屏外緩沖區(qū)的一種主要方式。DDEX4則使用了將背景和一系列的精靈(sprite,本例中精靈是圓環(huán))裝入屏外表面的技術(shù),然后使用, IDirectDrawSurface::BltFast方法將屏外表面的各部分拷貝到后臺緩沖區(qū)。doInit函數(shù)除了具有前面例子中的功能外,還包括了為精靈設(shè)置Color k
41、ey的代碼。Color key是用于設(shè)置透明度的顏色值。當(dāng)使用硬件塊寫方式時,矩型區(qū)域內(nèi)除了設(shè)為 color key的像素,其它的像素都被塊寫,由此在表面上產(chǎn)生非矩型的精靈。</p><p> 17.動態(tài)改變調(diào)色板:DDEX5描述了任何在程序運行時動態(tài)地改變調(diào)色板,盡管在游戲中這并不總是用到。DirectDraw確實能很好地控制調(diào)色板。</p><p> 18. 替換調(diào)色板:DDEX5
42、中的updateFrame函數(shù)同DDEX4中的基本相同,先將背景塊寫入后臺緩沖區(qū),再將3個紅色圓環(huán)塊寫到前景。</p><p> 19. 使用覆蓋表面(Overlay): 創(chuàng)建一個主表面要使用覆蓋表面,必須先要初始化一個主表面,覆蓋表面將顯示在該主表面上。檢測硬件對覆蓋的支持 初始化DirectDraw后,需要檢測設(shè)備是否支持覆蓋表面。因為DirectDraw不能仿真覆蓋,所以如果硬件不支持覆蓋,就不能繼續(xù)下面
43、的工作。你可以用方法獲取硬件設(shè)備驅(qū)動程序的能力檢測覆蓋支持。在調(diào)用該方法之后,查看DDCAPS結(jié)構(gòu)中的dwFlags成員是否包含有DDCAPS_OVERLAY標(biāo)志。若有就表明支持覆蓋,否則就不支持。創(chuàng)建一個覆蓋表面如果知道顯示設(shè)備支持覆蓋表面,就可以創(chuàng)建一個。因為沒有指明設(shè)備怎樣支持覆蓋表面的標(biāo)準(zhǔn),所以不能夠期望創(chuàng)建任意大小的像素格式的表面。另外,也不要期望第一次創(chuàng)建覆蓋表面就會成功。因此,必須作好準(zhǔn)備進行多次創(chuàng)建的嘗試,直到有一個能夠
44、工作為止。Mosquito程序在創(chuàng)建表面時遵循“best case to worst case”的原則,首先嘗試創(chuàng)建一個三緩沖頁翻轉(zhuǎn)復(fù)雜覆蓋表面。如果嘗試失敗,程序就改變方法嘗試用其它通用的迅速格式來配置。顯示覆蓋表面創(chuàng)建了覆蓋表面之后就可以顯示它了。通常,硬件在用于顯示覆蓋</p><p><b> 3 詳細(xì)設(shè)計</b></p><p> 3.1 主要的函數(shù)和定
45、義說明</p><p> 3.1.1 WinMain函數(shù)</p><p> 主函數(shù)的入口。和我們以前的main()函數(shù)一樣。</p><p> 本次設(shè)計中的具體定義:</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消息當(dāng)用戶在window客戶區(qū)域點擊鼠標(biāo)左鍵的時候發(fā)送。如果當(dāng)前鼠標(biāo)沒有被捕捉,消息發(fā)送給鼠標(biāo)下面的window窗體。否則,消息發(fā)送給當(dāng)前捕捉鼠標(biāo)消息的方法。</p><p> 3.1.3 WindowFun函
47、數(shù)</p><p> 窗口構(gòu)造函數(shù),注冊函數(shù),自動調(diào)用,處理消息循環(huán)。</p><p> 本次設(shè)計中的具體定義: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對象,設(shè)置協(xié)作級別為窗口模式,創(chuàng)建主頁面,創(chuàng)建離屏頁面,創(chuàng)建老鼠頁面,創(chuàng)建木錘,創(chuàng)建火花,創(chuàng)建標(biāo)題,創(chuàng)建背景,創(chuàng)建時間,創(chuàng)建分?jǐn)?shù)頁面,創(chuàng)建Clipper裁剪器。</p><p> 本次設(shè)計中的具體定義:</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> //設(shè)置協(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)建標(biāo)題</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)建分?jǐn)?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è)計中的作用是數(shù)據(jù)初始化。實現(xiàn)老鼠洞位置數(shù)據(jù)的初始化,老鼠頭位置的初始化。</p><p> 本次設(shè)計中的具體定義:</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> 本次設(shè)計中主要功能是畫出所需要的圖片,包括背景,老鼠,木槌。</p><p> 本次設(shè)計中的具體定義:</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消息當(dāng)用戶在window客戶區(qū)域點擊鼠標(biāo)左鍵的時候發(fā)送。如果當(dāng)前鼠標(biāo)沒有被捕捉,消息發(fā)送給鼠標(biāo)下面的window窗體。否則,消息發(fā)送給當(dāng)前捕捉鼠標(biāo)消息的方法。</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> 作用是光標(biāo)消息。</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","關(guān)于這個游戲",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> 窗口消息當(dāng)光標(biāo)在窗口客戶區(qū)時,用戶釋放鼠標(biāo)左鍵時發(fā)出的消息。如果鼠標(biāo)沒有捕獲,這個消息被送到光標(biāo)下的窗口。否則,該消息發(fā)布到捕獲鼠標(biāo)的窗口。</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 是關(guān)閉程序的,關(guān)閉程序時彈出對話框。</p><p&g
97、t;<b> 程序如下:</b></p><p> case WM_DESTROY:</p><p> MessageBox(hwnd,"送給你的...:)\nFrom:\n "關(guān)于這個游戲",MB_OK);</p><p> PostQuitMessage(0);</p><p>
98、;<b> break;</b></p><p> 3.1.12 WM_MOUSEMOVE:</p><p> 作用是鼠標(biāo)移動對應(yīng)的坐標(biāo)。</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(//設(shè)計窗口</p><p> szClassName,<
105、/p><p><b> "打老鼠",</b></p><p> WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX|WS_POPUP,//窗口坐標(biāo)</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(窗口中設(shè)置時鐘,時鐘的編號,時鐘的速度,NUll)。</p><p> 單位是毫秒,表示1000毫秒的時鐘,滴答一下。設(shè)置時鐘的目的是有消息timer, 每滴答一下 ,響應(yīng)消息 ,執(zhí)行消息響應(yīng)。</p><p><b> 程序如下:</b></p><p> SetTimer(hwnd,1,200,NU
109、LL);</p><p> SetTimer(hwnd,2,1000,NULL);</p><p><b> 3 程序調(diào)試</b></p><p> 3.1 調(diào)試成果及講解</p><p> 3.1.1三種種類的老鼠</p><p><b> 圖3-1</b><
110、;/p><p> 如圖3-1 土黃老鼠是可愛的老鼠,是普通地鼠,分?jǐn)?shù)也普通。</p><p><b> 圖3-2</b></p><p> 如圖3-2 粉紅色老鼠頭上有個可愛的蝴蝶結(jié),不能隨便打,會倒扣分?jǐn)?shù)。</p><p><b> 圖3-3</b></p><p>
111、 如圖3-3 黑老鼠有兇惡的眼神,速度很快,打擊難度高,分?jǐn)?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> 游戲結(jié)束 出現(xiàn)如下對話框。點擊確定 ,再來一局。</p><p> 再玩一局破紀(jì)錄后出現(xiàn)如下對話框,記錄刷新。</p><p><b> 圖3-6</b></p><p> 打中的老鼠會頭金星,出現(xiàn)如下
113、星星:</p><p><b> 5 心得體會</b></p><p> 在學(xué)習(xí)C++以前,我認(rèn)為C++只是在C語言的基礎(chǔ)上的一種延伸,認(rèn)為只要學(xué)過C語言,就可以用C語言的那種設(shè)計思想來學(xué)習(xí)C++、設(shè)計C++程序。正是由于抱了這種錯誤的思想,使我在一開始學(xué)習(xí)C++的時候遇到了很大的困難,我沒有辦法體會面向?qū)ο蟮脑O(shè)計思想,我在學(xué)習(xí)這門課的時候老是想著實現(xiàn)這個函數(shù)功能
114、的具體過程,而沒太注意對象分類的重要性。</p><p> 隨著課程學(xué)習(xí)的深入,我感覺到了利用類和對象、繼承、封裝等一系列知識可以把我們程序中很多繁雜、重復(fù)的部分省略掉,還可以解決一些利用面向過程的設(shè)計思想無法解決的問題,我自己也試著編寫一些小的C++程序,當(dāng)然在這個過程中遇到了很多困難,其中調(diào)試帶來的困難讓我無法忘記,在調(diào)試程序的同時,我也總結(jié)出來了一些調(diào)試的小技巧,讓我在C語言課程設(shè)計中也受用匪淺。雖然現(xiàn)在
115、仍然會有一些問題不能解決比如插入透明圖片的問題。但是在今后的學(xué)習(xí)和努力中會發(fā)現(xiàn)更多的東西,更加的進步。</p><p> 在學(xué)習(xí)這門課的過程中,我感受到了自己親自動手編程序、調(diào)程序的重要性,我們要熟悉C++的語法、體會調(diào)試的思想,最好的一個手段就是自己動手編程、調(diào)試,這會比我們一味的看書效果好得多。</p><p> 另外,我還感覺到一個好的程序編出來需要很多人的團結(jié)合作。我在檢查自己
116、編寫的程序是否有BUG未被找出的時候,我會讓我的同學(xué)作為一個程序使用者來找出未發(fā)現(xiàn)的BUG并提出改進意見,這讓我們的工作更加高效。</p><p> 很高興能夠了解到C++的神奇魅力和面向?qū)ο蟪绦蛟O(shè)計的獨特思想,它為我今后的程序設(shè)計奠定了基礎(chǔ)。感謝老師對我們的悉心教授!參考文獻</p><p> [1] 譚浩強,《C程序設(shè)計》,清華大學(xué)出版社</p><p>
117、 [2] 劉振安,孫忱,劉燕君,《C程序設(shè)計課程設(shè)計》,機械工業(yè)出版社</p><p> [3] 汪詩林,《數(shù)據(jù)結(jié)構(gòu)算法與應(yīng)用》,機械工業(yè)出版社</p><p> [4] 陳錦昌,趙明秀.C語言計算機繪圖教程.華南理工大學(xué)出版社.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> //關(guān)于游戲的全局變量</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)東東的紀(jì)錄</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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 打地鼠vb課程設(shè)計
- 虛擬儀器打地鼠課程設(shè)計
- 單片機課程設(shè)計--打地鼠
- 基于plc的打地鼠游戲課程設(shè)計
- 嵌入式課程設(shè)計報告--基于arm平臺的打地鼠游戲
- 打地鼠游戲
- 打磚塊游戲課程設(shè)計報告
- 打地鼠程序設(shè)計.docx
- 中班體育游戲《打地鼠》
- 打地鼠游戲-項目總結(jié).docx
- 實例六打地鼠主體部分
- 打老鼠-300字優(yōu)秀作文
- 打老鼠-600字優(yōu)秀作文
- 從“打地鼠”到“22條軍規(guī)”
- java打地鼠游戲畢業(yè)論文
- 打地鼠游戲-功能點描述.xlsx
- 打地鼠游戲-功能點描述.xlsx
- java打地鼠游戲畢業(yè)論文
- 基于51單片機的打地鼠游戲設(shè)計
- 中一班戶外游戲《打地鼠》
評論
0/150
提交評論