2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  程序設(shè)計(jì)實(shí)踐報(bào)告</b></p><p><b>  </b></p><p>  學(xué) 院 信息工程 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù)</p><p><b>  目 錄</b></p><p><b>  1 引言

2、1</b></p><p>  1.1課程設(shè)計(jì)目的1</p><p>  1.2開發(fā)工具的介紹1</p><p><b>  2 概要設(shè)計(jì)2</b></p><p>  2.1 系統(tǒng)總體分析2</p><p>  2.2 主模塊涉及的基本概念及說明2</p>

3、<p><b>  3 詳細(xì)設(shè)計(jì)7</b></p><p>  3.1 主要的函數(shù)和定義說明7</p><p>  3.1 調(diào)試成果及講解16</p><p><b>  5 心得體會(huì)20</b></p><p><b>  參考文獻(xiàn)21</b></p

4、><p>  附錄…………………………………………………………………………………………………………22</p><p><b>  打地鼠游戲程序設(shè)計(jì)</b></p><p><b>  1 引言</b></p><p>  本程序設(shè)計(jì)實(shí)踐是采用C++語言,在VC平臺下設(shè)計(jì)。本課程設(shè)計(jì)提供了獨(dú)立實(shí)踐的機(jī)

5、會(huì),將課本上的理論知識和實(shí)際有機(jī)的結(jié)合起來,充分的鍛煉分析解決實(shí)際問題的能力。提高了適應(yīng)實(shí)際,實(shí)踐編程的能力。</p><p><b>  1.1課程設(shè)計(jì)目的</b></p><p>  程序設(shè)計(jì)實(shí)踐主要是培養(yǎng)學(xué)生利用系統(tǒng)綜合C++語言進(jìn)行程序設(shè)計(jì)的能力。</p><p> ?。?)進(jìn)一步鞏固和復(fù)習(xí)C++程序設(shè)計(jì)的基礎(chǔ)知識。</p>

6、<p> ?。?)培養(yǎng)結(jié)構(gòu)化程序、模塊化程序設(shè)計(jì)的方法和能力。</p><p>  (3)了解軟件的編制過程及各環(huán)節(jié)的具體內(nèi)容。</p><p> ?。?)提高程序調(diào)試技巧、軟件設(shè)計(jì)能力和代碼規(guī)范化等素質(zhì)。</p><p> ?。?)提高分析問題、解決問題以及實(shí)際運(yùn)用能力。 </p><p><b> ?。?)功能要求

7、:</b></p><p>  基本要求:設(shè)計(jì)的系統(tǒng)界面要美觀大方,操作合理,有必要的提示。</p><p>  創(chuàng)新要求:在基本要求達(dá)到后,進(jìn)行創(chuàng)新設(shè)計(jì)。對系統(tǒng)進(jìn)行功能模塊分析、控制流程分析正確。系統(tǒng)設(shè)計(jì)要實(shí)用,編程簡練,可用,功能全面,并有一定的容錯(cuò)能力。說明書、流程圖要清楚。要求程序設(shè)計(jì)合理,用戶界面良好,如采用菜單工作方式。</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)建項(xiàng)目文件。Visual C++6

9、.0不僅包括編譯器,而且它還包括許多有用組件,通過這些組件的協(xié)同工作,可以在Visual C++6.0集成環(huán)境中輕松地完成創(chuàng)建源文件,編輯資源,以及對程序的編譯,連接和調(diào)試等各項(xiàng)工作。</p><p>  VC++6.0是Windows 95/98、XP或Windows NT下的一個(gè)應(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、有一個(gè)VC的自動(dòng)安裝程序,也可以執(zhí)行VC6目錄下的setup.exe,在安裝包的提示下進(jìn)行,對初學(xué)者可采用“典型安裝”方式。</p><p>  在安裝好VC 6.0系統(tǒng)后,有時(shí)根據(jù)需要添加或刪除某些部件,可插入CD盤重新執(zhí)行setup.exe安裝程序,安裝程序會(huì)檢測當(dāng)前系統(tǒng)安裝VC6的足件,用戶單擊“添加/刪除”按鈕后,在“安裝維護(hù)”對話框中選定要添加的部件或撤消選定要?jiǎng)h除的部件。</p><

