這是我制作的設計,里面講述了設計打地鼠游戲的設計步驟,希望感興趣的可以看看
1游戲描述
1.1游戲背景
1.2游戲規則
1.3游戲操作
2系統設計
2.1流程圖
2.2功能模塊設計
2.2.1圖形界面化板塊
2.2.2錘子點擊板塊
2.2.3游戲界面初始化板塊
2.2.4結束判定板塊
2.3數據結構設計
2.4函數功能描述
3詳細設計(程序實現)
3.1開始界面
3.2選擇界面
3.3地圖和游戲元素初始化
3.4錘子的設置
3.5游戲界面
3.6游戲結束界面
3.7背景音樂界面
4團隊分工
5小結
5.1小組總結
5.2小組成員總結
打地鼠游戲是一款非常有趣的休閑敏捷類游戲,單人操作,適用于生活休閑,訓練敏捷速度,操作簡單、易于上手。玩家可以移動鼠標控制錘子點擊,通過擊中隨機出洞的地鼠,積分。 1.2 游戲規則共分為兩種結束條件,只要有一個條件成立,游戲即結束。 - 一共有五次剩余機會,每錯打一次減一,五次扣完,就算結束。
- 倒計時60秒,時間結束,游戲也結束。
- 如果無任何操作,地鼠在規定時間內自動下降,不加分,也不扣分。
- 難度共分為三級,簡單模式、困難模式、地獄模式,相應的速度也會增加,玩家可以在開始界面后選擇難度,相應的,地鼠上升下降的速度也加快。
1.3 游戲操作本游戲操作簡單、易于上手。玩家通過移動鼠標單擊左鍵擊打地鼠即可。 若打中其他區域則剩余機會減一,減至0則游戲結束。 2.1 流程圖圖1 流程圖 2.2.1 圖形界面化板塊開始界面利用loadimage、putimage完成背景貼圖,同理將處理好的圖片(新游戲、退出、音量鍵)加載貼圖,并利用rectangle、setlinecolor設置白色矩形邊框,鼠標移動至相應按鍵處變為矩形框變為紅色。如圖2所示: 
圖2 開始界面 同理,利用loadimage、putimage函數完成相應圖片的粘貼并利用rectangle、setlinecolor設置矩形邊框。如圖3所示: 
圖3 難度選擇界面 將背景圖裁為4部分逐一加載貼圖,利用for循環依次完成小、中、大各三只地鼠的貼圖,并通過圖片遮蓋及隨機數的方式實現只有一只地鼠隨機冒出。左上角設置非客戶區顯示得分、剩余機會、倒計時。如圖4所示: 
圖4 游戲運行界面 與開始界面相同,利用loadimage、putimage函數完成相應圖片的粘貼。如圖5所示: 
圖5 結束游戲 2.2.2 錘子點擊板塊總體上是利用switch case結構,通過鼠標是否點擊來判斷錘子是否擊打,若鼠標左鍵按下,則將原錘子圖片替換為錘子錘下的圖片。 同時,仍舊需要考慮鼠標的點擊位置;在錘子移動的過程中,還需要將錘子的坐標返回,并將其與地鼠隨機出現的坐標比較,若擊中,則得分加1,未擊中剩余機會減1。 因為錘子移動與地鼠隨機冒出要同時進行,因此需要將其放入線程中。 2.2.3 游戲界面初始化板塊將背景圖裁為top、mid_up、mid_down、bottom四部分,先貼三張小地鼠圖片,再貼mid_up背景圖,遮蓋住剛才貼上的小地鼠。同理依次貼上中地鼠、mid_down、大地鼠、bottom。創建地鼠類MyDishu,并將地鼠放至數組ds[9]中,并定義方向數組bool fx[9],利用true或false使地鼠上下移動。利用for循環,使地鼠持續隨機冒出并上升至一定高度后下降。通過sleep使地鼠上升至最高點處停頓。 2.2.4 結束判定板塊游戲界面左上角設置有倒計時及剩余機會。初始機會int e,初始賦值為5,地鼠冒出時錘子擊打但未擊中,則剩余機會減1,減至0,則游戲結束。時間int t,倒計時60s,減至0,賦e=0,游戲結束。當時間減至0,剩余機會也應當隨之同時變化為0,這樣才能使程序更合理,同時又統一了結束判定條件,即e是否為0。 2.3 數據結構設計int e=5; int t=60;//定義了游戲的兩個結束條件,當t=0(倒計時結束)或者e=0(剩余機會為0)的時候,游戲結束 initgraph(x,y);//初始化繪圖窗口,長為x,寬為y closegraph();//關閉圖形界面 IMAGE img;//定義圖片img loadimage (&img,”img.bmp”);//加載圖片,從當前文件夾取出img.bmp的圖片存入img putimage(225, 90, &begin_y, SRCAND); putimage(225, 90, &begin, SRCPAINT); //通過掩碼圖和處理過的原圖兩者關系,在圖形界面輸出程序所需要的圖片。先輸出掩碼圖,在輸出處理原圖,順序不可改變。 //SRCAND:通過使用AND(與)操作符來將源和目標矩形區域內的顏色合并。 //SRCPAINT:通過使用布爾型的OR(或)操作符將源和目標矩形區域的顏色合并 PlaySound("huaze.wav",NULL,SND_FILENAME | SND_ASYNC); //播放一個名為huaze的wav文件。NULL,默認的方式播放。SND_ASYNC:用異步方式播放聲音,PlaySound函數在開始播放后立即返回。但是事實上并不能用參數同時播放兩個wav文件。SND_FILENAME :PlaySound參數指定了WAVE文件名。 MOUSEMSG m;m = GetMouseMsg(); //定義一個鼠標消息m,用m接受鼠標消息:m.x、m.y為鼠標當前坐標, WM_LBUTTONDOWN為鼠標左鍵按下操作 HCURSOR scur = (HCURSOR)LoadImage(NULL, "hammer.cur", IMAGE_CURSOR,0,0,LR_LOADFROMFILE); HWND swnd = GetHWnd(); SetClassLong(swnd, GCL_HCURSOR, (long)scur); //將鼠標樣式初始化為錘子 #include"MyDishu.h" //定義一個頭文件,在頭文件中定義地鼠坐標,并且通過設置Up、Down的函數控制地鼠的上升(出現)和下降(消失)。 //此外還添加了一個地鼠的函數,通過這個函數獲取當前地鼠的x、y坐標。 2.4 函數功能描述void initGame() 加載游戲的圖片,包括背景,地鼠。 void drawGame() 重復畫地鼠,將九只地鼠畫出來,并在此函數中判斷游戲是否結束,且加載了音量的開關鍵。 void Beging() 加載游戲背景圖片,并且顯示游戲的音量鍵開關、開始和退出的界面。 void Nandu() 加載游戲背景圖片,并且顯示游戲難易程度選擇的界面。 void Jifen() 記錄得分,并且顯示剩余的機會和剩余的時間。 void Xiantiao() 加載線框(當鼠標出現在指定的位置上面時,會出現一個 指定大小的紅色矩形線框) void Kaiguan() 當鼠標出現在“開始游戲”或者“退出游戲”上面時,會出現一個紅色的矩形框,當出現在其他的位置上面時,紅色的矩形框不會出現,只會顯示同樣大小的白色矩形框。 //三個線程 DWORD broc(LPVOID lpThreadParamater) 這是一個時間的線程,顯示倒計時。 DWORD proc(LPVOID lpThreadParamater) 這是一個控制地鼠出現和消失的線程。產生一個隨機的0到8之間的數字,代表隨機出現的一只地鼠,讓其自動上升下降并且可以在上升到最高點后停留一段時間。 DWORD aroc(LPVOID lpThreadParamater) 這是一個控制錘子打下去的線程,并且在錘子打下去的時候可以判斷錘子是否打中地鼠。 3 詳細設計(程序實現)3.1 開始界面(1)利用initgraph(630,380)初始化繪圖窗口。 (2)使用loadimage函數加載四張背景圖及其對應的掩碼圖,后使用putimage函數在坐標(0,0)處加載背景; (3)另外還使用了EasyX的BeginBatchDraw等批量繪圖的方法,是界面更加流暢。 3.2 選擇界面加載游戲背景的操作和開始界面的操作相同,唯一不同的是,此界面添加了游戲難度的選擇,分別為一顆星,兩顆星和三顆星,難度依次加大。 - 利用initgraph(630,380)初始化繪圖窗口。
- 使用loadimage函數加載三張背景圖及其對應的掩碼圖,后使用putimage函數在相應位置處加載難度選擇背景圖;
- 當選擇難度后會通過xiantiao()函數轉到打地鼠的界面,開始打地鼠游戲。
3.3 地圖和游戲元素初始化(1)將圖片分為四部分,分別做掩碼和原圖處理。利用initgraph(x,y);初始化圖形窗口,其次在void initGame()中分別定義(IMAGE)和加載(loadimage(&圖片名,“圖片名.bmp”))地鼠的處理圖、掩碼圖以及四張地圖處理圖、掩碼圖。 (2)首先利用兩個putimage函數輸出最上面的背景掩碼圖、處理圖,起始坐標為原點。其次同理貼第一層地鼠(簡稱小地鼠)圖片(地鼠的起始坐標在處理圖片時已測好),利用for函數實現同一層地鼠的貼圖(簡化了程序,使程序更高效)。同理操作剩余的背景和地鼠。 (3)通過以上的方法,實現了背景初始化和地鼠初始化的同步進行。在貼背景的同時,利用for函數通過圖片覆蓋的方法實現9只地鼠的初始化。 3.4 錘子的設置(1)在主函數中利用HCURSOR scur = (HCURSOR)LoadImage(NULL, "hammer.cur", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);加載即將設置的錘子鼠標樣式,然后利用HWND swnd = GetHWnd();獲取繪圖窗口句柄,最后用SetClassLong(swnd, GCL_HCURSOR, (long)scur);將鼠標樣式初始化為錘子即設置窗口類的繪圖句柄。 (2)在線程中利用鼠標消息的傳遞判斷鼠標行為,從而加載并且做出鼠標按下的動作。 3.5 游戲界面(1)利用initgraph(630,380)初始化繪圖窗口。 (2)使用loadimage函數加載四張背景圖及其對應的掩碼圖,以及大中小地鼠及其掩碼圖。 (3)通過三個線程分別實現地鼠的隨機上下移動、錘子擊打后的圖片變化以及倒計時的自動改變。 3.6 游戲結束界面加載背景圖片,在規定的坐標處開始貼圖,程序示例: IMAGE over,over_y;//定義背景圖片及背景圖的掩碼圖 loadimage(&over,"over.bmp");//加載背景圖片 loadimage(&over_y,"over_y.bmp");//加載背景圖的掩碼圖 putimage(270,270,&over_y,SRCAND);//在坐標270,270處加載背景 putimage(270,270,&over,SRCPAINT);// 在坐標270,270處加載掩碼圖 3.7 背景音樂界面IMAGE skai,skai_y,sbi,sbi_y; //定義音樂播放、停止的圖標及其掩碼圖 loadimage(&skai, "skai.bmp"); loadimage(&skai_y, "skai_y.bmp"); loadimage(&sbi, "sbi.bmp"); loadimage(&sbi_y, "sbi_y.bmp"); //對定義的圖片進行加載,存入 putimage(570, 10, &skai_y, SRCAND); putimage(570, 10, &skai, SRCPAINT); putimage(600, 10, &sbi_y, SRCAND); putimage(600,10,&sbi,SRCPAINT); //在合適的位置輸出音樂播放、停止的圖標 PlaySound("huaze.wav",NULL,SND_FILENAME|SND_ASYNC); //播放bgm PlaySound(NULL, NULL, SND_FILENAME); //停止播放音樂
5 小結5.1 小組總結打地鼠游戲是小組分工合作之后完成每一個分版塊的結果。在整個設計的過程中,組長先前將整個問題進行了分析和描述,確定了所涉及到的有關內容,根據對象的難易程度合理分工,完成任務的分配。 本次設計工作量最大的一部分是EasyX圖形化處理,所以分工在三個人身上完成。一個人負責處理游戲的開始界面(包含了開始游戲和退出游戲兩個按鈕),另一個人負責處理難度的選擇界面(包含了一顆星、兩顆星和三顆星的難度選擇按鈕),最后一個人負責游戲打擊界面(包含了地鼠和錘子的貼圖)。 在本次合作中,小組成員互相協作,共同克服艱難,完成了此次設計,同時我們也收獲了很多的知識和能力。培養了我們自我學習、溝通協作的本領。 5.2 小組成員總結我是這次設計的組長,我承擔了任務安排,圖片處理,協助代碼編寫及設計報告撰寫的工作。在這次設計里,我通過和組員討論,將程序分割成幾部分并且分配給每個組員。而每個組員也非常認真的完成了自己的任務。在編程的最初階段,我們雖處于迷茫階段,但是通過看視頻,查資料,問老師,我們解決了一個又一個的問題。在代碼完成的過程中,我們充分認識了合作的重要性,共同克服了所遇到的各種問題。在圖片的處理過程中,除了要搜集大量素材,還要進行ps修改,雖然繁瑣,但是也樂在其中。在這次課設中,我認識到了合作的重要性,也懂得了,只要付出努力,汗水,耐心,就能成功,不管多少困難,最終都能被攻克。 時光飛逝,歲月如歌,繁忙的兩周設計轉眼間就結束了。在這兩周的時光里,我們每天在寢室—教室—食堂這三點一線的生活里,讓我們回憶起了那高中時代的點點滴滴,那久違的充實的而又溫馨的氣息涌入心頭,而這兩周時光也成為我在大學兩年里最為充實的學習時光。雖然一節課都沒有,但感覺比上課還累一點。 第一天傍晚我們在博北小花園見了面,簡單的了解一下,第二天開始,我們就早上九點,圖書館見,由于基礎薄弱,我們在網上看教程視頻,大致了解需要哪些圖形庫。其實一開始,我們也是一臉茫然,但是慢慢的,我們逐漸熟悉、并了解其中的奧妙。我們把主要的頭文件弄好,然后找素材,制定一系列的規則,插入BGM,這其中我們遇到了不少困難,例如:地鼠位置不對,上升下降得速度太快或者太慢,錘子打中地鼠,不計分等,我們克服了這些困難。 通過這次小組自主討論學習,我加深了對C語言的了解,強化了自己的應用能力。對我來說,這是一次愉快的經歷。 這次我主要負責開始界面、背景音樂的代碼編寫,并參與了設計報告的撰寫。在查閱了相關視頻,書籍資料后,大膽的進行各種嘗試,完成了開始界面這部分代碼。但這時完成的界面并不夠美觀,在隊友們的協助下,我們將其進一步美化,最終完成了令人滿意的作品。 插入背景音樂時我們嘗試了多個函數,在反復試驗插入mp3格式不行時,我另辟蹊徑,通過查閱資料了解到了playsound這個函數,又將音頻文件轉為wav格式,解決了這個難題。但同時因為wav格式所占內存較大,總程序所占內存也因此變大了很多,這是較為不妥的。在以后的代碼編寫中,我一定會更加積極主動的嘗試,找到一個適合整體的最優解。
通過這次的設計,使我學會了很多東西,包括書本上的理論知識及書本上學不到的知識。具體的收獲與體會如下: 通過設計,使我加深了對所學理論知識的理解與鞏固,將課本知識運用到實際的程序。課設就像是對大腦的一次鍛煉開發,這個過程中,我既吸收了新知識又對C語言有了更深入的理解,遇到問題時能夠有一個較為清晰的方向。 通過這次設計,使我充分認識了團隊合作的重要性。這次課設是專業自由組隊完成一個小程序的設計開發。組員們共同查找資料,并且有各自的分工。分析的過程中每個成員都有自己獨特的想法,這給程序的開發提供了不少的便利。此外在這次課設過程中,我們小組成員之間共同思考,相互查漏補缺,互相鼓勵,遇到問題的時候共同討論甚至是詢問老師的幫助,在這一點上我認為我們組充分體現了團隊精神,值得發揚。 時光荏苒,轉眼間設計的兩周就過去了。在這次設計實踐中,我通過實踐,懂得了如何運用EasyX完成一些簡單的操作,認識到了團隊合作的重要性。 這次實踐,我了解到了如何在自己建立的窗口內貼圖,并且實現圖片的自動移動等功能。前期參考了很多的資料,簡單了解了一下相關代碼,熟練了之后便開始自己想如何去解決編碼時出現的各種問題,比如說鼠標變成錘子以后如何判定是否打到地鼠,如何進行鼠標點擊,游戲結束的判定方法與程序編寫等等。這次的實踐花費了很多腦筋,但是當各種問題一一解決之后,內心的自豪感便油然而生,讓我覺得這是通過自己的努力和與隊友間的分工合作實現了打地鼠小游戲。在整個過程中原本簡單的思想通過小組的討論逐漸復雜化,原本不成熟的語句代碼也在不斷修改調試的過程中不斷趨向成熟,小組合作是極其重要的。
以上的Word格式文檔51黑下載地址:
文檔(最終版).doc
(4.87 MB, 下載次數: 33)
2019-7-24 18:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|