鹽城工學院打地鼠課程設計報告木槌打老鼠_第1頁
鹽城工學院打地鼠課程設計報告木槌打老鼠_第2頁
鹽城工學院打地鼠課程設計報告木槌打老鼠_第3頁
鹽城工學院打地鼠課程設計報告木槌打老鼠_第4頁
鹽城工學院打地鼠課程設計報告木槌打老鼠_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、鹽城工學院鹽城工學院程序設計實踐報告程序設計實踐報告 學學 院院 信息工程 專專 業(yè)業(yè) 計算機科學與技術計算機科學與技術班班 級級 z111 學學 號號 1160704108 學生姓名學生姓名 課程成績課程成績 完成日期完成日期 2014-1-16目目 錄錄c+程序設計課程設計(2014)ii1 引言.11.1 課程設計目的.11.2 開發(fā)工具的介紹.12 概要設計.22.1 系統(tǒng)總體分析.22.2 主模塊涉及的基本概念及說明.23 詳細設計.73.1 主要的函數(shù)和定義說明 .73.1 調試成果及講解 .165 心得體會.20參考文獻.21附錄22c+程序設計課程設計(2014)1打地鼠游戲程

2、序設計打地鼠游戲程序設計1 1 引言引言本程序設計實踐是采用 c+語言,在 vc 平臺下設計。本課程設計提供了獨立實踐的機會,將課本上的理論知識和實際有機的結合起來,充分的鍛煉分析解決實際問題的能力。提高了適應實際,實踐編程的能力。1.1 課程設計目的程序設計實踐主要是培養(yǎng)學生利用系統(tǒng)綜合 c+語言進行程序設計的能力。(1)進一步鞏固和復習 c+程序設計的基礎知識。(2)培養(yǎng)結構化程序、模塊化程序設計的方法和能力。(3)了解軟件的編制過程及各環(huán)節(jié)的具體內容。(4)提高程序調試技巧、軟件設計能力和代碼規(guī)范化等素質。(5)提高分析問題、解決問題以及實際運用能力。 (6)功能要求:基本要求:設計的系

3、統(tǒng)界面要美觀大方,操作合理,有必要的提示。創(chuàng)新要求:在基本要求達到后,進行創(chuàng)新設計。對系統(tǒng)進行功能模塊分析、控制流程分析正確。系統(tǒng)設計要實用,編程簡練,可用,功能全面,并有一定的容錯能力。說明書、流程圖要清楚。要求程序設計合理,用戶界面良好,如采用菜單工作方式。1.2 開發(fā)工具的介紹關于關于 visualvisual c+c+visual c+6.0 是 microsoft 公司在 1998 年推出的基于 windows 9x 和 windows nt 的優(yōu)秀集成開發(fā)環(huán)境。該環(huán)境為用戶提供了良好的可視化編程環(huán)境,程序員可以里利用該開發(fā)環(huán)境輕松地訪問 c+源代碼編輯器,資源編輯器和使用內部調試器

4、,并且可以創(chuàng)建項目文件。visual c+6.0 不僅包括編譯器,而且它還包括許多有用組件,通過這些組件的協(xié)同工作,可以在 visual c+6.0 集成環(huán)境中輕松地完成創(chuàng)建源文件,編輯資源,以及對程序的編譯,連接和調試等各項工作。vc+6.0 是 windows 95/98、xp 或 windows nt 下的一個應用程序,本身對軟硬件沒有特殊要求。就是說它對環(huán)境的要求與 windows 95/98、windows nt 要求是一致的。硬件要求:一般在 586 以上的處理器、16mb 以上內存、100mb 以上的硬盤。軟件要求:windows 95/98 或 windows nt3.51 以

5、上版本。vc+ 6.0 系統(tǒng)可以在一張 cd 盤上,也可以在“visual studio( visual c+、visual c+程序設計課程設計(2014)2foxpro)”等產品的第一張 cd 盤上。一般都有一個 vc 的自動安裝程序,也可以執(zhí)行 vc6 目錄下的 setup.exe,在安裝包的提示下進行,對初學者可采用“典型安裝”方式。在安裝好 vc 6.0 系統(tǒng)后,有時根據(jù)需要添加或刪除某些部件,可插入 cd 盤重新執(zhí)行setup.exe 安裝程序,安裝程序會檢測當前系統(tǒng)安裝 vc6 的足件,用戶單擊“添加刪除”按鈕后,在“安裝維護”對話框中選定要添加的部件或撤消選定要刪除的部件。與一