12、;p>  與一般的應(yīng)用軟件一樣,有以下兩種啟動(dòng)方式:</p><p>  (1)通過“開始”按鈕,選擇“程序”菜單,然后打開“Microsoft Visual studio 6.0中文版”子菜單中的“Microsoft Visual C++ 6.0 中文版”程序。</p><p>  (2)用戶也可以使用命令行啟動(dòng)VC。單擊“開始”按鈕后選擇“運(yùn)行”命令,在“運(yùn)行”對話框中輸入c:\

13、Program Files\Microsoft Visual Studio\VC98\VC6.exe(按默認(rèn)盤符和路徑安裝)即可。</p><p>  1.3功能說明:打地鼠是一種非常有趣的益智游戲。游戲進(jìn)行時(shí),地鼠會(huì)不斷從洞口探出頭來再縮回去,地鼠頭在洞外時(shí),可以通過案件的方式打擊地鼠,時(shí)間到時(shí)游戲結(jié)束,打中地鼠次數(shù)越多分?jǐn)?shù)越高,打中紅色地鼠會(huì)減分,灰色地鼠分?jǐn)?shù)比棕色地鼠分?jǐn)?shù)低。打破記錄可以刷新成績。點(diǎn)擊鼠標(biāo)左

14、鍵可以打擊地鼠。</p><p><b>  2 概要設(shè)計(jì)</b></p><p>  2.1 系統(tǒng)總體分析</p><p>  開發(fā)環(huán)境:Microsoft WindowsXP TASM</p><p>  2.2 主模塊涉及的基本概念及說明</p><p>  2.2.1Message 消息機(jī)

15、制</p><p>  在Windows中發(fā)生的一切都可以用消息來表示,消息用于告訴操作系統(tǒng)發(fā)生了什么,所有的Windows應(yīng)用程序都是消息驅(qū)動(dòng)的。 一個(gè)消息是由消息的名稱(UINT)和兩個(gè)參數(shù)(WPARAM, LPARAM)組成。消息的參數(shù)中包含有重要的信息。主要包括程序核心,輸入焦點(diǎn),消息分類,消息隊(duì)列,消息循環(huán),消息分類。一個(gè)消息由一個(gè)消息名稱(UINT),和兩個(gè)參數(shù)(WPARAM,LPARAM)組成。&l

16、t;/p><p>  本設(shè)計(jì)中主要用Msg 來調(diào)用Messagebox里的消息。從而來實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊實(shí)現(xiàn)功能的操作。例如對鼠標(biāo)消息而言,LPARAM中一般包含鼠標(biāo)的位置信息。Msg變量是型態(tài)為MSG的結(jié)構(gòu)。當(dāng)鼠標(biāo)在某個(gè)窗口內(nèi)移動(dòng)時(shí),Windows會(huì)不斷地發(fā)出鼠標(biāo)移動(dòng)消息WM_MOUSEMOVE,并把鼠標(biāo)的最新位置傳給該窗口。如果在窗口的范圍內(nèi)按下鼠標(biāo)左鍵,系統(tǒng)就會(huì)發(fā)出“按下左鍵”的WM_LBUTTONDOWN消息給該窗

17、口,等到用戶放開按鍵后,再發(fā)出“放開左鍵”的WM_LBUTTONUP消息給該窗口。消息可以看做是一個(gè)動(dòng)作。操作系統(tǒng)把消息給封裝成結(jié)構(gòu)。</p><p>  本設(shè)計(jì)中主要用WindowFunc函數(shù)來調(diào)用消息循環(huán)。Windows為當(dāng)前執(zhí)行的每個(gè)Windows程序維護(hù)一個(gè)消息隊(duì)列。在發(fā)生輸入事件之后,Windows將事件轉(zhuǎn)換為一個(gè)消息并將消息放入程序的消息隊(duì)列中。程序通過執(zhí)行一塊稱之為消息循環(huán)的程序代碼從消息隊(duì)列中取出

