2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論