6、般的應用軟件一樣,有以下兩種啟動方式:(1)通過“開始”按鈕,選擇“程序”菜單,然后打開“microsoft visual studio 6.0 中文版”子菜單中的“microsoft visual c+ 6.0 中文版”程序。(2)用戶也可以使用命令行啟動 vc。單擊“開始”按鈕后選擇“運行”命令,在“運行”對話框中輸入 c:program filesmicrosoft visual studiovc98vc6.exe(按默認盤符和路徑安裝)即可。1.3 功能說明:打地鼠是一種非常有趣的益智游戲。游戲進行時,地鼠會不斷從洞口探出頭來再縮回去,地鼠頭在洞外時,可以通過案件的方式打擊地鼠,時間到

7、時游戲結束,打中地鼠次數(shù)越多分數(shù)越高,打中紅色地鼠會減分,灰色地鼠分數(shù)比棕色地鼠分數(shù)低。打破記錄可以刷新成績。點擊鼠標左鍵可以打擊地鼠。2 2 概要設計概要設計2.1 系統(tǒng)總體分析開發(fā)環(huán)境:microsoft windowsxp tasm2.2 主模塊涉及的基本概念及說明2.2.1message 消息機制在 windows 中發(fā)生的一切都可以用消息來表示,消息用于告訴操作系統(tǒng)發(fā)生了什么,所有的 windows 應用程序都是消息驅動的。 一個消息是由消息的名稱(uint)和兩個參數(shù)(wparam, lparam)組成。消息的參數(shù)中包含有重要的信息。主要包括程序核心,輸入焦點,消息分類,消息隊列,

8、消息循環(huán),消息分類。一個消息由一個消息名稱(uint) ,和兩個參數(shù)(wparam,lparam)組成。本設計中主要用 msg 來調用 messagebox 里的消息。從而來實現(xiàn)鼠標點擊實現(xiàn)功能的操作。例如對鼠標消息而言,lparam 中一般包含鼠標的位置信息。msg 變量是型態(tài)為 msg的結構。當鼠標在某個窗口內移動時,windows 會不斷地發(fā)出鼠標移動消息wm_mousemove,并把鼠標的最新位置傳給該窗口。如果在窗口的范圍內按下鼠標左鍵,系統(tǒng)就會發(fā)出“按下左鍵”的 wm_lbuttondown 消息給該窗口,等到用戶放開按鍵后,再發(fā)出“放開左鍵”的 wm_lbuttonup 消息給該