18、消息。本程序中在時(shí)鐘運(yùn)行里運(yùn)用到了消息循環(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);//時(shí)鐘停止</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>  在程序的時(shí)鐘里也運(yùn)用到了消息隊(duì)列的思想。消息隊(duì)列就是Windows中有一個(gè)系統(tǒng)消息隊(duì)列,對于每一個(gè)正在執(zhí)行的Windows應(yīng)用程序,系統(tǒng)為其建立一個(gè)“消息隊(duì)列”,即應(yīng)用程序隊(duì)列,用來存放該程序可能創(chuàng)建的各種窗口的消息。應(yīng)用程序中含有一段稱作“消息循環(huán)”的

24、代碼,用來從消息隊(duì)列中檢索這些消息并把它們分發(fā)到相應(yīng)的窗口函數(shù)中。在消息循環(huán)中沒有消息的話就排隊(duì)等待。沒有消息就創(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就會(huì)最高程度的利用硬件執(zhí)行某特定功能,并且讓那些該硬件還不支持的特性也能用軟件仿真的方式加以實(shí)現(xiàn)。設(shè)備無關(guān)性通常是通過硬件抽象層(HAL:Hardware abstraction layer)實(shí)現(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)用程序運(yùn)行期測定顯示硬件的特性,然后,充分利用主機(jī)硬件設(shè)備的加速特性為用戶提供可能的最優(yōu)的顯示速度和效果。</p><p>  Direct

28、Draw對象的創(chuàng)建和準(zhǔn)備的每一步驟:</p><p>  1. 創(chuàng)建DirectDraw 對象:創(chuàng)建DirectDraw 對象的一個(gè)實(shí)例,應(yīng)該用DirectDrawCreate API 函數(shù),也可以用COM中的CoCreateInstance函數(shù)。DirectDrawCreate用一個(gè)全局統(tǒng)一標(biāo)志符GUID(Globally Unique IDentifier)來表征顯示設(shè)備,在大多數(shù)情況下GUID為NULL(使

29、用系統(tǒng)的缺省顯示設(shè)備,既“空設(shè)備”);指針指向DirectDraw對象的地址;第三個(gè)參數(shù)總是NULL(供將來擴(kuò)展使用)。下述代碼表明了如何創(chuàng)建一個(gè)DirectDraw對象,并且檢驗(yàn)是否成功。</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í)共享顯示設(shè)備。DDSCL_FULLSCREEN標(biāo)志表示將程序設(shè)為全屏模式。使用IDirectDraw::SetCooperativeLevel

