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

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論