9、窗口。消息可以看做是一個動作。操作系統(tǒng)把消息c+程序設計課程設計(2014)3給封裝成結構。本設計中主要用 windowfunc 函數(shù)來調用消息循環(huán)。windows 為當前執(zhí)行的每個windows 程序維護一個消息隊列。在發(fā)生輸入事件之后,windows 將事件轉換為一個消息并將消息放入程序的消息隊列中。程序通過執(zhí)行一塊稱之為消息循環(huán)的程序代碼從消息隊列中取出消息。本程序中在時鐘運行里運用到了消息循環(huán)。例while(1)if( peekmessage(&msg,null,0,0,pm_noremove)/消息循環(huán)if (!getmessage(&msg,null,0,0)/接收消息return

10、 msg.wparam;translatemessage(&msg);/翻譯消息dispatchmessage(&msg);/處理消息else if( bactive)updateframe();elsewaitmessage();killtimer(hwnd,1);/時鐘停止return msg.wparam;消息循環(huán)的過程如圖 11 所示:圖 1-1 在程序的時鐘里也運用到了消息隊列的思想。消息隊列就是 windows 中有一個系統(tǒng)消息隊列,對于每一個正在執(zhí)行的 windows 應用程序,系統(tǒng)為其建立一個“消息隊列” ,即c+程序設計課程設計(2014)4應用程序隊列,用來存放該程序可能創(chuàng)

11、建的各種窗口的消息。應用程序中含有一段稱作“消息循環(huán)”的代碼,用來從消息隊列中檢索這些消息并把它們分發(fā)到相應的窗口函數(shù)中。在消息循環(huán)中沒有消息的話就排隊等待。沒有消息就創(chuàng)建空傳消息。2.2.2directdrawdirectdraw 是通過基于 com 的接口提供服務。在 directx 5.0 版本中,這些接口分別是:idirectdraw2、idirectdrawsurface3、idirectdrawpalette、idirectdrawclipper和 idirectdrawvideoport。directx 的這些組件是向下兼容的,它們仍然支持舊版本中的所有功能。 directdra

12、w 是 directx 中的關于視頻輸入輸出的基本部分,使用 directdraw 可以方便地編制出高效的視頻處理程序,只要用戶的硬件支持 directdraw,就能保證你的代碼可以處理它們。與 directx 其它組件一樣,只要可能,directdraw 就會最高程度的利用硬件執(zhí)行某特定功能,并且讓那些該硬件還不支持的特性也能用軟件仿真的方式加以實現(xiàn)。設備無關性通常是通過硬件抽象層(hal:hardware abstraction layer)實現(xiàn)的。directdraw 主要提供了完成以下任務的工具:管理多頁面 ,直接訪問視頻 ram ,換頁(page flipping) ,后臺緩存(ba

13、ck buffering) ,管理調色板(palette) ,裁剪(clipping) ,視頻端口(video port) 。除此之外,directdraw 允許開發(fā)者在應用程序運行期測定顯示硬件的特性,然后,充分利用主機硬件設備的加速特性為用戶提供可能的最優(yōu)的顯示速度和效果。directdraw 對象的創(chuàng)建和準備的每一步驟:1. 創(chuàng)建 directdraw 對象:創(chuàng)建 directdraw 對象的一個實例,應該用directdrawcreate api 函數(shù),也可以用 com 中的 cocreateinstance 函數(shù)。directdrawcreate 用一個全局統(tǒng)一標志符 guid(gl

14、obally unique identifier)來表征顯示設備,在大多數(shù)情況下 guid 為 null(使用系統(tǒng)的缺省顯示設備,既“空設備” ) ;指針指向directdraw 對象的地址;第三個參數(shù)總是 null(供將來擴展使用)。下述代碼表明了如何創(chuàng)建一個 directdraw 對象,并且檢驗是否成功。2.設置顯示模式:設置 directdraw 應用程序的顯示模式需要兩步:首先調用idirectdraw:setcooperativelevel 方法來設定該模式下的要求,一旦確定了要求,再用idirectdraw:setdisplaymode 方法來選擇顯示分辨率。在改變顯示分辨率之前,

15、還必須通過 idirectdraw:setcooperativelevel 方法來指定 ddscl_exclusive 和ddscl_fullscreen 標志。這樣能使游戲程序完全控制顯示設備,其它的應用程序不能同時共享顯示設備。ddscl_fullscreen 標志表示將程序設為全屏模式。使用c+程序設計課程設計(2014)5idirectdraw:setcooperativelevel 時,必須向窗口 (hwnd)傳送一個句柄,讓窗口決定何時非正常地終止應用程序。例如,若發(fā)生了 gp 錯誤或 gdi 被翻轉(flip)到了后臺緩沖區(qū),用戶就無法訪問當前屏幕。為了避免這種情況,direct

16、draw 有一個后臺等待進程,它俘獲所有發(fā)往該窗口的消息,用這些消息來確定應用程序何時終止。如果創(chuàng)建了新的窗口,必須確定該窗口為活動的,否則,就會有一系列的事件無法繼續(xù)工作。3.改變顯示模式一旦選擇了應用程序的工作模式,就可以使用方法來改變顯示模式。4.創(chuàng)建可翻轉表面(flippable surface) :設定了顯示模式后,必須創(chuàng)建放置應用程序的表面。5. 定義表面要求:創(chuàng)建可翻轉表面的的第一步是在 ddsurfacedesc 結構中定義表面的要求。6. 創(chuàng)建表面: 填完了 ddsurfacedesc 結構,就可以使用該結構和 lpdd 了,lpdd 是用directdrawcreate 方

17、法創(chuàng)建的 directdraw 對象的指針。7.取得后臺緩沖區(qū)的指針: 使用 idirectdrawsurface:getattachedsurface 方法可以取得后臺緩沖區(qū)的指針。8.著色表面: 創(chuàng)建了主表面和后臺緩沖區(qū)后,ddex1 使用標準的 windows gdi 函數(shù)將一些文本提交到主表面和后臺緩沖區(qū)。一般來講,當向表面寫數(shù)據(jù)時,該表面就是后臺緩沖區(qū),然后將緩沖區(qū)翻轉成主表面顯示出來。在 ddex1 中,第一次翻轉表面之前有一個重要的延遲。于是 ddex1 就將數(shù)據(jù)寫入主緩沖區(qū),避免開始顯示時有太長的時間間隔。后面將會講到,ddex1 只在 wm_timer 期間向后臺寫數(shù)據(jù)。初始

18、化函數(shù)或標題頭可能會寫入主緩沖區(qū)。應該注意的是,一旦使用 idirectdrawsurface:unlock 對表面解鎖,指向表面的指針就變成無效,必須再次使用 idirectdrawsurface:lock 方法才能獲取該表面內存的有效指針。9.寫表面及翻轉表面: 完成了初始化后,ddex1 開始處理消息循環(huán)。在消息循環(huán)的過程中,完成鎖定后臺緩沖區(qū)寫入新的文本解鎖后臺緩沖區(qū)翻轉表面的過程。wm_timer 包含了寫數(shù)據(jù)和翻轉表面的大部分代碼。 wm_timer 消息的前半部分用于向后臺緩沖區(qū)寫數(shù)據(jù), “phase”變量決定是寫主緩沖區(qū)消息還是寫后臺緩沖區(qū)消息。如果 phase為 1,表示寫主

19、緩沖區(qū)的消息,然后將 phase 改變?yōu)?0;若為 0,表示寫后臺緩沖區(qū)的消息,然后將 phase 改變?yōu)?1。注意,兩種情況中的消息都是寫向后臺緩沖區(qū)。后臺緩沖區(qū)寫入了消息后,使用 idirectdrawsurface:releasedc 方法解鎖。10. 釋放 directdraw 對象: 當按了 f12 后,ddex1 程序在退出之前先處理wm_destroy 消息,該消息調用了 finiobjects 函數(shù),而 finiobjects 函數(shù)包含了所有的iunknown release 的調用。11. 將位圖調入表面: 如 ddex1 中一樣,doinit 函數(shù)是 ddex2 的初始化函