31、時(shí),必須向窗口 (HWND)傳送一個(gè)句柄,讓窗口決定何時(shí)非正常地終止應(yīng)用程序。例如,若發(fā)生了GP錯(cuò)誤或GDI被翻轉(zhuǎn)(flip)到了后臺緩沖區(qū),用戶就無法訪問當(dāng)前屏幕。為了避免這種情況,DirectDraw有一個(gè)后臺等待進(jìn)程,它俘獲所有發(fā)往該窗口的消息,用這些消息來確定應(yīng)用程序何時(shí)終止。如果創(chuàng)建了新的窗口,必須確定該窗口為活動(dòng)的,否則,就會(huì)有一系列的事件無</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ù)時(shí),該表面就是后臺緩沖區(qū),然后將緩沖區(qū)翻轉(zhuǎn)成主表面顯示出來。在DDEX1中,第一次翻轉(zhuǎn)表面之前有一個(gè)重要的延遲。于是DDEX1就將數(shù)據(jù)寫入主緩沖區(qū),避免開始顯示時(shí)有太長的時(shí)間間隔。后面將會(huì)講到,DDEX1只在 WM_TIMER期間向后臺寫數(shù)據(jù)。初始化函數(shù)或標(biāo)題頭可能會(huì)寫入主緩沖區(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ù),兩者的實(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打開一個(gè)位圖文件并將它送往后臺緩沖區(qū),然后翻轉(zhuǎn)后臺緩沖區(qū)和主表面。但這對顯示位圖并不特別理想,DDEX3擴(kuò)展了DDEX2的功能,它加入了兩個(gè)屏外緩沖區(qū),每個(gè)緩沖區(qū)都存儲一個(gè)位圖。</p>

39、<p>  14. 將位圖文件調(diào)入屏外表面: 創(chuàng)建了兩個(gè)屏外表面后,DDEX3使用了InitSurfaces函數(shù)將位圖從Frntback.bmp文件裝入到兩個(gè)表面。InitSurfaces函數(shù)使用了DDCopyBitmap函數(shù)調(diào)入兩個(gè)位圖。</p><p>  15. 將屏外表面位位塊傳輸?shù)胶笈_緩沖區(qū):WM_TIMER包含了寫表面和翻轉(zhuǎn)表面的代碼。在DDEX3中,它選擇適當(dāng)?shù)钠镣獗砻?,并將其位塊傳輸?shù)胶?/p>

40、臺緩沖區(qū)。</p><p>  16. 創(chuàng)建動(dòng)畫: 1、Color Key和位圖動(dòng)畫在DDEX3例中描述了將位圖放入屏外緩沖區(qū)的一種主要方式。DDEX4則使用了將背景和一系列的精靈(sprite,本例中精靈是圓環(huán))裝入屏外表面的技術(shù),然后使用, IDirectDrawSurface::BltFast方法將屏外表面的各部分拷貝到后臺緩沖區(qū)。doInit函數(shù)除了具有前面例子中的功能外,還包括了為精靈設(shè)置Color k

41、ey的代碼。Color key是用于設(shè)置透明度的顏色值。當(dāng)使用硬件塊寫方式時(shí),矩型區(qū)域內(nèi)除了設(shè)為 color key的像素,其它的像素都被塊寫,由此在表面上產(chǎn)生非矩型的精靈。</p><p>  17.動(dòng)態(tài)改變調(diào)色板:DDEX5描述了任何在程序運(yùn)行時(shí)動(dòng)態(tài)地改變調(diào)色板,盡管在游戲中這并不總是用到。DirectDraw確實(shí)能很好地控制調(diào)色板。</p><p>  18. 替換調(diào)色板:DDEX5

42、中的updateFrame函數(shù)同DDEX4中的基本相同,先將背景塊寫入后臺緩沖區(qū),再將3個(gè)紅色圓環(huán)塊寫到前景。</p><p>  19. 使用覆蓋表面(Overlay): 創(chuàng)建一個(gè)主表面要使用覆蓋表面,必須先要初始化一個(gè)主表面,覆蓋表面將顯示在該主表面上。檢測硬件對覆蓋的支持 初始化DirectDraw后,需要檢測設(shè)備是否支持覆蓋表面。因?yàn)镈irectDraw不能仿真覆蓋,所以如果硬件不支持覆蓋,就不能繼續(xù)下面

43、的工作。你可以用方法獲取硬件設(shè)備驅(qū)動(dòng)程序的能力檢測覆蓋支持。在調(diào)用該方法之后,查看DDCAPS結(jié)構(gòu)中的dwFlags成員是否包含有DDCAPS_OVERLAY標(biāo)志。若有就表明支持覆蓋,否則就不支持。創(chuàng)建一個(gè)覆蓋表面如果知道顯示設(shè)備支持覆蓋表面,就可以創(chuàng)建一個(gè)。因?yàn)闆]有指明設(shè)備怎樣支持覆蓋表面的標(biāo)準(zhǔn),所以不能夠期望創(chuàng)建任意大小的像素格式的表面。另外,也不要期望第一次創(chuàng)建覆蓋表面就會(huì)成功。因此,必須作好準(zhǔn)備進(jìn)行多次創(chuàng)建的嘗試,直到有一個(gè)能夠

