版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> C++面向?qū)ο笳n程設(shè)計(jì)報(bào)告</p><p> 院(系): 計(jì)算機(jī)工程學(xué)院 </p><p> 專業(yè): </p><p> 學(xué)生姓名: </p><p> 班級(jí):______
2、_ 學(xué)號(hào):201007206 </p><p> 題目: 俄羅斯方塊 </p><p> 起迄日期: _2012.6.18~2012.6.29 </p><p> 設(shè)計(jì)地點(diǎn): 計(jì)算機(jī)學(xué)院機(jī)房 </p><p> 指 導(dǎo) 教
3、 師: </p><p> 完成日期: 2012 年6月 29 日</p><p><b> 目 錄</b></p><p> 一、需求分析…………………………………………………………. 3</p><p> 1.課程設(shè)計(jì)內(nèi)容………………………………………
4、…………….3</p><p> 2.程序?qū)崿F(xiàn)功能…………………………………………………….3</p><p> 二、設(shè)計(jì)內(nèi)容………………………………………………………….3</p><p> 1俄羅斯方塊主功能框架圖………………………………………4</p><p> 2. 主函數(shù)及各功能模塊流程圖………………………………..…4&l
5、t;/p><p> 三、調(diào)試分析……………………………………………………….....26</p><p> 1.實(shí)際完成情況…………………………………………………....27</p><p> 2.上機(jī)過(guò)程中出現(xiàn)的問(wèn)題及其解決方案 ………………………..27</p><p> 3.程序中可以改進(jìn)、擴(kuò)充的功能及設(shè)計(jì)實(shí)現(xiàn)構(gòu)想……………..27
6、</p><p> 四、用戶手冊(cè)…………………………………………………………..27</p><p> 五、設(shè)計(jì)總結(jié)……… ………… ……… ………… … ………………31</p><p> 六、參考文獻(xiàn)………………………… ………………………………32</p><p> 七、附錄………………………………… ……………………………32
7、</p><p><b> 一、需求分析</b></p><p><b> 1. 課程設(shè)計(jì)目的</b></p><p> 俄羅斯方塊是由阿列謝.帕基特諾發(fā)明的,Tetris游戲在一個(gè)m*n 的矩形形框內(nèi)進(jìn)行的,矩形框的頂部會(huì)隨機(jī)的出現(xiàn)一個(gè)有四個(gè)小方塊組成的磚塊,每過(guò)一段時(shí)間,就會(huì)下落一格,知道他碰到底部,然后再過(guò)一個(gè)
8、時(shí)間下落另一個(gè)磚塊,依次進(jìn)行,磚塊是隨機(jī)出現(xiàn)的。當(dāng)發(fā)現(xiàn)底部磚塊是滿的話,則消去它從而得到相應(yīng)設(shè)置的分?jǐn)?shù),當(dāng)磚塊到達(dá)頂部的時(shí)候,游戲結(jié)束。選擇俄羅斯方塊進(jìn)行C++面向?qū)ο蟪绦蛟O(shè)計(jì)課程設(shè)計(jì)主要是在學(xué)習(xí)C++這門(mén)面向?qū)ο笳Z(yǔ)言的基礎(chǔ)上,在完成C++面向?qū)ο蟪绦蛟O(shè)計(jì)各部分實(shí)驗(yàn)的基礎(chǔ)上,通過(guò)自學(xué)MFC,掌握一種可視化編程的方法,并通過(guò)實(shí)踐加深對(duì)可視化編程與C++面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言特點(diǎn)的認(rèn)識(shí)與理解。同時(shí),可以提高運(yùn)用C++編程語(yǔ)言解決實(shí)際問(wèn)題的能力
9、;鍛煉實(shí)際的編程能力、創(chuàng)新能力及團(tuán)隊(duì)組織、協(xié)作開(kāi)發(fā)軟件的能力;還能提高調(diào)查研究、查閱技術(shù)文獻(xiàn)、資料以及編寫(xiě)軟件設(shè)計(jì)文檔的能力。</p><p><b> 程序?qū)崿F(xiàn)的功能</b></p><p> 實(shí)現(xiàn)方塊的變形、下落、左移、右移消行等基本的功能。</p><p> 實(shí)現(xiàn)方塊的直接丟下、暫停、判斷分?jǐn)?shù)以及等級(jí)設(shè)置功能。</p>
10、<p> 友好的地用戶界面,七種基本的方塊圖形設(shè)計(jì)功能。</p><p> 設(shè)置快捷鍵實(shí)現(xiàn)游戲的暫停和播放音樂(lè)功能。</p><p><b> 二、設(shè)計(jì)內(nèi)容</b></p><p> 1.俄羅斯方塊主功能框架圖</p><p> 2.主函數(shù)及各功能模塊流程圖</p><p>
11、<b> 【1】主程序流程圖</b></p><p> 【2】主程序函數(shù)調(diào)用圖</p><p> 【3】鍵盤(pán)響應(yīng)方塊移動(dòng)及操作模塊算法流程圖</p><p><b> 代碼實(shí)現(xiàn)部分:</b></p><p> void CTetrisView::OnKeyDown(UINT nChar,
12、UINT nRepCnt, UINT nFlags) </p><p><b> {</b></p><p><b> //沒(méi)有開(kāi)始</b></p><p> if(!m_bStart)</p><p><b> return;</b></p><p
13、> if(m_bPause==TRUE)</p><p><b> return;</b></p><p> switch(nChar)</p><p><b> {</b></p><p> case VK_LEFT:</p><p> russia.Mo
14、ve(KEY_LEFT);</p><p><b> break;</b></p><p> case VK_RIGHT:</p><p> russia.Move(KEY_RIGHT);</p><p><b> break;</b></p><p> cas
15、e VK_UP:</p><p> russia.Move(KEY_UP);</p><p><b> break;</b></p><p> case VK_DOWN:</p><p> russia.Move(KEY_DOWN);</p><p><b> break;&l
16、t;/b></p><p><b> }</b></p><p><b> //重畫(huà)</b></p><p> CDC* pDC=GetDC();</p><p> russia.DrawBK(pDC);</p><p> ReleaseDC(pDC);<
17、;/p><p> CView::OnKeyDown(nChar, nRepCnt, nFlags);</p><p><b> } </b></p><p> void CRussia::Move(int direction) //移動(dòng)方塊</p><p><b> {</b></p>
18、;<p> if(end) return;</p><p> switch(direction)</p><p><b> {</b></p><p><b> //左</b></p><p> case KEY_LEFT:</p><p> if(
19、Meet(Now,KEY_LEFT,NowPosition)) break;</p><p> NowPosition.y--;</p><p><b> break;</b></p><p><b> //右</b></p><p> case KEY_RIGHT:</p>
20、<p> if(Meet(Now,KEY_RIGHT,NowPosition)) break;</p><p> NowPosition.y++;</p><p><b> break;</b></p><p><b> //下</b></p><p> case KEY_DOW
21、N:</p><p> if(Meet(Now,KEY_DOWN,NowPosition))</p><p><b> {</b></p><p> LineDelete();</p><p><b> break;</b></p><p><b>
22、 }</b></p><p> NowPosition.x++;</p><p><b> break;</b></p><p><b> //上</b></p><p> case KEY_UP:</p><p> Meet(Now,KEY_UP,No
23、wPosition);</p><p><b> break;</b></p><p><b> default:</b></p><p><b> break;</b></p><p><b> }</b></p><p>
24、;<b> }</b></p><p><b> //方塊旋轉(zhuǎn)</b></p><p> //////////////////////////////////////////////////////////////////////////</p><p> bool CRussia::Change(int a[][
25、4],CPoint p,int b[][100])</p><p><b> {</b></p><p> int tmp[4][4];</p><p><b> int i,j;</b></p><p> int k=4,l=4;</p><p> for(i=
26、0;i<4;i++)</p><p><b> {</b></p><p> for(j=0;j<4;j++)</p><p><b> {</b></p><p> tmp[i][j]=a[j][3-i];</p><p> After[i][j]=0
27、;//存放變換后的方塊矩陣</p><p><b> }</b></p><p><b> }</b></p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> for(j=0;j<
28、;4;j++)</p><p><b> {</b></p><p> if(tmp[i][j]==1)</p><p><b> {</b></p><p> if(k>i) k=i;</p><p> if(l>j) l=j;</p>
29、<p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> for(i=k;i<4;i++)</p><p><b> {</b></p><p&
30、gt; for(j=l;j<4;j++)</p><p><b> {</b></p><p> After[i-k][j-l]=tmp[i][j];</p><p> }//把變換后的矩陣移到左上角</p><p><b> }</b></p><p>
31、 //判斷是否接觸,是:返回失敗</p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> for(j=0;j<4;j++)</p><p><b> {</b></p><p> if(After[i
32、][j]==0)</p><p><b> {</b></p><p><b> continue;</b></p><p><b> }</b></p><p> if(((p.x+i)>=m_RowCount)||((p.y+j)<0)||((p.y+j
33、)>=m_ColCount))</p><p><b> {</b></p><p> return false;</p><p><b> }</b></p><p> if(b[p.x+i][p.y+j]==1)</p><p><b> {&l
34、t;/b></p><p> return false;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> return true;</p>
35、<p><b> }</b></p><p> bool CRussia::Meet(int a[][4],int direction,CPoint p) //判碰撞,遇到了邊界或者有其他方塊檔住</p><p><b> {</b></p><p><b> int i,j;</b>
36、;</p><p> //先把原位置清0 </p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> for(j=0;j<4;j++)</p><p><b> {</b></p><
37、p> if(a[i][j]==1)</p><p> {Russia[p.x+i][p.y+j]=0;}</p><p><b> }</b></p><p><b> }</b></p><p> for(i=0;i<4;i++)</p><p>&l
38、t;b> {</b></p><p> for(j=0;j<4;j++)</p><p><b> {</b></p><p> if(a[i][j]==1)</p><p><b> {</b></p><p> switch(direc
39、tion)</p><p><b> {</b></p><p> case 1://左移</p><p> if((p.y+j-1)<0) goto exit;</p><p> if(Russia[p.x+i][p.y+j-1]==1) goto exit;</p><p>&
40、lt;b> break;</b></p><p> case 2://右移</p><p> if((p.y+j+1)>=m_ColCount) goto exit;</p><p> if(Russia[p.x+i][p.y+j+1]==1) goto exit;</p><p><b> bre
41、ak;</b></p><p> case 3://下移</p><p> if((p.x+i+1)>=m_RowCount) goto exit;</p><p> if(Russia[p.x+i+1][p.y+j]==1) goto exit;</p><p><b> break;</b>
42、</p><p> case 4://變換</p><p> if(!Change(a,p,Russia)) goto exit;</p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> for(j=0;j<4;j+
43、+)</p><p><b> {</b></p><p> Now[i][j]=After[i][j];</p><p> a[i][j]=Now[i][j];</p><p><b> }</b></p><p><b> }</b><
44、;/p><p> return false;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
45、<p><b> }</b></p><p><b> int x,y;</b></p><p><b> x=p.x;</b></p><p><b> y=p.y;</b></p><p> //移動(dòng)位置,重新給數(shù)組賦值<
46、/p><p> switch(direction)</p><p><b> {</b></p><p><b> case 1:</b></p><p> y--;break;</p><p><b> case 2:</b></p>
47、<p> y++;break;</p><p><b> case 3:</b></p><p> x++;break;</p><p><b> case 4:</b></p><p><b> break;</b></p><p&
48、gt;<b> }</b></p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> for(j=0;j<4;j++)</p><p><b> {</b></p><p> if
49、(a[i][j]==1)</p><p><b> {</b></p><p> Russia[x+i][y+j]=1;</p><p><b> }</b></p><p><b> }</b></p><p><b> }<
50、/b></p><p> return false;</p><p><b> exit:</b></p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> for(j=0;j<4;j++)<
51、/p><p><b> {</b></p><p> if(a[i][j]==1)</p><p><b> {</b></p><p> Russia[p.x+i][p.y+j]=1;</p><p><b> }</b></p>
52、<p><b> }</b></p><p><b> }</b></p><p> return true;</p><p><b> }</b></p><p> 【4】等級(jí)管理功能模塊流程圖</p><p><b>
53、 代碼實(shí)現(xiàn)部分:</b></p><p> void CRule::SetLevel(int nLevel)</p><p><b> {</b></p><p> m_nLevel = nLevel;</p><p><b> }</b></p><p&g
54、t; int CRule::UpLevel(int nLine)</p><p><b> {</b></p><p> m_nLevel=nLine/30;</p><p> return m_nLevel;</p><p><b> }</b></p><p>
55、 CLevelDlg::CLevelDlg(CWnd* pParent /*=NULL*/)</p><p> : CDialog(CLevelDlg::IDD, pParent)</p><p><b> {</b></p><p> //{{AFX_DATA_INIT(CLevelDlg)</p><p>
56、 m_level = 0;</p><p> //}}AFX_DATA_INIT</p><p><b> }</b></p><p> void CLevelDlg::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p&g
57、t;<p> CDialog::DoDataExchange(pDX);</p><p> //{{AFX_DATA_MAP(CLevelDlg)</p><p> DDX_Text(pDX, IDC_LEVEL_EDIT, m_level);//將變量和控件映射</p><p> DDV_MinMaxInt(pDX, m_level, 1,
58、10);//設(shè)置等級(jí)最大值最小值</p><p> //}}AFX_DATA_MAP</p><p><b> }</b></p><p> // CLevelDlg message handlers</p><p> void CLevelDlg::OnOK() </p><p><
59、;b> {</b></p><p> if(UpdateData(TRUE))</p><p><b> {</b></p><p> CString tmp;</p><p> tmp.Format("%d", m_level);</p><p>
60、; WritePrivateProfileString("SETUP", "level", tmp, ".\\setup.ini");</p><p> CDialog::OnOK();</p><p><b> }</b></p><p><b> }</b&
61、gt;</p><p> void CLevelDlg::OnOK() //確定</p><p><b> {</b></p><p> if(UpdateData(TRUE))</p><p><b> {</b></p><p> CString tmp;&l
62、t;/p><p> tmp.Format("%d", m_level);</p><p> WritePrivateProfileString("SETUP", "level", tmp, ".\\setup.ini");</p><p> CDialog::OnOK();</p
63、><p><b> }</b></p><p><b> }</b></p><p> void CLevelDlg::OnCancel() //取消</p><p><b> {</b></p><p> CDialog::OnCancel();
64、</p><p><b> }</b></p><p> BOOL CLevelDlg::OnInitDialog() </p><p><b> {</b></p><p> CDialog::OnInitDialog();</p><p> char pszTm
65、p[128] = {0};</p><p> GetPrivateProfileString("SETUP", "level", "0", </p><p> pszTmp, 127, ".\\setup.ini");//取出保存的等級(jí)記錄</p><p> m_level = a
66、toi(pszTmp);</p><p> UpdateData(FALSE);</p><p> return TRUE; }</p><p> void CRussia::LineDelete()</p><p><b> {</b></p><p> int m=0;//本次
67、共消去的行數(shù)</p><p> bool flag=0;</p><p> for(int i=0;i<m_RowCount;i++)</p><p><b> {</b></p><p><b> //檢查要不要消行</b></p><p> flag=tr
68、ue;</p><p> for(int j=0;j<m_ColCount;j++)</p><p><b> {</b></p><p> if(Russia[i][j]==0)</p><p><b> {</b></p><p> flag=false;
69、</p><p><b> }</b></p><p><b> }</b></p><p><b> //如果要</b></p><p> if(flag==true)</p><p><b> {</b></p&
70、gt;<p><b> m++;</b></p><p> for(int k=i;k>0;k--)</p><p><b> {</b></p><p><b> //上行給下行</b></p><p> for(int l=0;l<m_C
71、olCount;l++)</p><p><b> {</b></p><p> Russia[k][l]=Russia[k-1][l];</p><p><b> }</b></p><p><b> }</b></p><p><b&g
72、t; //第一行為零</b></p><p> for(int l=0;l<m_ColCount;l++)</p><p><b> {</b></p><p> Russia[0][l]=0;</p><p><b> }</b></p><p>
73、;<b> }</b></p><p><b> }</b></p><p> DrawWill();</p><p><b> //加分</b></p><p><b> switch(m)</b></p><p>&l
74、t;b> {</b></p><p><b> case 1:</b></p><p> m_Score= m_Score + 10 + m_Level * 10;</p><p><b> break;</b></p><p><b> case 2:<
75、/b></p><p> m_Score= m_Score + 30 + m_Level * 10;</p><p><b> break;</b></p><p><b> case 3:</b></p><p> m_Score= m_Score + 50 + m_Level *
76、10;</p><p><b> break;</b></p><p><b> case 4:</b></p><p> m_Score= m_Score + 100 + m_Level * 10;</p><p><b> break;</b></p>
77、<p><b> default:</b></p><p><b> break;</b></p><p><b> }</b></p><p> m_CountLine+=m;</p><p> m_Level = rule.UpLevel(m_Coun
78、tLine)+m_Level;</p><p> end = rule.Win(Now, Russia, NowPosition);//速度</p><p> m_Speed=320 - m_Level * 20;</p><p><b> if(end)</b></p><p><b> {</
79、b></p><p> AfxMessageBox("游戲結(jié)束!");</p><p><b> }</b></p><p><b> }</b></p><p><b> 主界面顯示功能模塊</b></p><p>&
80、lt;b> 代碼實(shí)現(xiàn)部分:</b></p><p> void CTetrisView::OnDraw(CDC* pDC)</p><p><b> {</b></p><p> CTetrisDoc* pDoc = GetDocument();</p><p> ASSERT_VALID(p
81、Doc);</p><p><b> CDC Dc;</b></p><p> if(Dc.CreateCompatibleDC(pDC)==FALSE)</p><p> AfxMessageBox("Can't create DC");</p><p> //沒(méi)有開(kāi)始,顯示封面&l
82、t;/p><p> if( !(m_bStart))</p><p><b> {</b></p><p> Dc.SelectObject(fengmian);</p><p> pDC->BitBlt(0,0,500,550,&Dc,0,0,SRCCOPY);</p><p>
83、;<b> }</b></p><p><b> else</b></p><p> russia.DrawBK(pDC);</p><p><b> }</b></p><p> void CTetrisView::OnTimer(UINT nIDEvent) //
84、設(shè)置時(shí)間函數(shù)讓方塊自動(dòng)按時(shí)</p><p><b> 移動(dòng)</b></p><p><b> {</b></p><p> russia.Move(KEY_DOWN);</p><p> russia.DrawBK(GetDC());</p><p> CView:
85、:OnTimer(nIDEvent);</p><p><b> }</b></p><p><b> //繪游戲界面</b></p><p> //////////////////////////////////////////////////////////////////////////</p>
86、<p> void CRussia::DrawBK(CDC*pDC)</p><p><b> {</b></p><p><b> CDC Dc;</b></p><p> if(Dc.CreateCompatibleDC(pDC)==FALSE)</p><p><b&g
87、t; {</b></p><p> AfxMessageBox("Can't create DC");</p><p><b> }</b></p><p><b> //畫(huà)背景</b></p><p> Dc.SelectObject(bkMap)
88、;</p><p> pDC->BitBlt(0,0,540,550,&Dc,0,0,SRCCOPY);</p><p> //畫(huà)分?jǐn)?shù),速度,難度</p><p> DrawScore(pDC);</p><p> //如果有方塊,顯示方塊</p><p><b> //游戲區(qū)<
89、/b></p><p> for(int i=0;i<m_RowCount;i++)</p><p><b> {</b></p><p> for(int j=0;j<m_ColCount;j++)</p><p><b> {</b></p><p&
90、gt; if(Russia[i][j]==1)</p><p><b> {</b></p><p> Dc.SelectObject(fkMap);</p><p> pDC->BitBlt(j*30,i*30,100,100,&Dc,0,0,SRCCOPY);</p><p><b>
91、 }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> //預(yù)先圖形</b></p><p> for(int n=0;n<4;n++)</p><p><b&
92、gt; {</b></p><p> for(int m=0;m<4;m++)</p><p><b> {</b></p><p> if(Will[n][m]==1)</p><p><b> {</b></p><p> Dc.Selec
93、tObject(fkMap);</p><p> pDC->BitBlt(400+m*30,100+n*30,30,30,&Dc,0,0,SRCCOPY);</p><p><b> }</b></p><p><b> }</b></p><p><b> }<
94、;/b></p><p><b> }</b></p><p><b> //繪分?jǐn)?shù)和等級(jí)</b></p><p> //////////////////////////////////////////////////////////////////////////</p><p>
95、void CRussia::DrawScore(CDC*pDC)</p><p><b> {</b></p><p> int nOldDC=pDC->SaveDC();</p><p><b> //設(shè)置字體</b></p><p> CFont font; </p&
96、gt;<p> if(0==font.CreatePointFont(200,"Comic Sans MS"))</p><p><b> {</b></p><p> AfxMessageBox("Can't Create Font");</p><p><b>
97、 }</b></p><p> pDC->SelectObject(&font);</p><p> //設(shè)置字體顏色及其背景顏色</p><p> CString str;</p><p> CString a("下一個(gè)方塊:");</p><p> pDC-&
98、gt;SetTextColor(RGB(0,255,0));</p><p> pDC->SetBkColor(RGB(255,255,255));</p><p><b> //輸出數(shù)字</b></p><p> str.Format("等級(jí):%d",m_Level);</p><p>
99、 if(m_Level>=0)</p><p> pDC->TextOut(400,275,str);</p><p> /*str.Format("行數(shù):%d",m_CountLine);</p><p> if(m_Speed>=0)</p><p> pDC->TextOut(4
100、10,325,str);*/</p><p> str.Format("總分:%d",m_Score);</p><p> if(m_Score>=0)</p><p> pDC->TextOut(400,325,str);</p><p> str.Format("%s",a);
101、</p><p> pDC->TextOut(370,25,str);</p><p> pDC->RestoreDC(nOldDC);</p><p><b> }</b></p><p> 【6】游戲規(guī)則判斷功能模塊</p><p><b> 代碼實(shí)現(xiàn)部分:&l
102、t;/b></p><p> CRule::CRule()</p><p><b> {</b></p><p><b> }</b></p><p> CRule::~CRule()</p><p><b> {</b></p&g
103、t;<p><b> }</b></p><p> void CRule::SetLevel(int nLevel)</p><p><b> {</b></p><p> m_nLevel = nLevel;</p><p><b> }//設(shè)置等級(jí)</b&
104、gt;</p><p> int CRule::UpLevel(int nLine)</p><p><b> {</b></p><p> m_nLevel=nLine/30;</p><p> return m_nLevel;</p><p> }//游戲每一次消30行升一級(jí)<
105、/p><p> bool CRule::Win(int Now[4][4], int Russia [100][100], CPoint NowPosition)</p><p><b> {</b></p><p> if(m_nLevel == 11)</p><p><b> {</b>&
106、lt;/p><p> return true;</p><p><b> }</b></p><p> for(int i=0;i<4;i++)</p><p><b> {</b></p><p> for(int j=0;j<4;j++)</p&g
107、t;<p><b> {</b></p><p> if(Now[i][j]==1)</p><p><b> {</b></p><p> if(Russia[i+NowPosition.x][j+NowPosition.y]==1)</p><p><b> {
108、</b></p><p> return true;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b><
109、;/p><p> return false;</p><p> }/判斷是否結(jié)束游戲</p><p> //////////////////////////////////////////////////////////////////////////</p><p><b> //行消除函數(shù)</b></p&g
110、t;<p> //////////////////////////////////////////////////////////////////////////</p><p> void CRussia::LineDelete()</p><p><b> {</b></p><p> int m=0;//本次共消
111、去的行數(shù)</p><p> bool flag=0;</p><p> for(int i=0;i<m_RowCount;i++)</p><p><b> {</b></p><p><b> //檢查要不要消行</b></p><p> flag=true
112、;</p><p> for(int j=0;j<m_ColCount;j++)</p><p><b> {</b></p><p> if(Russia[i][j]==0)</p><p><b> {</b></p><p> flag=false;&l
113、t;/p><p><b> }</b></p><p><b> }</b></p><p><b> //如果要</b></p><p> if(flag==true)</p><p><b> {</b></p>
114、;<p><b> m++;</b></p><p> for(int k=i;k>0;k--)</p><p><b> {</b></p><p><b> //上行給下行</b></p><p> for(int l=0;l<m_Col
115、Count;l++)</p><p><b> {</b></p><p> Russia[k][l]=Russia[k-1][l];</p><p><b> }</b></p><p><b> }</b></p><p><b>
116、 //第一行為零</b></p><p> for(int l=0;l<m_ColCount;l++)</p><p><b> {</b></p><p> Russia[0][l]=0;</p><p><b> }</b></p><p>&
117、lt;b> }</b></p><p><b> }</b></p><p> DrawWill();</p><p><b> //加分</b></p><p><b> switch(m)</b></p><p><
118、b> {</b></p><p><b> case 1:</b></p><p> m_Score= m_Score + 10 + m_Level * 10;</p><p><b> break;</b></p><p><b> case 2:</b
119、></p><p> m_Score= m_Score + 30 + m_Level * 10;</p><p><b> break;</b></p><p><b> case 3:</b></p><p> m_Score= m_Score + 50 + m_Level * 10
120、;</p><p><b> break;</b></p><p><b> case 4:</b></p><p> m_Score= m_Score + 100 + m_Level * 10;</p><p><b> break;</b></p>&
121、lt;p><b> default:</b></p><p><b> break;</b></p><p><b> }</b></p><p> m_CountLine+=m;</p><p> m_Level = rule.UpLevel(m_CountL
122、ine)+m_Level;</p><p> end = rule.Win(Now, Russia, NowPosition);</p><p><b> //速度</b></p><p> m_Speed=320 - m_Level * 20;</p><p><b> if(end)</b&g
123、t;</p><p><b> {</b></p><p> AfxMessageBox("游戲結(jié)束!");</p><p><b> }</b></p><p><b> }</b></p><p> 【7】播放音樂(lè)功能模
124、塊</p><p><b> 代碼實(shí)現(xiàn)部分:</b></p><p> ON_COMMAND(IDR_PLAY_MUSIC, OnPlayMusic)添加消息映射</p><p> afx_msg void OnPlayMusic();聲明消息應(yīng)設(shè)函數(shù)</p><p> void CTetrisView::OnP
125、layMusic() </p><p><b> {</b></p><p> CWnd* pMain = AfxGetMainWnd(); </p><p> CMenu* pMenu = pMain->GetMenu();</p><p> //判斷播放音樂(lè)菜單當(dāng)前狀態(tài)<
126、;/p><p> BOOL bCheck = (BOOL)pMenu->GetMenuState(IDR_PLAY_MUSIC, MF_CHECKED);</p><p> if(m_bStart)</p><p><b> {</b></p><p> if(bCheck)</p><p&
127、gt;<b> {</b></p><p> pMenu->CheckMenuItem(IDR_PLAY_MUSIC, MF_BYCOMMAND | MF_UNCHECKED);</p><p><b> }</b></p><p><b> else</b></p>&l
128、t;p><b> {</b></p><p> pMenu->CheckMenuItem(IDR_PLAY_MUSIC, MF_BYCOMMAND | MF_CHECKED);</p><p><b> }</b></p><p> PlayBackMusic(!bCheck);//調(diào)用播放背景音
129、樂(lè)功能函數(shù)</p><p><b> }</b></p><p><b> }</b></p><p> void CTetrisView::PlayBackMusic(BOOL bCheck)</p><p><b> {</b></p><p&g
130、t;<b> //指定文件并播放</b></p><p> if(bCheck)</p><p> {//播放音樂(lè)</p><p> sndPlaySound("music.wav",SND_ASYNC); </p><p><b> }</b><
131、/p><p><b> else</b></p><p> {//停止播放</p><p> sndPlaySound(NULL,SND_PURGE); </p><p><b> }</b></p><p><b> }</b>&
132、lt;/p><p><b> 三、調(diào)試分析</b></p><p><b> 1.實(shí)際完成情況</b></p><p><b> 【1】數(shù)據(jù)類型說(shuō)明</b></p><p> 此程序中用到的數(shù)據(jù)結(jié)構(gòu)主要是二維數(shù)組。如:</p><p> int R
133、ussia[100][100];//游戲數(shù)組,用于存放整個(gè)界面的方塊</p><p> int Now[4][4];// 當(dāng)前圖形,用于存放當(dāng)前產(chǎn)生的方塊</p><p> int Will[4][4];//上一圖形,用于存放上一次產(chǎn)生的方塊</p><p><b> 【2】功能說(shuō)明</b></p><p>
134、 俄羅斯方塊能實(shí)現(xiàn)游戲方塊的變形、下落、左移、右移消行基本功能,當(dāng)方塊落滿一行時(shí),需要消除這一行。而且需要在界面上顯示出游戲的級(jí)別以及要不斷刷新的分?jǐn)?shù)。在方塊的移動(dòng)過(guò)程當(dāng)中,要不斷地刷洗界面同時(shí)判斷方塊下一個(gè)位置有沒(méi)有方塊或者墻壁存在。當(dāng)游戲結(jié)束時(shí),有兩種結(jié)果。一種是玩家失敗方塊落到頂部,另外一種是超過(guò)最大等級(jí)10級(jí),也就是是通關(guān)了。游戲的等級(jí)設(shè)置分為(1—10十種等級(jí),當(dāng)點(diǎn)擊菜單中的響應(yīng)選項(xiàng)時(shí),彈出對(duì)話框,輸入后你想玩的級(jí)別要對(duì)游戲有
135、相應(yīng)的改變。除此之外額外添加了背景音樂(lè)和快捷鍵功能使游戲更加完善。</p><p> 2.上機(jī)過(guò)程中出現(xiàn)的問(wèn)題及其解決方案</p><p> 首先是如何使用vc中的MFC問(wèn)題,一個(gè)完全陌生的平臺(tái)讓我不知所措,后來(lái)通過(guò)閱讀老師推薦的聞怡洋的MFC快速入門(mén),以及觀看孫鑫的視頻對(duì)MFC有了初步的認(rèn)識(shí),從而逐步靜下心來(lái)開(kāi)始編寫(xiě)成素。</p><p> 接著就是游戲的算
136、法問(wèn)題,如何變換,如何消行,如何檢測(cè)是否碰到墻壁壁,開(kāi)始的時(shí)候都是很茫然,后來(lái)通過(guò)查閱網(wǎng)上的算法。知道變換時(shí)可以通過(guò)一個(gè)tmp[]數(shù)組臨時(shí)存儲(chǔ)方塊,判斷是否碰到碰壁可以借助一個(gè)After[]數(shù)組便可以輕松解決。</p><p> 最后程序運(yùn)行時(shí)卻發(fā)現(xiàn)方塊不是按縱坐標(biāo)而是按橫坐標(biāo)移動(dòng),但卻始終找不到問(wèn)題的癥結(jié),從頭上下檢查了幾遍,終于發(fā)現(xiàn),原來(lái)是畫(huà)方塊的DrawBK(CDC*pDC)函數(shù)中的橫縱坐標(biāo)搞翻,修改后程
137、序運(yùn)行成功。</p><p> 3.程序中可以改進(jìn)、擴(kuò)充的功能及設(shè)計(jì)實(shí)現(xiàn)構(gòu)想</p><p> 隨著級(jí)別的上升,我只是讓速度發(fā)生了改變,其實(shí)還可以通過(guò)改變游戲界面行數(shù)和列數(shù)還有增加方塊的樣式來(lái)提升游戲難度。添加英雄榜同樣可以吸引玩家的興趣,另外我在設(shè)計(jì)的時(shí)候沒(méi)有考慮到幫助模塊,希望在以后的編程中改進(jìn)。游戲的界面非常簡(jiǎn)單,我使用了加載位圖的方法,其實(shí)還可以使用一些畫(huà)圖函數(shù)使界面更加漂亮,
138、只是由于自己掌握的知識(shí)太過(guò)貧乏,沒(méi)辦法在短時(shí)間內(nèi)設(shè)計(jì)出一個(gè)漂亮的界面,在課程設(shè)計(jì)之后希望能多補(bǔ)充一些知識(shí)設(shè)計(jì)出一個(gè)美觀而又完善的界面。</p><p><b> 四、用戶手冊(cè)</b></p><p> 1.使用平臺(tái):Microsoft VisualC++6.0</p><p> 2.需要安裝。將下載的壓縮包解壓出來(lái),然后在解壓出來(lái)的文件中
139、點(diǎn)擊setup.exe;這需要很長(zhǎng)的時(shí)間。</p><p><b> 3.操作步驟:</b></p><p> 1.選擇Teris\Debug文件夾下的Teris.exe,單擊運(yùn)行程序。</p><p><b> 2.啟動(dòng)畫(huà)面。</b></p><p> 選擇“游戲”“開(kāi)始游戲”,便可開(kāi)始游
140、戲,如下圖;</p><p> 選擇“選項(xiàng)”“級(jí)別”,便會(huì)彈出級(jí)聯(lián)對(duì)話框。玩家可以在1-10級(jí)”中選擇一個(gè)適合自己的級(jí)別來(lái)進(jìn)行游戲。</p><p> 5.當(dāng)用戶需要暫停游戲時(shí),可以按下鍵盤(pán)上的“D”鍵或者選擇“游戲”—>“暫停游戲“兩種選擇來(lái)暫停游戲。</p><p> 當(dāng)用戶想要結(jié)束游戲時(shí),可以按下鍵盤(pán)上的“G”鍵或者選擇“游戲”—>“結(jié)束游戲
141、“兩種選擇來(lái)結(jié)束游戲。</p><p> 6. 玩家想播放背景音樂(lè)時(shí),可以點(diǎn)擊設(shè)置菜單中的 背景音樂(lè)或者使用快捷鍵F鍵。</p><p> 7當(dāng)游戲失敗時(shí),顯示游戲結(jié)束,點(diǎn)擊確定后,你可以選擇重新開(kāi)始游戲或者關(guān)閉游戲。</p><p><b> 五、設(shè)計(jì)總結(jié)</b></p><p> 有些東西如果不是真正自己做
142、的話,是永遠(yuǎn)都不會(huì)懂得就像我看有關(guān)MFC的書(shū)時(shí)有些知識(shí)總是似懂非懂,如果不上機(jī)運(yùn)行恐怕永遠(yuǎn)都掌握不了,總之實(shí)踐才是王道。</p><p> 編寫(xiě)游戲時(shí)MFC的畫(huà)圖函數(shù)很重要,但同時(shí)算法也是一個(gè)很重要的部分,方塊的變形和轉(zhuǎn)換如果不多加思考和設(shè)計(jì)的話,將會(huì)出現(xiàn)嚴(yán)重的問(wèn)題。</p><p> 剛剛編寫(xiě)完程序運(yùn)行的時(shí)候可能會(huì)出現(xiàn)很多錯(cuò)誤和bug,此時(shí)需要的就是穩(wěn)定的心態(tài),和堅(jiān)持不懈的精神,一步
143、一步找到錯(cuò)誤,仔細(xì)的檢查處理,問(wèn)題終究會(huì)得到解決。</p><p><b> 六、參考文獻(xiàn)</b></p><p> [1]李蘭、任鳳華,c++面向?qū)ο蟪绦蛟O(shè)計(jì),西安電子科技大學(xué)出版社</p><p> [2]祝明慧、車玉生,Visual C++從入門(mén)到精通,機(jī)械工業(yè)出版社</p><p> [3]聞怡洋,Vis
144、ual_C++_6.0_MFC_入門(mén)教程,網(wǎng)絡(luò)資源</p><p><b> 七、附錄</b></p><p> LevelDlg.h</p><p> LevelDlg.cpp//對(duì)話框生成文件</p><p><b> MainFrm.h</b></p><p>
145、 MainFrm.cpp</p><p><b> Rule.h</b></p><p> Rule.cpp//規(guī)則類和游戲結(jié)束判斷</p><p><b> Russia.h</b></p><p> Russia.cpp//方塊的移動(dòng)轉(zhuǎn)換消行</p><p>&
146、lt;b> StdAfx.h</b></p><p> StdAfx.cpp</p><p><b> Teris.h</b></p><p><b> Teris.cpp</b></p><p><b> Teris.rc</b></p>
溫馨提示
- 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ì)--俄羅斯方塊
- 俄羅斯方塊c++課程設(shè)計(jì)報(bào)告
- c++俄羅斯方塊課程設(shè)計(jì)
- c++俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)-- 用c++實(shí)現(xiàn)的俄羅斯方塊程序設(shè)計(jì)
- c課程設(shè)計(jì)--俄羅斯方塊
- c++課程設(shè)計(jì)報(bào)告---俄羅斯方塊的設(shè)計(jì)與實(shí)現(xiàn)
- c語(yǔ)言課程設(shè)計(jì)報(bào)告-俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- c_課程設(shè)計(jì)-俄羅斯方塊
- c#俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)---俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)--俄羅斯方塊設(shè)計(jì)報(bào)告
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論