20、數(shù),兩者的實質一樣。c+程序設計課程設計(2014)612.設置調色板,將位圖調入后臺緩沖區(qū): 創(chuàng)建了調色板之后,可以通過調用idirectdrawsurface:setpalette 方法將 directdrawpalette 對象的指針 ddpal 傳送給主表面。13. 從屏外表面位塊傳輸: ddex2 同 ddex1 基本相同。ddex2 打開一個位圖文件并將它送往后臺緩沖區(qū),然后翻轉后臺緩沖區(qū)和主表面。但這對顯示位圖并不特別理想,ddex3擴展了 ddex2 的功能,它加入了兩個屏外緩沖區(qū),每個緩沖區(qū)都存儲一個位圖。14. 將位圖文件調入屏外表面: 創(chuàng)建了兩個屏外表面后,ddex3 使

21、用了 initsurfaces函數(shù)將位圖從 frntback.bmp 文件裝入到兩個表面。initsurfaces 函數(shù)使用了ddcopybitmap 函數(shù)調入兩個位圖。15. 將屏外表面位位塊傳輸?shù)胶笈_緩沖區(qū):wm_timer 包含了寫表面和翻轉表面的代碼。在 ddex3 中,它選擇適當?shù)钠镣獗砻?,并將其位塊傳輸?shù)胶笈_緩沖區(qū)。16. 創(chuàng)建動畫: 1、color key 和位圖動畫在 ddex3 例中描述了將位圖放入屏外緩沖區(qū)的一種主要方式。ddex4 則使用了將背景和一系列的精靈(sprite,本例中精靈是圓環(huán))裝入屏外表面的技術,然后使用, idirectdrawsurface:bltfa

22、st 方法將屏外表面的各部分拷貝到后臺緩沖區(qū)。doinit 函數(shù)除了具有前面例子中的功能外,還包括了為精靈設置color key 的代碼。color key 是用于設置透明度的顏色值。當使用硬件塊寫方式時,矩型區(qū)域內除了設為 color key 的像素,其它的像素都被塊寫,由此在表面上產生非矩型的精靈。17.動態(tài)改變調色板:ddex5 描述了任何在程序運行時動態(tài)地改變調色板,盡管在游戲中這并不總是用到。directdraw 確實能很好地控制調色板。18. 替換調色板:ddex5 中的 updateframe 函數(shù)同 ddex4 中的基本相同,先將背景塊寫入后臺緩沖區(qū),再將 3 個紅色圓環(huán)塊寫到

23、前景。19. 使用覆蓋表面(overlay): 創(chuàng)建一個主表面要使用覆蓋表面,必須先要初始化一個主表面,覆蓋表面將顯示在該主表面上。檢測硬件對覆蓋的支持 初始化 directdraw 后,需要檢測設備是否支持覆蓋表面。因為 directdraw 不能仿真覆蓋,所以如果硬件不支持覆蓋,就不能繼續(xù)下面的工作。你可以用方法獲取硬件設備驅動程序的能力檢測覆蓋支持。在調用該方法之后,查看 ddcaps 結構中的 dwflags 成員是否包含有 ddcaps_overlay 標志。若有就表明支持覆蓋,否則就不支持。創(chuàng)建一個覆蓋表面如果知道顯示設備支持覆蓋表面,就可以創(chuàng)建一個。因為沒有指明設備怎樣支持覆蓋表