44、工作為止。Mosquito程序在創(chuàng)建表面時(shí)遵循“best case to worst case”的原則,首先嘗試創(chuàng)建一個(gè)三緩沖頁翻轉(zhuǎn)復(fù)雜覆蓋表面。如果嘗試失敗,程序就改變方法嘗試用其它通用的迅速格式來配置。顯示覆蓋表面創(chuàng)建了覆蓋表面之后就可以顯示它了。通常,硬件在用于顯示覆蓋</p><p><b>  3 詳細(xì)設(shè)計(jì)</b></p><p>  3.1 主要的函數(shù)和定

45、義說明</p><p>  3.1.1 WinMain函數(shù)</p><p>  主函數(shù)的入口。和我們以前的main()函數(shù)一樣。</p><p>  本次設(shè)計(jì)中的具體定義:</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ū)域點(diǎn)擊鼠標(biāo)左鍵的時(shí)候發(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ù),自動(dòng)調(diào)用,處理消息循環(huán)。</p><p>  本次設(shè)計(jì)中的具體定義:LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)。</p><p>  3.1.4 InitDDraw()函數(shù)</p>&l

48、t;p>  運(yùn)用了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)建時(shí)間,創(chuàng)建分?jǐn)?shù)頁面,創(chuàng)建Clipper裁剪器。</p><p>  本次設(shè)計(jì)中的具體定義:</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)建時(shí)間</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è)計(jì)中的作用是數(shù)據(jù)初始化。實(shí)現(xiàn)老鼠洞位置數(shù)據(jù)的初始化,老鼠頭位置的初始化。</p><p>  本次設(shè)計(jì)中的具體定義:</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è)計(jì)中主要功能是畫出所需要的圖片,包括背景,老鼠,木槌。</p><p>  本次設(shè)計(jì)中的具體定義:</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ū)域點(diǎn)擊鼠標(biāo)左鍵的時(shí)候發(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)于這個(gè)游戲",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ū)時(shí),用戶釋放鼠標(biāo)左鍵時(shí)發(fā)出的消息。如果鼠標(biāo)沒有捕獲,這個(gè)消息被送到光標(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)閉程序時(shí)彈出對話框。</p><p&g

97、t;<b>  程序如下:</b></p><p>  case WM_DESTROY:</p><p>  MessageBox(hwnd,"送給你的...:)\nFrom:\n "關(guān)于這個(gè)游戲",MB_OK);</p><p>  PostQuitMessage(0);</p><p>

98、;<b>  break;</b></p><p>  3.1.12 WM_MOUSEMOVE:</p><p>  作用是鼠標(biāo)移動(dòng)對應(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++中定時(shí)器 告訴windows一個(gè)時(shí)間間隔,然后windows以此時(shí)間間隔周期性

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è)計(jì)窗口</p><p>  szClassName,<

105、/p><p><b>  "打老鼠",</b></p><p>  WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX|WS_POPUP,//窗口坐標(biāo)</p><p>  180,//窗口的位置程序框頂點(diǎn)到顯示框頂點(diǎn)之間是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è)置時(shí)鐘,時(shí)鐘的編號,時(shí)鐘的速度,NUll)。</p><p>  單位是毫秒,表示1000毫秒的時(shí)鐘,滴答一下。設(shè)置時(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 粉紅色老鼠頭上有個(gè)可愛的蝴蝶結(jié),不能隨便打,會(huì)倒扣分?jǐn)?shù)。</p><p><b>  圖3-3</b></p><p>

111、  如圖3-3 黑老鼠有兇惡的眼神,速度很快,打擊難度高,分?jǐn)?shù)也高。</p><p><b>  3.2運(yùn)行效果</b></p><p><b>  初始:</b></p><p><b>  圖3-4</b></p><p>  點(diǎn)擊左鍵跳出如下對話框,點(diǎn)擊確定,進(jìn)入游戲。

