版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> C++面向對象課程設計報告</p><p> 院(系): 計算機工程學院 </p><p> 專業(yè): </p><p> 學生姓名: </p><p> 班級:______
2、_ 學號:201007206 </p><p> 題目: 俄羅斯方塊 </p><p> 起迄日期: _2012.6.18~2012.6.29 </p><p> 設計地點: 計算機學院機房 </p><p> 指 導 教
3、 師: </p><p> 完成日期: 2012 年6月 29 日</p><p><b> 目 錄</b></p><p> 一、需求分析…………………………………………………………. 3</p><p> 1.課程設計內容………………………………………
4、…………….3</p><p> 2.程序實現(xiàn)功能…………………………………………………….3</p><p> 二、設計內容………………………………………………………….3</p><p> 1俄羅斯方塊主功能框架圖………………………………………4</p><p> 2. 主函數(shù)及各功能模塊流程圖………………………………..…4&l
5、t;/p><p> 三、調試分析……………………………………………………….....26</p><p> 1.實際完成情況…………………………………………………....27</p><p> 2.上機過程中出現(xiàn)的問題及其解決方案 ………………………..27</p><p> 3.程序中可以改進、擴充的功能及設計實現(xiàn)構想……………..27
6、</p><p> 四、用戶手冊…………………………………………………………..27</p><p> 五、設計總結……… ………… ……… ………… … ………………31</p><p> 六、參考文獻………………………… ………………………………32</p><p> 七、附錄………………………………… ……………………………32
7、</p><p><b> 一、需求分析</b></p><p><b> 1. 課程設計目的</b></p><p> 俄羅斯方塊是由阿列謝.帕基特諾發(fā)明的,Tetris游戲在一個m*n 的矩形形框內進行的,矩形框的頂部會隨機的出現(xiàn)一個有四個小方塊組成的磚塊,每過一段時間,就會下落一格,知道他碰到底部,然后再過一個
8、時間下落另一個磚塊,依次進行,磚塊是隨機出現(xiàn)的。當發(fā)現(xiàn)底部磚塊是滿的話,則消去它從而得到相應設置的分數(shù),當磚塊到達頂部的時候,游戲結束。選擇俄羅斯方塊進行C++面向對象程序設計課程設計主要是在學習C++這門面向對象語言的基礎上,在完成C++面向對象程序設計各部分實驗的基礎上,通過自學MFC,掌握一種可視化編程的方法,并通過實踐加深對可視化編程與C++面向對象程序設計語言特點的認識與理解。同時,可以提高運用C++編程語言解決實際問題的能力
9、;鍛煉實際的編程能力、創(chuàng)新能力及團隊組織、協(xié)作開發(fā)軟件的能力;還能提高調查研究、查閱技術文獻、資料以及編寫軟件設計文檔的能力。</p><p><b> 程序實現(xiàn)的功能</b></p><p> 實現(xiàn)方塊的變形、下落、左移、右移消行等基本的功能。</p><p> 實現(xiàn)方塊的直接丟下、暫停、判斷分數(shù)以及等級設置功能。</p>
10、<p> 友好的地用戶界面,七種基本的方塊圖形設計功能。</p><p> 設置快捷鍵實現(xiàn)游戲的暫停和播放音樂功能。</p><p><b> 二、設計內容</b></p><p> 1.俄羅斯方塊主功能框架圖</p><p> 2.主函數(shù)及各功能模塊流程圖</p><p>
11、<b> 【1】主程序流程圖</b></p><p> 【2】主程序函數(shù)調用圖</p><p> 【3】鍵盤響應方塊移動及操作模塊算法流程圖</p><p><b> 代碼實現(xiàn)部分:</b></p><p> void CTetrisView::OnKeyDown(UINT nChar,
12、UINT nRepCnt, UINT nFlags) </p><p><b> {</b></p><p><b> //沒有開始</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> //重畫</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) //移動方塊</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> //方塊旋轉</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> //移動位置,重新給數(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】等級管理功能模塊流程圖</p><p><b>
53、 代碼實現(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);//設置等級最大值最小值</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");//取出保存的等級記錄</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("游戲結束!");</p><p><b> }</b></p><p><b> }</b></p><p><b> 主界面顯示功能模塊</b></p><p>&
80、lt;b> 代碼實現(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> //沒有開始,顯示封面&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ù)讓方塊自動按時</p><p><b> 移動</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> //畫背景</b></p><p> Dc.SelectObject(bkMap)
88、;</p><p> pDC->BitBlt(0,0,540,550,&Dc,0,0,SRCCOPY);</p><p> //畫分數(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> //預先圖形</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> //繪分數(shù)和等級</b></p><p> //////////////////////////////////////////////////////////////////////////</p><p>
95、void CRussia::DrawScore(CDC*pDC)</p><p><b> {</b></p><p> int nOldDC=pDC->SaveDC();</p><p><b> //設置字體</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> //設置字體顏色及其背景顏色</p><p> CString str;</p><p> CString a("下一個方塊:");</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("等級:%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> 代碼實現(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> }//設置等級</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行升一級<
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> }/判斷是否結束游戲</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("游戲結束!");</p><p><b> }</b></p><p><b> }</b></p><p> 【7】播放音樂功能模
124、塊</p><p><b> 代碼實現(xiàn)部分:</b></p><p> ON_COMMAND(IDR_PLAY_MUSIC, OnPlayMusic)添加消息映射</p><p> afx_msg void OnPlayMusic();聲明消息應設函數(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> //判斷播放音樂菜單當前狀態(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);//調用播放背景音
129、樂功能函數(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> {//播放音樂</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> 三、調試分析</b></p><p><b> 1.實際完成情況</b></p><p><b> 【1】數(shù)據(jù)類型說明</b></p><p> 此程序中用到的數(shù)據(jù)結構主要是二維數(shù)組。如:</p><p> int R
133、ussia[100][100];//游戲數(shù)組,用于存放整個界面的方塊</p><p> int Now[4][4];// 當前圖形,用于存放當前產生的方塊</p><p> int Will[4][4];//上一圖形,用于存放上一次產生的方塊</p><p><b> 【2】功能說明</b></p><p>
134、 俄羅斯方塊能實現(xiàn)游戲方塊的變形、下落、左移、右移消行基本功能,當方塊落滿一行時,需要消除這一行。而且需要在界面上顯示出游戲的級別以及要不斷刷新的分數(shù)。在方塊的移動過程當中,要不斷地刷洗界面同時判斷方塊下一個位置有沒有方塊或者墻壁存在。當游戲結束時,有兩種結果。一種是玩家失敗方塊落到頂部,另外一種是超過最大等級10級,也就是是通關了。游戲的等級設置分為(1—10十種等級,當點擊菜單中的響應選項時,彈出對話框,輸入后你想玩的級別要對游戲有
135、相應的改變。除此之外額外添加了背景音樂和快捷鍵功能使游戲更加完善。</p><p> 2.上機過程中出現(xiàn)的問題及其解決方案</p><p> 首先是如何使用vc中的MFC問題,一個完全陌生的平臺讓我不知所措,后來通過閱讀老師推薦的聞怡洋的MFC快速入門,以及觀看孫鑫的視頻對MFC有了初步的認識,從而逐步靜下心來開始編寫成素。</p><p> 接著就是游戲的算
136、法問題,如何變換,如何消行,如何檢測是否碰到墻壁壁,開始的時候都是很茫然,后來通過查閱網上的算法。知道變換時可以通過一個tmp[]數(shù)組臨時存儲方塊,判斷是否碰到碰壁可以借助一個After[]數(shù)組便可以輕松解決。</p><p> 最后程序運行時卻發(fā)現(xiàn)方塊不是按縱坐標而是按橫坐標移動,但卻始終找不到問題的癥結,從頭上下檢查了幾遍,終于發(fā)現(xiàn),原來是畫方塊的DrawBK(CDC*pDC)函數(shù)中的橫縱坐標搞翻,修改后程
137、序運行成功。</p><p> 3.程序中可以改進、擴充的功能及設計實現(xiàn)構想</p><p> 隨著級別的上升,我只是讓速度發(fā)生了改變,其實還可以通過改變游戲界面行數(shù)和列數(shù)還有增加方塊的樣式來提升游戲難度。添加英雄榜同樣可以吸引玩家的興趣,另外我在設計的時候沒有考慮到幫助模塊,希望在以后的編程中改進。游戲的界面非常簡單,我使用了加載位圖的方法,其實還可以使用一些畫圖函數(shù)使界面更加漂亮,
138、只是由于自己掌握的知識太過貧乏,沒辦法在短時間內設計出一個漂亮的界面,在課程設計之后希望能多補充一些知識設計出一個美觀而又完善的界面。</p><p><b> 四、用戶手冊</b></p><p> 1.使用平臺:Microsoft VisualC++6.0</p><p> 2.需要安裝。將下載的壓縮包解壓出來,然后在解壓出來的文件中
139、點擊setup.exe;這需要很長的時間。</p><p><b> 3.操作步驟:</b></p><p> 1.選擇Teris\Debug文件夾下的Teris.exe,單擊運行程序。</p><p><b> 2.啟動畫面。</b></p><p> 選擇“游戲”“開始游戲”,便可開始游
140、戲,如下圖;</p><p> 選擇“選項”“級別”,便會彈出級聯(lián)對話框。玩家可以在1-10級”中選擇一個適合自己的級別來進行游戲。</p><p> 5.當用戶需要暫停游戲時,可以按下鍵盤上的“D”鍵或者選擇“游戲”—>“暫停游戲“兩種選擇來暫停游戲。</p><p> 當用戶想要結束游戲時,可以按下鍵盤上的“G”鍵或者選擇“游戲”—>“結束游戲
141、“兩種選擇來結束游戲。</p><p> 6. 玩家想播放背景音樂時,可以點擊設置菜單中的 背景音樂或者使用快捷鍵F鍵。</p><p> 7當游戲失敗時,顯示游戲結束,點擊確定后,你可以選擇重新開始游戲或者關閉游戲。</p><p><b> 五、設計總結</b></p><p> 有些東西如果不是真正自己做
142、的話,是永遠都不會懂得就像我看有關MFC的書時有些知識總是似懂非懂,如果不上機運行恐怕永遠都掌握不了,總之實踐才是王道。</p><p> 編寫游戲時MFC的畫圖函數(shù)很重要,但同時算法也是一個很重要的部分,方塊的變形和轉換如果不多加思考和設計的話,將會出現(xiàn)嚴重的問題。</p><p> 剛剛編寫完程序運行的時候可能會出現(xiàn)很多錯誤和bug,此時需要的就是穩(wěn)定的心態(tài),和堅持不懈的精神,一步
143、一步找到錯誤,仔細的檢查處理,問題終究會得到解決。</p><p><b> 六、參考文獻</b></p><p> [1]李蘭、任鳳華,c++面向對象程序設計,西安電子科技大學出版社</p><p> [2]祝明慧、車玉生,Visual C++從入門到精通,機械工業(yè)出版社</p><p> [3]聞怡洋,Vis
144、ual_C++_6.0_MFC_入門教程,網絡資源</p><p><b> 七、附錄</b></p><p> LevelDlg.h</p><p> LevelDlg.cpp//對話框生成文件</p><p><b> MainFrm.h</b></p><p>
145、 MainFrm.cpp</p><p><b> Rule.h</b></p><p> Rule.cpp//規(guī)則類和游戲結束判斷</p><p><b> Russia.h</b></p><p> Russia.cpp//方塊的移動轉換消行</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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論