

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、<p> 《面向?qū)ο蟪绦蛟O計》</p><p><b> 課程設計</b></p><p> 題 目: 吃豆子游戲程序 </p><p> 院 系: 數(shù)學與計算科學學院 </p&
2、gt;<p> 專 業(yè): 信息與計算科學 </p><p> 指導老師: </p><p> 日 期: 2014 年 12 月 30 日</p><p><b&g
3、t; 心得體會:</b></p><p> 通過這次課程設計,我從對MFC的陌生到能熟練運用基本的函數(shù),了解其編程的具體實現(xiàn)方法,我對于面象對向編程有了更深刻的認識,通過四個人的團隊合作,我從主持諧調(diào)各方面工作,如聽取各方面意見,看成員整理好的資料,到擔任代碼編寫,學會了團隊合作的重要性,團隊合作在寫大的程序時比單個人完成有很大的優(yōu)點。我會繼續(xù)在面向?qū)ο缶幊躺舷鹿Ψ颍驗閷W無止境。</p&g
4、t;<p><b> 摘 要</b></p><p> MFC是Windows編程的面向?qū)ο蠡?是對Windows函數(shù)的簡單封裝,使用MFC編程可以在短時間內(nèi)編寫一個Windows程序,而不必寫大量Windows代碼,所以我使用MFC編寫了一個吃豆子程序,該程序?qū)崿F(xiàn)了一個能過使用方向鍵控制消除屏幕上存在的豆子的功能,當用戶按鍵盤向上、下、左、右鍵或每格一秒鐘,嘴的狀態(tài)發(fā)生
5、改變,或是從一個方向張開向另一個方向,或是由張開變成閉合狀態(tài),從而實現(xiàn)嘴一張一合前進,當嘴所經(jīng)過位置有豆子,豆子被消除而不再出現(xiàn),所有豆子被“吃”完時,程序彈出對話框“You win ,Exit?”,用戶點確定后可退出程序。實現(xiàn)方法:嘴的張開與閉合分別用MFC的Pie和Ellipse函數(shù)實現(xiàn),豆子被存儲在一個標記數(shù)組中,豆子被吃時數(shù)組相應元素標記為零。在OnDraw()函數(shù)中畫出每個豆子和嘴的原始位置,在響應鍵盤上下左右方向虛擬鍵VK_
6、UP、VK_DOWN、VK_LEFT、VK_RIGTH的函數(shù)中控制豆子移動和嘴的方向,程序開始時在響應WM_CREATE消息的函數(shù)中設置一個TIMER,方向鍵消息和TIMER消息統(tǒng)一由一個判斷函數(shù)處理從而實現(xiàn)自動前進時的沿當前方向前進。</p><p> 關鍵字:程序設計 豆子 MFC </p><p><b> Abstract</b></p>&
7、lt;p> MFC is a Windows-based object-oriented programming, it is a simple package of Windows 'function , using the MFC programming can make us write a Windows program in a short time, without having to write a lot
8、 of Windows code, so I use MFC written a eat-beans program ,in this program we can use the arrow keys to control the mouth to move to eliminating the beans on the screen, when the user presses the keyboard up, down, left
9、, right, or each time one second goes by, the state of the mouth changed,</p><p> Key words: programming Eat-beans MFC</p><p><b> 目 錄</b></p><p> 引言…………………………………
10、…………………………</p><p><b> CRC分析過程陳述</b></p><p><b> 程序介紹與展示</b></p><p> 程序測試……………….</p><p><b> 結(jié)果分析與總結(jié)</b></p><p><b&
11、gt; 參考文獻</b></p><p><b> 引言</b></p><p> 在本次課程設計中,課題組主要是想通過吃豆子游戲的開發(fā),讓自身在軟件開發(fā)的知識水平提升一個檔次,特別是對軟件開發(fā)形成一種概念,同時加強培養(yǎng)團隊合作意識。這個課設的要求是要課題組用MFC編寫一個吃豆子的小游戲,這個游戲是用方向鍵控制一個”小怪獸”移動并吃掉界面上的所有的“
12、小豆子”,</p><p> 隨后經(jīng)歷了一個星期的分析與討論后,課題組正式進入課題系統(tǒng)實質(zhì)性的開發(fā)階段。課題組把程序開發(fā)的過程分為程序分析、程序設計、程序?qū)崿F(xiàn)和程序測試四個階段,在程序分析中,對程序進行了可行性分析、需求分析以及功能分析,在結(jié)束這階段的工作后轉(zhuǎn)入系統(tǒng)設計階段;在系統(tǒng)設計中,主要是明確整個程序的界面模塊、算法實現(xiàn)、以及極限問題等;系統(tǒng)的實現(xiàn),歷經(jīng)一個半月,主要是實現(xiàn)系統(tǒng)設計中的所有模塊功能;最后利
13、用了一周的時間對程序中的各個模塊進行了測試,最終完成系統(tǒng)的測試;</p><p> 在完成開發(fā)工作后,課題組的任務立刻轉(zhuǎn)向課設論文的寫作,課題組各成員課設論文的寫作內(nèi)容原則上就是其在設計開發(fā)中所承擔的主要任務,最后總結(jié)成了本篇論本。 </p><p><b> CRC分析過程陳述</b></p><p> 其中dispose()
14、函數(shù)用得最多。OnMoveleft,OnMoveright都調(diào)用dispose()函數(shù)來處理消息。</p><p> 按鍵向上,向下,向左,向右,消息響應函數(shù):</p><p> 嘴的圖形是一個圓形與一個扇形交替顯示,圓形表示嘴閉合的情況,扇形表示嘴張開的形狀;繪制圓形和扇形的函數(shù)為CDC類的成員函數(shù)Ellipse和Pie;</p><p> 豆子可以存儲在一
15、個數(shù)組中,數(shù)組的數(shù)據(jù)是每個豆子圓心的坐標;在OnDraw()函數(shù)中畫出每個豆子和嘴的原始位置,鍵盤上下左右方向鍵的虛擬鍵碼分別為VK_UP、VK_DOWN、VK_LEFT、VK_RIGTH,在程序開始時的WM_CREATE的響應函數(shù)中設置一個TIMER,在CView的派生類中對方向鍵和TIMER消息用統(tǒng)一函數(shù)處理,dispose中處理為:若是TIMER消息則嘴前進方向與當前方向一致再處理前進,若是方向消息則嘴前進方向為方向鍵所指方向。&
16、lt;/p><p><b> 1.3 功能說明</b></p><p><b> UML類圖</b></p><p><b> 數(shù)據(jù)、分析</b></p><p> 此程序的設計按面向?qū)ο蟮姆椒ㄟM行,系統(tǒng)具有良好的界面;必要的交互信息;簡約美觀的效果。使用人員能快捷簡單地進
17、行操作。本游戲?qū)崿F(xiàn)了一個能過使用方向鍵控制消除屏幕上存在的物體(即所謂嘴)來到達另一個地方來消除另一地方存在的物體即所謂豆子,嘴有張合狀態(tài),張開時可以有四個方向的張開,類似一個大嘴巴。閉合時就是一個圓形。嘴若是接受方向消息時,方向消息與當前方向不一致,則嘴在轉(zhuǎn)向過后保持開的狀態(tài)。當所有豆子被吃完后,彈出對對話框顯示:“You win,Exit?”,用戶寫確定后可退</p><p><b> 背景畫法實
18、現(xiàn)</b></p><p> 先實現(xiàn)畫一條線段的函數(shù)</p><p> void CEatBeanView::Draw_Segment(int pax,int pay,int pbx,int pby)</p><p><b> {</b></p><p> CDC *pDC = GetDC();&l
19、t;/p><p> pDC->MoveTo(b1[pax][pay]);</p><p> pDC->LineTo(b1[pbx][pby]);</p><p><b> },</b></p><p> 再畫橫向和縱向的各從1到length+1和width+1的線段,從而實現(xiàn)畫背景網(wǎng)絡:</p>
20、;<p><b> 豆子畫法實現(xiàn)</b></p><p><b> 嘴張開實現(xiàn)</b></p><p> 嘴張開有四個方向,要實現(xiàn)可以使用CDC類的Pie函數(shù)畫一個張開角度為2700的扇形。</p><p> void CEatBeanView::Draw_Mouth_Open(int x, int
21、y)</p><p><b> {</b></p><p> CDC*pDC = GetDC();</p><p><b> CBrush*p;</b></p><p> p = (CBrush*)pDC->SelectStockObject(LTGRAY_BRUSH);</p&
22、gt;<p> switch(Current_Direction)/*查 看 當 前 嘴 的 方 向 */</p><p><b> {</b></p><p> case 'u':/*方 向 向 上 的 情 況 */</p><p> pDC->Pie(b[x], b[y], b[x+1], b[y
23、+1],</p><p> b[x+1], b[y+1], b[x], b[y+1]);break;</p><p> case 'l':/*方 向 向 左 的 情 況 */</p><p> pDC->Pie(b[x], b[y], b[x+1], b[y+1],</p><p> b[x], b[y+1],
24、b[x], b[y]);break;</p><p> case 'd':/*方 向 向 下 的 情 況 */</p><p> pDC->Pie(b[x], b[y], b[x+1], b[y+1],</p><p> b[x], b[y], b[x+1], b[y]);break;</p><p> case
25、 'r':/*方 向 向 右 的 情 況 */</p><p> pDC->Pie(b[x], b[y], b[x+1], b[y+1],</p><p> b[x+1], b[y], b[x+1], b[y+1]);break;</p><p><b> }</b></p><p><
26、b> }</b></p><p><b> 畫嘴巴的實現(xiàn)</b></p><p> 畫嘴巴的關閉可以用Ellipse函數(shù).</p><p> void CEatBeanView::Draw_Mouth_Closing(int x, int y)</p><p><b> {</
27、b></p><p> CDC*pDC = GetDC();</p><p> CBrush *p;</p><p> p = (CBrush*)pDC->SelectStockObject(LTGRAY_BRUSH);</p><p> pDC->Ellipse(b[x],b[y],b[x+1],b[y+1]);&
28、lt;/p><p><b> }</b></p><p><b> 畫豆子的實現(xiàn)</b></p><p><b> 畫一個豆子的實現(xiàn):</b></p><p> void CEatBeanView::Draw_One_Bean(int x, int y)</p>
29、<p><b> {</b></p><p> CDC*pDC = GetDC();</p><p> CBrush *p;</p><p> p = (CBrush*)pDC->SelectStockObject(LTGRAY_BRUSH);</p><p> pDC->Ellips
30、e( b[x],b[y], b[x+1], b[y+1]);</p><p><b> }</b></p><p><b> 畫所有豆子:</b></p><p> void CEatBeanView::Draw_All_Beans()</p><p><b> {</b&g
31、t;</p><p> for (i = 1; i < length + 1; i++)</p><p> for (j = 1; j < width + 1; j++)</p><p> if (Beans_Array[i][j])</p><p> Draw_One_Bean(i, j);</p><
32、;p><b> }</b></p><p> 算法描述:當標記數(shù)組的(I,j)元素為非零值時,調(diào)用畫一個豆子的函數(shù)Draw_One_Bean畫坐標(i,j)處的豆子。</p><p><b> 核心算法:</b></p><p> 將嘴的當前方向聲明為數(shù)據(jù)成員,再聲明一個方向消息,響應方向鍵的函數(shù)只負責修改當
33、前方向,若是方向鍵響應函數(shù)則將消息方向賦值為該方向鍵對應方向,如下:</p><p> void CEatBeanView::OnMoveup()</p><p><b> {</b></p><p> Direction_Message = 'u';</p><p> dispose();<
34、;/p><p><b> }</b></p><p> void CEatBeanView::OnMovedown()</p><p><b> {</b></p><p> Direction_Message = 'd';</p><p> dispo
35、se();</p><p><b> }</b></p><p> void CEatBeanView::OnMoveleft()</p><p><b> {</b></p><p> Direction_Message = 'l';</p><p>
36、; dispose();</p><p><b> }</b></p><p> void CEatBeanView::OnMoveright()</p><p><b> {</b></p><p> Direction_Message = 'r';</p>
37、<p> dispose();</p><p><b> }</b></p><p> 若是處理定時器消息,即處理每隔一段時間嘴向前一次時,不用改當前方向,因為方向沒有發(fā)生變化,只是調(diào)用dispose根據(jù)當前方向的值處理消息: </p><p> afx_msg LRESULT CEatBeanView::OnTimeto
38、go(WPARAM wParam, LPARAM lParam)</p><p><b> {</b></p><p> dispose();</p><p><b> return 0;</b></p><p><b> }</b></p><p&
39、gt; 其中在dispose中判斷消息方向是否是當前方向,若是,將方向消息轉(zhuǎn)化成位移: </p><p> switch(Direction_Message)/*將 方 向 信 息 轉(zhuǎn) 換 為 位 移 信 息 */</p><p><b> {</b></p><p><b> case'u':</b&g
40、t;</p><p> Mouth_Displacement.x = 0;Mouth_Displacement.y = 1;break;</p><p><b> case'l':</b></p><p> Mouth_Displacement.x = -1;Mouth_Displacement.y = 0;break;&
41、lt;/p><p><b> case'd':</b></p><p> Mouth_Displacement.x = 0;Mouth_Displacement.y = -1;break;</p><p><b> case'r':</b></p><p> Mo
42、uth_Displacement.x = 1;Mouth_Displacement.y = 0;break;</p><p><b> } </b></p><p> 若將嘴可能的下一位置用該位移和當前坐標賦值:</p><p> pre_position.x = Mouth_Position.x+ Mouth_Displacement
43、.x;</p><p> pre_position.y = Mouth_Position.y+ Mouth_Displacement.y;</p><p> 判斷該下一點位置是否越界:</p><p> if (pre_position.x >= 1 && pre_position.x <= length&&<
44、;/p><p> pre_position.y >= 1 && pre_position.y <= width)</p><p> 是則判斷下一點是否有豆子, </p><p> if(Beans_Array[pre_position.x][pre_position.y]==1) </p><p><b
45、> nbeans--;</b></p><p> 將下一點的豆子所在標記數(shù)組元素標記置零, </p><p> Beans_Array[pre_position.x][pre_position.y] = 0; </p><p> 設置下一點到達區(qū)域:</p><p> pre_rect.bottom = b[pre
46、_position.y];</p><p> pre_rect.top = b[pre_position.y+1];</p><p> pre_rect.left = b[pre_position.x];</p><p> pre_rect.right = b[pre_position.x+1]; </p><p> 再設置嘴位置為下
47、一點預到達位置(因確定不越界):</p><p> Mouth_Position = pre_position; </p><p> 當方向消息不是當前消息就僅改變嘴方向,并令嘴一直開著,這樣使得嘴轉(zhuǎn)向后不會由開變成關。 </p><p> Current_Direction = Direction_Message;/*僅 改 變 方 向 */</p&
48、gt;<p> if (!MouthOpen)</p><p> MouthOpen = 1.0;</p><p> 方向判斷處理好后可以刷新之前嘴所在區(qū)域</p><p> InvalidateRect(current_rect, 1);,</p><p><b> 再將嘴顯示出來. </b>&
49、lt;/p><p> Draw_Mouth();</p><p> 最后判斷豆子個數(shù)是否為零,是則殺死計時器,顯示對話框提示。</p><p> if(nbeans==0)</p><p><b> {</b></p><p> KillTimer(1);</p><p&
50、gt; MessageShowBoxAndExit();</p><p><b> }</b></p><p><b> 程序結(jié)果的演示</b></p><p> 5.1測試的研究與選擇</p><p> 測試過程中要判斷測試是否成功,要分析程序界面的變化和計算數(shù)據(jù)的結(jié)果是否正確以及各功能
51、鍵是否能正常使用。</p><p><b> 5.2 測試環(huán)境</b></p><p><b> 測試環(huán)境如下: </b></p><p> 測試系統(tǒng): Windows 8.1</p><p> 測試工具: Visual Studio 2010 </p><p>
52、 5.3 實例測試結(jié)果</p><p> 2010如圖,改宏定義</p><p> 將長寬分別認置為8,5,運行</p><p><b> 如圖</b></p><p> 嘴方向為向上,按向下鍵,得</p><p> 不按鍵盤,則嘴也一直前進</p><p>
53、如上圖,嘴自動前進時一直在所示位置一張一合,說明數(shù)組沒有越界。</p><p> 此時按鍵盤向右鍵,豆子轉(zhuǎn)向右,轉(zhuǎn)向功能實現(xiàn):</p><p><b> 吃豆子如下:</b></p><p><b> 吃完豆子如下:</b></p><p> 參考文獻(單獨一頁)</p>&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- c++課程設計-教學游戲
- c++課程設計--c++程序設計語言
- c++課程設計拼圖游戲
- c++課程設計-- c++面向?qū)ο蟪绦蛟O計
- c++課程設計報告---猴子吃桃問題
- c++課程設計報告--坦克游戲
- c++課程設計報告--猜數(shù)游戲
- 吃豆子游戲.zip
- c++剪刀石頭布游戲課程設計
- c++剪刀石頭布游戲課程設計
- 猜單詞游戲c++課程設計報告
- c++程序設計課程設計報告
- 《c++程序設計課程設計——復數(shù)類》
- 《c++語言程序設計》課程設計報告
- 《程序設計語言(c++)》課程設計
- c++課程設計--設計菜單選擇程序
- c++猜單詞課程設計--——猜單詞游戲
- 基于c++的教師排課程序課程設計
- c程序課程設計報告(掃雷游戲)
- 銀行活期儲蓄程序課程設計c++
評論
0/150
提交評論