112、</p><p><b>  圖3-5</b></p><p>  游戲結(jié)束 出現(xiàn)如下對話框。點(diǎn)擊確定 ,再來一局。</p><p>  再玩一局破紀(jì)錄后出現(xiàn)如下對話框,記錄刷新。</p><p><b>  圖3-6</b></p><p>  打中的老鼠會(huì)頭金星,出現(xiàn)如下

113、星星:</p><p><b>  5 心得體會(huì)</b></p><p>  在學(xué)習(xí)C++以前,我認(rèn)為C++只是在C語言的基礎(chǔ)上的一種延伸,認(rèn)為只要學(xué)過C語言,就可以用C語言的那種設(shè)計(jì)思想來學(xué)習(xí)C++、設(shè)計(jì)C++程序。正是由于抱了這種錯(cuò)誤的思想,使我在一開始學(xué)習(xí)C++的時(shí)候遇到了很大的困難,我沒有辦法體會(huì)面向?qū)ο蟮脑O(shè)計(jì)思想,我在學(xué)習(xí)這門課的時(shí)候老是想著實(shí)現(xiàn)這個(gè)函數(shù)功能

114、的具體過程,而沒太注意對象分類的重要性。</p><p>  隨著課程學(xué)習(xí)的深入,我感覺到了利用類和對象、繼承、封裝等一系列知識可以把我們程序中很多繁雜、重復(fù)的部分省略掉,還可以解決一些利用面向過程的設(shè)計(jì)思想無法解決的問題,我自己也試著編寫一些小的C++程序,當(dāng)然在這個(gè)過程中遇到了很多困難,其中調(diào)試帶來的困難讓我無法忘記,在調(diào)試程序的同時(shí),我也總結(jié)出來了一些調(diào)試的小技巧,讓我在C語言課程設(shè)計(jì)中也受用匪淺。雖然現(xiàn)在

115、仍然會(huì)有一些問題不能解決比如插入透明圖片的問題。但是在今后的學(xué)習(xí)和努力中會(huì)發(fā)現(xiàn)更多的東西,更加的進(jìn)步。</p><p>  在學(xué)習(xí)這門課的過程中,我感受到了自己親自動(dòng)手編程序、調(diào)程序的重要性,我們要熟悉C++的語法、體會(huì)調(diào)試的思想,最好的一個(gè)手段就是自己動(dòng)手編程、調(diào)試,這會(huì)比我們一味的看書效果好得多。</p><p>  另外,我還感覺到一個(gè)好的程序編出來需要很多人的團(tuán)結(jié)合作。我在檢查自己

116、編寫的程序是否有BUG未被找出的時(shí)候,我會(huì)讓我的同學(xué)作為一個(gè)程序使用者來找出未發(fā)現(xiàn)的BUG并提出改進(jìn)意見,這讓我們的工作更加高效。</p><p>  很高興能夠了解到C++的神奇魅力和面向?qū)ο蟪绦蛟O(shè)計(jì)的獨(dú)特思想,它為我今后的程序設(shè)計(jì)奠定了基礎(chǔ)。感謝老師對我們的悉心教授!參考文獻(xiàn)</p><p>  [1] 譚浩強(qiáng),《C程序設(shè)計(jì)》,清華大學(xué)出版社</p><p> 

117、 [2] 劉振安,孫忱,劉燕君,《C程序設(shè)計(jì)課程設(shè)計(jì)》,機(jī)械工業(yè)出版社</p><p>  [3] 汪詩林,《數(shù)據(jù)結(jié)構(gòu)算法與應(yīng)用》,機(jī)械工業(yè)出版社</p><p>  [4] 陳錦昌,趙明秀.C語言計(jì)算機(jī)繪圖教程.華南理工大學(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;//延時(shí)</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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論