版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 《面向?qū)ο蟪绦蛟O(shè)計(jì)》</p><p><b> 課程設(shè)計(jì)</b></p><p> 題 目: 吃豆子游戲程序 </p><p> 院 系: 數(shù)學(xué)與計(jì)算科學(xué)學(xué)院 </p&
2、gt;<p> 專(zhuān) 業(yè): 信息與計(jì)算科學(xué) </p><p> 指導(dǎo)老師: </p><p> 日 期: 2014 年 12 月 30 日</p><p><b&g
3、t; 心得體會(huì):</b></p><p> 通過(guò)這次課程設(shè)計(jì),我從對(duì)MFC的陌生到能熟練運(yùn)用基本的函數(shù),了解其編程的具體實(shí)現(xiàn)方法,我對(duì)于面象對(duì)向編程有了更深刻的認(rèn)識(shí),通過(guò)四個(gè)人的團(tuán)隊(duì)合作,我從主持諧調(diào)各方面工作,如聽(tīng)取各方面意見(jiàn),看成員整理好的資料,到擔(dān)任代碼編寫(xiě),學(xué)會(huì)了團(tuán)隊(duì)合作的重要性,團(tuán)隊(duì)合作在寫(xiě)大的程序時(shí)比單個(gè)人完成有很大的優(yōu)點(diǎn)。我會(huì)繼續(xù)在面向?qū)ο缶幊躺舷鹿Ψ颍驗(yàn)閷W(xué)無(wú)止境。</p&g
4、t;<p><b> 摘 要</b></p><p> MFC是Windows編程的面向?qū)ο蠡?是對(duì)Windows函數(shù)的簡(jiǎn)單封裝,使用MFC編程可以在短時(shí)間內(nèi)編寫(xiě)一個(gè)Windows程序,而不必寫(xiě)大量Windows代碼,所以我使用MFC編寫(xiě)了一個(gè)吃豆子程序,該程序?qū)崿F(xiàn)了一個(gè)能過(guò)使用方向鍵控制消除屏幕上存在的豆子的功能,當(dāng)用戶按鍵盤(pán)向上、下、左、右鍵或每格一秒鐘,嘴的狀態(tài)發(fā)生
5、改變,或是從一個(gè)方向張開(kāi)向另一個(gè)方向,或是由張開(kāi)變成閉合狀態(tài),從而實(shí)現(xiàn)嘴一張一合前進(jìn),當(dāng)嘴所經(jīng)過(guò)位置有豆子,豆子被消除而不再出現(xiàn),所有豆子被“吃”完時(shí),程序彈出對(duì)話框“You win ,Exit?”,用戶點(diǎn)確定后可退出程序。實(shí)現(xiàn)方法:嘴的張開(kāi)與閉合分別用MFC的Pie和Ellipse函數(shù)實(shí)現(xiàn),豆子被存儲(chǔ)在一個(gè)標(biāo)記數(shù)組中,豆子被吃時(shí)數(shù)組相應(yīng)元素標(biāo)記為零。在OnDraw()函數(shù)中畫(huà)出每個(gè)豆子和嘴的原始位置,在響應(yīng)鍵盤(pán)上下左右方向虛擬鍵VK_
6、UP、VK_DOWN、VK_LEFT、VK_RIGTH的函數(shù)中控制豆子移動(dòng)和嘴的方向,程序開(kāi)始時(shí)在響應(yīng)WM_CREATE消息的函數(shù)中設(shè)置一個(gè)TIMER,方向鍵消息和TIMER消息統(tǒng)一由一個(gè)判斷函數(shù)處理從而實(shí)現(xiàn)自動(dòng)前進(jìn)時(shí)的沿當(dāng)前方向前進(jìn)。</p><p> 關(guān)鍵字:程序設(shè)計(jì) 豆子 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分析過(guò)程陳述</b></p><p><b> 程序介紹與展示</b></p><p> 程序測(cè)試……………….</p><p><b> 結(jié)果分析與總結(jié)</b></p><p><b&
11、gt; 參考文獻(xiàn)</b></p><p><b> 引言</b></p><p> 在本次課程設(shè)計(jì)中,課題組主要是想通過(guò)吃豆子游戲的開(kāi)發(fā),讓自身在軟件開(kāi)發(fā)的知識(shí)水平提升一個(gè)檔次,特別是對(duì)軟件開(kāi)發(fā)形成一種概念,同時(shí)加強(qiáng)培養(yǎng)團(tuán)隊(duì)合作意識(shí)。這個(gè)課設(shè)的要求是要課題組用MFC編寫(xiě)一個(gè)吃豆子的小游戲,這個(gè)游戲是用方向鍵控制一個(gè)”小怪獸”移動(dòng)并吃掉界面上的所有的“
12、小豆子”,</p><p> 隨后經(jīng)歷了一個(gè)星期的分析與討論后,課題組正式進(jìn)入課題系統(tǒng)實(shí)質(zhì)性的開(kāi)發(fā)階段。課題組把程序開(kāi)發(fā)的過(guò)程分為程序分析、程序設(shè)計(jì)、程序?qū)崿F(xiàn)和程序測(cè)試四個(gè)階段,在程序分析中,對(duì)程序進(jìn)行了可行性分析、需求分析以及功能分析,在結(jié)束這階段的工作后轉(zhuǎn)入系統(tǒng)設(shè)計(jì)階段;在系統(tǒng)設(shè)計(jì)中,主要是明確整個(gè)程序的界面模塊、算法實(shí)現(xiàn)、以及極限問(wèn)題等;系統(tǒng)的實(shí)現(xiàn),歷經(jīng)一個(gè)半月,主要是實(shí)現(xiàn)系統(tǒng)設(shè)計(jì)中的所有模塊功能;最后利
13、用了一周的時(shí)間對(duì)程序中的各個(gè)模塊進(jìn)行了測(cè)試,最終完成系統(tǒng)的測(cè)試;</p><p> 在完成開(kāi)發(fā)工作后,課題組的任務(wù)立刻轉(zhuǎn)向課設(shè)論文的寫(xiě)作,課題組各成員課設(shè)論文的寫(xiě)作內(nèi)容原則上就是其在設(shè)計(jì)開(kāi)發(fā)中所承擔(dān)的主要任務(wù),最后總結(jié)成了本篇論本。 </p><p><b> CRC分析過(guò)程陳述</b></p><p> 其中dispose()
14、函數(shù)用得最多。OnMoveleft,OnMoveright都調(diào)用dispose()函數(shù)來(lái)處理消息。</p><p> 按鍵向上,向下,向左,向右,消息響應(yīng)函數(shù):</p><p> 嘴的圖形是一個(gè)圓形與一個(gè)扇形交替顯示,圓形表示嘴閉合的情況,扇形表示嘴張開(kāi)的形狀;繪制圓形和扇形的函數(shù)為CDC類(lèi)的成員函數(shù)Ellipse和Pie;</p><p> 豆子可以存儲(chǔ)在一
15、個(gè)數(shù)組中,數(shù)組的數(shù)據(jù)是每個(gè)豆子圓心的坐標(biāo);在OnDraw()函數(shù)中畫(huà)出每個(gè)豆子和嘴的原始位置,鍵盤(pán)上下左右方向鍵的虛擬鍵碼分別為VK_UP、VK_DOWN、VK_LEFT、VK_RIGTH,在程序開(kāi)始時(shí)的WM_CREATE的響應(yīng)函數(shù)中設(shè)置一個(gè)TIMER,在CView的派生類(lèi)中對(duì)方向鍵和TIMER消息用統(tǒng)一函數(shù)處理,dispose中處理為:若是TIMER消息則嘴前進(jìn)方向與當(dāng)前方向一致再處理前進(jìn),若是方向消息則嘴前進(jìn)方向?yàn)榉较蜴I所指方向。&
16、lt;/p><p><b> 1.3 功能說(shuō)明</b></p><p><b> UML類(lèi)圖</b></p><p><b> 數(shù)據(jù)、分析</b></p><p> 此程序的設(shè)計(jì)按面向?qū)ο蟮姆椒ㄟM(jìn)行,系統(tǒng)具有良好的界面;必要的交互信息;簡(jiǎn)約美觀的效果。使用人員能快捷簡(jiǎn)單地進(jìn)
17、行操作。本游戲?qū)崿F(xiàn)了一個(gè)能過(guò)使用方向鍵控制消除屏幕上存在的物體(即所謂嘴)來(lái)到達(dá)另一個(gè)地方來(lái)消除另一地方存在的物體即所謂豆子,嘴有張合狀態(tài),張開(kāi)時(shí)可以有四個(gè)方向的張開(kāi),類(lèi)似一個(gè)大嘴巴。閉合時(shí)就是一個(gè)圓形。嘴若是接受方向消息時(shí),方向消息與當(dāng)前方向不一致,則嘴在轉(zhuǎn)向過(guò)后保持開(kāi)的狀態(tài)。當(dāng)所有豆子被吃完后,彈出對(duì)對(duì)話框顯示:“You win,Exit?”,用戶寫(xiě)確定后可退</p><p><b> 背景畫(huà)法實(shí)
18、現(xiàn)</b></p><p> 先實(shí)現(xiàn)畫(huà)一條線段的函數(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> 再畫(huà)橫向和縱向的各從1到length+1和width+1的線段,從而實(shí)現(xiàn)畫(huà)背景網(wǎng)絡(luò):</p>
20、;<p><b> 豆子畫(huà)法實(shí)現(xiàn)</b></p><p><b> 嘴張開(kāi)實(shí)現(xiàn)</b></p><p> 嘴張開(kāi)有四個(gè)方向,要實(shí)現(xiàn)可以使用CDC類(lèi)的Pie函數(shù)畫(huà)一個(gè)張開(kāi)角度為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)/*查 看 當(dāng) 前 嘴 的 方 向 */</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> 畫(huà)嘴巴的實(shí)現(xiàn)</b></p><p> 畫(huà)嘴巴的關(guān)閉可以用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> 畫(huà)豆子的實(shí)現(xiàn)</b></p><p><b> 畫(huà)一個(gè)豆子的實(shí)現(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> 畫(huà)所有豆子:</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> 算法描述:當(dāng)標(biāo)記數(shù)組的(I,j)元素為非零值時(shí),調(diào)用畫(huà)一個(gè)豆子的函數(shù)Draw_One_Bean畫(huà)坐標(biāo)(i,j)處的豆子。</p><p><b> 核心算法:</b></p><p> 將嘴的當(dāng)前方向聲明為數(shù)據(jù)成員,再聲明一個(gè)方向消息,響應(yīng)方向鍵的函數(shù)只負(fù)責(zé)修改當(dāng)
33、前方向,若是方向鍵響應(yīng)函數(shù)則將消息方向賦值為該方向鍵對(duì)應(yīng)方向,如下:</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> 若是處理定時(shí)器消息,即處理每隔一段時(shí)間嘴向前一次時(shí),不用改當(dāng)前方向,因?yàn)榉较驔](méi)有發(fā)生變化,只是調(diào)用dispose根據(jù)當(dāng)前方向的值處理消息: </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中判斷消息方向是否是當(dāng)前方向,若是,將方向消息轉(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> 若將嘴可能的下一位置用該位移和當(dāng)前坐標(biāo)賦值:</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> 判斷該下一點(diǎn)位置是否越界:</p><p> if (pre_position.x >= 1 && pre_position.x <= length&&<
44、;/p><p> pre_position.y >= 1 && pre_position.y <= width)</p><p> 是則判斷下一點(diǎn)是否有豆子, </p><p> if(Beans_Array[pre_position.x][pre_position.y]==1) </p><p><b
45、> nbeans--;</b></p><p> 將下一點(diǎn)的豆子所在標(biāo)記數(shù)組元素標(biāo)記置零, </p><p> Beans_Array[pre_position.x][pre_position.y] = 0; </p><p> 設(shè)置下一點(diǎn)到達(dá)區(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> 再設(shè)置嘴位置為下
47、一點(diǎn)預(yù)到達(dá)位置(因確定不越界):</p><p> Mouth_Position = pre_position; </p><p> 當(dāng)方向消息不是當(dāng)前消息就僅改變嘴方向,并令嘴一直開(kāi)著,這樣使得嘴轉(zhuǎn)向后不會(huì)由開(kāi)變成關(guā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> 再將嘴顯示出來(lái). </b>&
49、lt;/p><p> Draw_Mouth();</p><p> 最后判斷豆子個(gè)數(shù)是否為零,是則殺死計(jì)時(shí)器,顯示對(duì)話框提示。</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測(cè)試的研究與選擇</p><p> 測(cè)試過(guò)程中要判斷測(cè)試是否成功,要分析程序界面的變化和計(jì)算數(shù)據(jù)的結(jié)果是否正確以及各功能
51、鍵是否能正常使用。</p><p><b> 5.2 測(cè)試環(huán)境</b></p><p><b> 測(cè)試環(huán)境如下: </b></p><p> 測(cè)試系統(tǒng): Windows 8.1</p><p> 測(cè)試工具: Visual Studio 2010 </p><p>
52、 5.3 實(shí)例測(cè)試結(jié)果</p><p> 2010如圖,改宏定義</p><p> 將長(zhǎng)寬分別認(rèn)置為8,5,運(yùn)行</p><p><b> 如圖</b></p><p> 嘴方向?yàn)橄蛏?,按向下鍵,得</p><p> 不按鍵盤(pán),則嘴也一直前進(jìn)</p><p>
53、如上圖,嘴自動(dòng)前進(jìn)時(shí)一直在所示位置一張一合,說(shuō)明數(shù)組沒(méi)有越界。</p><p> 此時(shí)按鍵盤(pán)向右鍵,豆子轉(zhuǎn)向右,轉(zhuǎn)向功能實(shí)現(xiàn):</p><p><b> 吃豆子如下:</b></p><p><b> 吃完豆子如下:</b></p><p> 參考文獻(xiàn)(單獨(dú)一頁(yè))</p>&l
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- c++課程設(shè)計(jì)-教學(xué)游戲
- c++課程設(shè)計(jì)--c++程序設(shè)計(jì)語(yǔ)言
- c++課程設(shè)計(jì)拼圖游戲
- c++課程設(shè)計(jì)-- c++面向?qū)ο蟪绦蛟O(shè)計(jì)
- c++課程設(shè)計(jì)報(bào)告---猴子吃桃問(wèn)題
- c++課程設(shè)計(jì)報(bào)告--坦克游戲
- c++課程設(shè)計(jì)報(bào)告--猜數(shù)游戲
- 吃豆子游戲.zip
- c++剪刀石頭布游戲課程設(shè)計(jì)
- c++剪刀石頭布游戲課程設(shè)計(jì)
- 猜單詞游戲c++課程設(shè)計(jì)報(bào)告
- c++程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 《c++程序設(shè)計(jì)課程設(shè)計(jì)——復(fù)數(shù)類(lèi)》
- 《c++語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告
- 《程序設(shè)計(jì)語(yǔ)言(c++)》課程設(shè)計(jì)
- c++課程設(shè)計(jì)--設(shè)計(jì)菜單選擇程序
- c++猜單詞課程設(shè)計(jì)--——猜單詞游戲
- 基于c++的教師排課程序課程設(shè)計(jì)
- c程序課程設(shè)計(jì)報(bào)告(掃雷游戲)
- 銀行活期儲(chǔ)蓄程序課程設(shè)計(jì)c++
評(píng)論
0/150
提交評(píng)論