24、面的標準,所以不能夠期望創(chuàng)建任意大小的像素格式的表面。另外,也不要期望第一次創(chuàng)建覆蓋表面就會成功。因此,必須作好準備進行多次創(chuàng)建的嘗試,直到有一個能夠工作為止。mosquito 程序在創(chuàng)建表面時遵循“best case to worst case”的原則,首先嘗試創(chuàng)建一個三緩沖頁翻轉復雜覆蓋表面。如果嘗試失敗,程序就改變方法嘗試用其它通用的迅速格式來配置。顯示覆蓋表面創(chuàng)建了覆蓋表面之后就可以顯示它了。通常,硬件在用于顯示覆蓋的矩形的位置和像素格式上加上c+程序設計課程設計(2014)7對齊約束。另外,還需要經常通過調整目的矩形的寬度來說明最小要求的拉伸因子以成功地顯示覆蓋表面。更新覆蓋的顯示位

25、置顯示覆蓋表面之后,有時可能就不需要對覆蓋做其它的操作了。但有些軟件還需要重新放置覆蓋,改變覆蓋的顯示位置。隱藏覆蓋表面如果不再需要一個覆蓋表面或只想不讓覆蓋可見。updateoverlay updateoverlay 用于重新定位一個覆蓋頁面,或修改其視覺屬性。這些頁面在創(chuàng)建時必須提 ddscaps_overlay 標志。3 3 詳細設計詳細設計3.1 主要的函數(shù)和定義說明3.1.1 winmain 函數(shù)主函數(shù)的入口。和我們以前的 main()函數(shù)一樣。本次設計中的具體定義:int winapi winmain(hinstance hinstance,hinstance hprevinsta

26、nce,lpstr lpcmdline,int nmode)。3.1.2 wm_lbuttondown wm_lbuttondown 消息當用戶在 window 客戶區(qū)域點擊鼠標左鍵的時候發(fā)送。如果當前鼠標沒有被捕捉,消息發(fā)送給鼠標下面的 window 窗體。否則,消息發(fā)送給當前捕捉鼠標消息的方法。3.1.3 windowfun 函數(shù) 窗口構造函數(shù),注冊函數(shù),自動調用,處理消息循環(huán)。本次設計中的具體定義:lresult callback windowfunc(hwnd hwnd,uint message,wparam wparam,lparam lparam)。3.1.4 initddraw(

27、)函數(shù)運用了 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 裁剪器。本次設計中的具體定義:bool initddraw()dword dwflags;ddsurfacedesc ddsd;c+程序設計課程設計(2014)8/創(chuàng)建 directdraw 對象directdrawcreate(null, &lpdd, null);/設置協(xié)作級別為窗口模式dwflags = ddscl_norma

28、l;lpdd-setcooperativelevel(hwnd, dwflags);/創(chuàng)建主頁面zeromemory(&ddsd, sizeof(ddsd);ddsd.dwsize = sizeof(ddsd);ddsd.dwflags = ddsd_caps;ddsd.ddscaps.dwcaps = ddscaps_primarysurface;lpdd-createsurface(&ddsd, &lpddsfront, null);/創(chuàng)建離屏頁面ddsd.dwflags = ddsd_caps | ddsd_width | ddsd_height; ddsd.ddscaps.dwcaps

29、 = ddscaps_offscreenplain;rect rect;getclientrect(hwnd, &rect);forewidth=rect.right-rect.left;foreheight=rect.bottom-rect.top;getrect(&backrect, 0, 0, 433,348);ddsd.dwwidth = backwidth=forewidth;ddsd.dwheight = backheight=foreheight;lpdd-createsurface( &ddsd, &lpddsback, null );/創(chuàng)建老鼠頁面ddsd.dwwidth =

30、 124;ddsd.dwheight = 425;lpdd-createsurface( &ddsd, &lpddsmouse0, null );lpdd-createsurface( &ddsd, &lpddsmouse1, null );lpdd-createsurface( &ddsd, &lpddsmouse2, null );ddreloadbitmap(lpddsmouse0, mouse00.bmp);c+程序設計課程設計(2014)9ddreloadbitmap(lpddsmouse1, mouse01.bmp);ddreloadbitmap(lpddsmouse2, mous

31、e02.bmp);ddsetcolorkey(lpddsmouse0,rgb(0,0,255);ddsetcolorkey(lpddsmouse1,rgb(0,0,255);ddsetcolorkey(lpddsmouse2,rgb(0,0,255);/創(chuàng)建木錘ddsd.dwwidth = 68;ddsd.dwheight = 136;lpdd-createsurface( &ddsd, &lpddshammer, null );ddreloadbitmap(lpddshammer, ham.bmp);ddsetcolorkey(lpddshammer,rgb(0,0,255);/創(chuàng)建火花dd

32、sd.dwwidth = 68;ddsd.dwheight = 24;lpdd-createsurface( &ddsd, &lpddsbow, null );ddreloadbitmap(lpddsbow, bow.bmp);ddsetcolorkey(lpddsbow,rgb(255,0,127);/創(chuàng)建標題ddsd.dwwidth = 319;ddsd.dwheight = 56;lpdd-createsurface( &ddsd, &lpddslogo, null );ddreloadbitmap(lpddslogo, logo.bmp);ddsetcolorkey(lpddslogo

33、,rgb(0,0,255);/創(chuàng)建背景ddsd.dwwidth = 433;ddsd.dwheight = 348;lpdd-createsurface( &ddsd, &lpddsbk, null );ddreloadbitmap(lpddsbk, bk.bmp);c+程序設計課程設計(2014)10/創(chuàng)建時間ddsd.dwwidth = 45;ddsd.dwheight = 13;lpdd-createsurface( &ddsd, &lpddstime, null );ddreloadbitmap(lpddstime, time.bmp);ddsetcolorkey(lpddstime,

34、rgb(255,0,127);/創(chuàng)建數(shù)字ddsd.dwwidth = 260;ddsd.dwheight = 38;lpdd-createsurface( &ddsd, &lpddshamfig, null );ddreloadbitmap(lpddshamfig, hamfig.bmp);ddsetcolorkey(lpddshamfig,rgb(255,0,127);/創(chuàng)建數(shù)字ddsd.dwwidth = 160;ddsd.dwheight = 23;lpdd-createsurface( &ddsd, &lpddsfig, null );ddreloadbitmap(lpddsfig,

35、fig.bmp);ddsetcolorkey(lpddsfig,rgb(255,0,127);/創(chuàng)建分數(shù)頁面ddsd.dwwidth = 43;ddsd.dwheight = 25;lpdd-createsurface( &ddsd, &lpddsscore0, null );lpdd-createsurface( &ddsd, &lpddsscore1, null );lpdd-createsurface( &ddsd, &lpddsscore2, null );ddreloadbitmap(lpddsscore0, score01.bmp);ddreloadbitmap(lpddsscor

36、e1, score02.bmp);ddreloadbitmap(lpddsscore2, score03.bmp);ddsetcolorkey(lpddsscore0,rgb(255,0,127);ddsetcolorkey(lpddsscore1,rgb(255,0,127);c+程序設計課程設計(2014)11ddsetcolorkey(lpddsscore2,rgb(255,0,127);/創(chuàng)建 clipper 裁剪器lpdd-createclipper(0, &lpclipper, null);lpclipper-sethwnd(0, hwnd);lpddsfront-setclipp

37、er(lpclipper);return true;3.1.5 initdata()函數(shù) 在本次設計中的作用是數(shù)據(jù)初始化。實現(xiàn)老鼠洞位置數(shù)據(jù)的初始化,老鼠頭位置的初始化。本次設計中的具體定義:void initdata()int i;bactive = true;delay = 5;dwlasttickcount = 0;hit = false;get = false;time = 20;score = 0;rect window;gamestatus = 0;getclientrect(hwnd, &window);pt.x=pt.y=0;clienttoscreen(hwnd, &pt);

38、/初始化老鼠洞位置holepos0.x = 24;holepos0.y = 215;c+程序設計課程設計(2014)12holepos1.x = 160;holepos1.y = 215;holepos2.x = 296;holepos2.y = 215;holepos3.x = 1;holepos3.y = 150;holepos4.x = 137;holepos4.y = 150;holepos5.x = 274;holepos5.y = 150;holepos6.x = 32;holepos6.y = 87;holepos7.x = 159;holepos7.y = 87;holepos

39、8.x = 287;holepos8.y = 87;/初始化老鼠頭位置for (i = 0 ;i 9;i+)mouseposi.x = holeposi.x + 25;mouseposi.y = holeposi.y +15;mousewidth = 62;mouseheight = 62;/初始化老鼠洞for (i =0 ;i2)delay -= 2;break;case vk_escape:messagebox(hwnd,送給你的.:)n from:n 耗子nhttp:/n r,關于這個游戲,mb_ok);postquitmessage(0);break;break;3.1.10 wm_l

40、buttonup窗口消息當光標在窗口客戶區(qū)時,用戶釋放鼠標左鍵時發(fā)出的消息。如果鼠標沒有捕獲,這個消息被送到光標下的窗口。否則,該消息發(fā)布到捕獲鼠標的窗口。程序如下:case wm_lbuttonup: hit = false;break;3.1.11 wm_destroy:wm_destroy 是關閉程序的,關閉程序時彈出對話框。程序如下:case wm_destroy:messagebox(hwnd,送給你的.:)nfrom:n 關于這個游戲,mb_ok);postquitmessage(0);break;3.1.12 wm_mousemove:作用是鼠標移動對應的坐標。程序如下:c+程序

41、設計課程設計(2014)15case wm_mousemove:pos.x = loword(lparam);pos.y = hiword(lparam);break;3.1.13 wm_timerc+中定時器 告訴 windows 一個時間間隔,然后 windows 以此時間間隔周期性觸發(fā)程序。程序如下:case wm_timer:if (bactive)switch (wparam)case 1:stepall();break;case 2:time -;break;break;default:return defwindowproc(hwnd,message,wparam,lparam)

42、;break;return 0;3.1.14 hwnd 的作用 介紹如下程序:hwnd = createwindow(/設計窗口szclassname,打老鼠,ws_sysmenu|ws_caption|ws_minimizebox|ws_popup,/窗口坐標180,/窗口的位置程序框頂點到顯示框頂點之間是 180 和 80c+程序設計課程設計(2014)1680,433,/窗口的長寬348,hwnd_desktop,null,hinstance,null);3.1.15 showwindow(hwnd,nmode);/顯示窗口 hwnd3.1.16 updatewindow(hwnd);/

43、更新窗口3.1.17 initdata()如下程序含義定義的 settimer(窗口中設置時鐘,時鐘的編號,時鐘的速度,null) 。單位是毫秒,表示 1000 毫秒的時鐘,滴答一下。設置時鐘的目的是有消息 timer, 每滴答一下 ,響應消息 ,執(zhí)行消息響應。程序如下:settimer(hwnd,1,200,null);settimer(hwnd,2,1000,null);3 程序調試3.1 調試成果及講解 3.1.1 三種種類的老鼠c+程序設計課程設計(2014)17圖 3-1如圖 3-1 土黃老鼠是可愛的老鼠,是普通地鼠,分數(shù)也普通。圖 3-2如圖 3-2 粉紅色老鼠頭上有個可愛的蝴蝶結

44、,不能隨便打,會倒扣分數(shù)。c+程序設計課程設計(2014)18圖 3-3如圖 3-3 黑老鼠有兇惡的眼神,速度很快,打擊難度高,分數(shù)也高。3.2 運行效果初始:圖 3-4點擊左鍵跳出如下對話框,點擊確定,進入游戲。c+程序設計課程設計(2014)19圖 3-5游戲結束 出現(xiàn)如下對話框。點擊確定 ,再來一局。c+程序設計課程設計(2014)20再玩一局破紀錄后出現(xiàn)如下對話框,記錄刷新。圖 3-6打中的老鼠會頭金星,出現(xiàn)如下星星:c+程序設計課程設計(2014)215 心得體會在學習 c+以前,我認為 c+只是在 c 語言的基礎上的一種延伸,認為只要學過 c 語言,就可以用 c 語言的那種設計思想

45、來學習 c+、設計 c+程序。正是由于抱了這種錯誤的思想,使我在一開始學習 c+的時候遇到了很大的困難,我沒有辦法體會面向對象的設計思想,我在學習這門課的時候老是想著實現(xiàn)這個函數(shù)功能的具體過程,而沒太注意對象分類的重要性。隨著課程學習的深入,我感覺到了利用類和對象、繼承、封裝等一系列知識可以把我們程序中很多繁雜、重復的部分省略掉,還可以解決一些利用面向過程的設計思想無法解決的問題,我自己也試著編寫一些小的 c+程序,當然在這個過程中遇到了很多困難,其中調試帶來的困難讓我無法忘記,在調試程序的同時,我也總結出來了一些調試的小技巧,讓我在 c 語言課程設計中也受用匪淺。雖然現(xiàn)在仍然會有一些問題不能

46、解決比如插入透明圖片的問題。但是在今后的學習和努力中會發(fā)現(xiàn)更多的東西,更加的進步。在學習這門課的過程中,我感受到了自己親自動手編程序、調程序的重要性,我們要熟悉 c+的語法、體會調試的思想,最好的一個手段就是自己動手編程、調試,這會比我們一味的看書效果好得多。另外,我還感覺到一個好的程序編出來需要很多人的團結合作。我在檢查自己編寫的程序是否有 bug 未被找出的時候,我會讓我的同學作為一個程序使用者來找出未發(fā)現(xiàn)的bug 并提出改進意見,這讓我們的工作更加高效。很高興能夠了解到 c+的神奇魅力和面向對象程序設計的獨特思想,它為我今后的程序設計奠定了基礎。感謝老師對我們的悉心教授!c+程序設計課程

47、設計(2014)22參考文獻參考文獻1 譚浩強, c 程序設計 ,清華大學出版社2 劉振安,孫忱,劉燕君, c 程序設計課程設計 ,機械工業(yè)出版社3 汪詩林, 數(shù)據(jù)結構算法與應用 ,機械工業(yè)出版社4 陳錦昌,趙明秀.c 語言計算機繪圖教程.華南理工大學出版社.1998.9c+程序設計課程設計(2014)23附錄(部分主要程序)#include #include #include ddutil.h#include stdio.h#include resource.h/函數(shù)聲明int updateframe();lresult callback windowfunc(hwnd,uint,wpara

48、m,lparam);bool initddraw( void );void getrect(rect* rect, long left, long top, long width, long height);void flip(void);void drawall();void initdata();void checkhit();void stepall();void startgame();void drawnumber(lpdirectdrawsurface dd,lpdirectdrawsurface ss,int num,int x,int y,int width,int heigh

49、t);/全局變量char szclassname = forepork;hwnd hwnd;/showwindow 函數(shù)中whnd 的定義hinstance hinst;bool bactive;dword delay;/延時dword dwtickcount,dwlasttickcount;/關于游戲的全局變量boolhit,get;pointpos;/木錘位置intforewidth, foreheight;/前臺頁面的寬度和高度rectbackrect;/后臺頁面映射矩形intbackwidth, backheight;/后臺頁面的寬度和高度intmouse9;/老鼠洞出現(xiàn)東東的紀錄po

50、intholepos9;/老鼠洞的位置pointmousepos9;/老鼠頭的位置intstatus9;/老鼠狀態(tài),0-4intbehit9;/老鼠各個被打的紀錄intmousewidth;intmouseheight;point pt;inttime;/剩余時間intscore;/分數(shù)intgamestatus;/游戲狀態(tài)c+程序設計課程設計(2014)2/directdraw 變量lpdirectdraw lpdd;lpdirectdrawclipper lpclipper;lpdirectdrawsurface lpddsfront; /以下均為directdrawsurface 對象l

51、pdirectdrawsurface lpddsback; lpdirectdrawsurface lpddsmouse3;lpdirectdrawsurface lpddshammer;lpdirectdrawsurface lpddsbk;lpdirectdrawsurface lpddslogo;lpdirectdrawsurface lpddsbow;lpdirectdrawsurface lpddsfig;lpdirectdrawsurface lpddshamfig;lpdirectdrawsurface lpddstime;lpdirectdrawsurface lpddssco

52、re3;int winapi winmain(hinstance hinstance,hinstance hprevinstance,lpstr lpcmdline,int nmode)/與 main 函數(shù)類似 是函數(shù)的入口msg msg;/消息,基于消息的編程 什么是消息?操作系統(tǒng)封裝消息 變成結構/在 windows 中發(fā)生的一切都可以用消息來表示,消息用于告訴操作系統(tǒng)發(fā)生了什么,/所有的 windows 應用程序都是消息驅動的。 一個消息是由消息的名稱(uint)和兩個參數(shù)(wparam, lparam)組成。wndclassex wcl;wcl.cbclsextra = 0;wcl.c

53、bsize = sizeof(wndclassex);wcl.cbwndextra = 0;wcl.hbrbackground = (hbrush) getstockobject(white_brush)/white_brush 表示窗口的顏色是白色的;wcl.hcursor = loadcursor(null,idc_arrow);/loadcursor 光標wcl.hicon = loadicon(hinstance,idi_icon1);/loadicon 圖標wcl.hiconsm = loadicon(null,idi_winlogo);/logowcl.hinstance = hi

54、nstance;wcl.lpfnwndproc = windowfunc;wcl.lpszclassname = szclassname;wcl.lpszmenuname = null;wcl.style = 0;if (!registerclassex(&wcl) return 0;c+程序設計課程設計(2014)3hwnd = createwindow(/設計窗口szclassname,打老鼠,ws_sysmenu|ws_caption|ws_minimizebox|ws_popup,/窗口坐標180,/窗口的位置程序框頂點到顯示框頂點之間是 180 和 8080,433,/窗口的長寬34

55、8,hwnd_desktop,null,hinstance,null);showwindow(hwnd,nmode);/顯示窗口 hwndupdatewindow(hwnd);/更新窗口if (!initddraw()messagebox(getactivewindow(), 初始化 directdraw 過程中出錯!請檢查你是否正確的安裝了 directx。, error, mb_ok );return 0;hinst = hinstance;initdata();settimer(hwnd,1,200,null);/(窗口中設置時鐘,時鐘的編號,時鐘的速度,null)單位是毫秒 快sett

56、imer(hwnd,2,1000,null);/表示 1000 毫秒的時鐘 滴答一下 慢/設置時鐘的目的是有消息timer 每滴答一下 響應消息 執(zhí)行消息響應while(1)if( peekmessage(&msg,null,0,0,pm_noremove)/消息循環(huán)if (!getmessage(&msg,null,0,0)/接收消息return msg.wparam;translatemessage(&msg);/翻譯消息dispatchmessage(&msg);/處理消息else if( bactive)updateframe();elsec+程序設計課程設計(2014)4waitmessage();killtimer(hwnd,1);/時鐘停

溫馨提示

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

評論

0/150

提交評論