c++語言實現(xiàn)俄羅斯方塊經(jīng)典游戲課程設計_第1頁
已閱讀1頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  計算機實習報告 </p><p><b>  一.功能說明</b></p><p><b>  1.1總體功能說明</b></p><p>  本工程用C++語言實現(xiàn)了俄羅斯方塊經(jīng)典游戲。</p><p>  俄羅斯方塊游戲特點:俄羅斯方塊的基本規(guī)則是通過鍵盤控

2、制移動、旋轉和擺放游戲自動輸出的各種方塊,使之排列成完整的一行或多行并且消除得分,上手簡單,是一款經(jīng)典游戲。</p><p>  在經(jīng)典玩法(正常模式)的基礎上,本程序還添加了挑戰(zhàn)模式,即在游戲伊始時在游戲區(qū)域中隨機分布方塊,減小了留給玩家調整方塊的時間和區(qū)域,需要通過玩家不斷填補消行才能把游戲進行下去。</p><p>  游戲會隨著玩家的得分的增多而加大方塊下落的速度,從而增加游戲難度

3、,因此也在原來的基礎上大大增加了游戲的可玩性。游戲中還增加了Esc鍵的功能,從而可以實現(xiàn)暫停游戲和退出游戲的功能。</p><p><b>  1.2用戶界面</b></p><p>  這是游戲的初始界面。</p><p>  出現(xiàn)游戲名,根據(jù)提示,玩家按下“c”“n”即可自行選擇挑戰(zhàn)模式和正常模式,難度不同。這樣既明確了游戲名稱,提供兩種模

4、式的入口,又給玩家一個準備的時間以自行控制游戲開始,不必一打開文件就突然開始游戲,增加了游戲的人性化。</p><p>  以上兩圖為進入游戲后的主界面,分別為正常模式和挑戰(zhàn)模式。</p><p>  中間的區(qū)域為游戲主要界面,游戲從上往下隨機產生并自動輸出七種方塊,對俄羅斯方塊的基本操作如←(左移),→(右移),↑(方塊變形),↓(加速下落)都在此區(qū)域里完成。最上方顯示的是模式。右邊的區(qū)

5、域顯示一些與游戲相關的信息,從上往下分別是下落速度、游戲得分、游戲操作說明,編者信息。</p><p>  此圖為按下“Esc”鍵后出現(xiàn)的畫面。程序支持Esc鍵暫停的功能,即按下后,按Y鍵退出,按N鍵可繼續(xù)游戲,玩家中途有事離開,回來后也可繼續(xù)游戲,提供了方便。</p><p><b>  1.3使用方法</b></p><p>  打開程序后

6、根據(jù)屏幕上的提示信息,按下回車鍵以進入游戲界面開始游戲。</p><p>  進入游戲界面后,根據(jù)屏幕右下方的游戲說明,通過鍵盤上←(左移),→(右移),↑(方塊變形),↓(加速下落)控制方塊。游戲過程中,可按“Esc”鍵暫停,并可以通過“Y”和“C”鍵選擇退出和繼續(xù)。游戲結束之后,通過鍵盤按鍵“Y”和“N”選擇是否退出游戲。</p><p>  ←,→,↑,↓:左移,右移,翻轉和加速下落

7、。</p><p>  Esc:暫停/繼續(xù)/退出</p><p>  游戲難度配置是隨著分數(shù)的增加而提高的。</p><p><b>  二.程序設計說明</b></p><p>  2.1 總體設計框架</p><p>  程序以main函數(shù)為主線,在main函數(shù)中調用其他函數(shù),具體算法主要在其

8、他函數(shù)中實現(xiàn),使程序更加簡潔明了,清晰而有層次。除main函數(shù)外,還有Start,Begin,Block_birth,Print,Clear,Turn,Intomap,Available,Deleteline,Gameover十個實現(xiàn)算法的函數(shù),分別用來實現(xiàn)初始界面,初始游戲,生成方塊,打印方塊,擦除方塊,旋轉方塊,更改地圖矩陣,判斷是否放下,消行,游戲結束的功能。</p><p><b>  框架圖如

9、下:</b></p><p><b>  Y</b></p><p><b>  N</b></p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  N<

10、;/b></p><p><b>  Y</b></p><p><b>  N</b></p><p><b>  Y</b></p><p>  2.2 關鍵算法描述</p><p>  本工程主要采用了數(shù)組來存儲矩陣,用三維數(shù)組(block_

11、shape[7][4][4])存儲了最基本的7種俄羅斯方塊,而在具體操作中則通過對另外兩個新定義的二維數(shù)組當前方塊(tshape[4][4])與新方塊(newshape[4][4])來實現(xiàn)各種操作與判斷。</p><p>  打印函數(shù)Print()和擦除函數(shù)Clear()可實現(xiàn)方塊的移動。</p><p>  判斷函數(shù)Available ()進行方塊滿行和疊加的判斷,主要是通過定義了一個二

12、維的地圖矩陣map_shape[24][46],在有方塊的地方值為1,無則為0,對于“■”字符橫坐標占兩個的問題,統(tǒng)一取其左邊第一個位置為1進行各種判斷操作。</p><p><b>  關鍵算法 1:</b></p><p>  算法功能:在主程序中接收鍵盤傳來的信息,并對所要操縱的方塊做相應的操作(翻轉,左移,右移,下落),包括Esc鍵控制的暫停/繼續(xù)/退出游戲。

13、</p><p>  void Turn(int block_shape[4][4])//操作方塊</p><p><b>  {</b></p><p>  int direction = _getch();</p><p>  switch(direction)</p><p><b&

14、gt;  {</b></p><p>  case 72://up 方塊翻轉</p><p>  for(int k=0;k<4;k++)</p><p><b>  {</b></p><p>  for(int j=0;j<4;j++)</p><p><b>

15、;  {</b></p><p>  block_newshape[3-j][k] = block_shape[k][j];</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(Available(block_newshape,0,0

16、))</p><p><b>  {</b></p><p>  Clear(block_tshape);</p><p>  Print(block_newshape);</p><p>  for(int k=0;k<4;k++)</p><p>  for(int j=0;j<4

17、;j++)</p><p>  {block_tshape[k][j] = block_newshape[k][j];}</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case 75://left 方塊左移</p><

18、;p>  if(Available(block_tshape,-2,0))</p><p><b>  {</b></p><p>  Clear(block_tshape);</p><p>  x_coordinate-=2;</p><p>  Print(block_tshape);</p>

19、<p><b>  }</b></p><p><b>  break;</b></p><p>  case 77://right 方塊右移</p><p>  if(Available(block_tshape,2,0))</p><p><b>  {</b>&

20、lt;/p><p>  Clear(block_tshape);</p><p>  x_coordinate+=2;</p><p>  Print(block_tshape);</p><p><b>  }</b></p><p><b>  break;</b></

21、p><p>  case 80://down 方塊下移</p><p>  delay=delay_max;</p><p><b>  break;</b></p><p>  case 27://Esc 暫停游戲</p><p>  textout(handle,23,9,BColors,1,&q

22、uot;Do you want to quit?");</p><p>  textout(handle,24,10,BColors,1,"press y to exit");</p><p>  textout(handle,24,11,BColors,1,"press n to continue");</p><p&

23、gt;  int temp = _getch();</p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 121: //Y 退出游戲</p><p>  textout(handle,24,9,Colors,1,"

24、 ");</p><p>  textout(handle,24,10,Colors,1," ");</p><p>  textout(handle,24,11,Colors,1," ");</p><p>  textout(hand

25、le,28,12,BColors,1,"score:");</p><p>  char output[10];//臨時輸出矩陣</p><p>  itoa(score,output,10);</p><p>  textout(handle,35,12,BColors,1,output);</p><p>  Play

26、Sound("dead.wav",NULL,SND_FILENAME|SND_ASYNC);</p><p><b>  exit(0);</b></p><p>  case 110: //N 繼續(xù)游戲</p><p>  textout(handle,24,9,Colors,1,"

27、 ");</p><p>  textout(handle,24,10,Colors,1," ");</p><p>  textout(handle,24,11,Colors,1," ");</p><p><b>  

28、break;</b></p><p>  default: //輸入錯誤提示</p><p>  textout(handle,50,10,Colors,1,"input error...");</p><p>  textout(handle,50,11,Colors,1,"if you want to exit,&quo

29、t;);</p><p>  textout(handle,50,12,Colors,1,"please press Esc again");</p><p>  Sleep(1000);</p><p>  textout(handle,50,10,Colors,1," ");</p>

30、<p>  textout(handle,50,11,Colors,1," ");</p><p>  textout(handle,50,12,Colors,1," ");</p><p><b>  }&l

31、t;/b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  關鍵算法 2:</b></p><p>  算法功能:判

32、斷方塊能否出現(xiàn)在某個位置。</p><p>  bool Available(int block_shape[4][4],int x_move,int y_move)//判斷方塊能否放下</p><p><b>  {</b></p><p>  for(int x=0;x<4;x++)</p><p><b

33、>  {</b></p><p>  for(int y=0;y<4;y++)</p><p><b>  {</b></p><p>  if (block_shape[x][y]==1)</p><p><b>  {</b></p><p>&

34、lt;b>  switch(y)</b></p><p><b>  {</b></p><p><b>  case 0:</b></p><p>  if (map_shape[y_coordinate+y_move+x][x_coordinate+x_move+y]&&block_s

35、hape[x][y])</p><p><b>  return 0;</b></p><p><b>  break;</b></p><p><b>  case 1:</b></p><p><b>  case 2:</b></p>

36、<p><b>  case 3:</b></p><p>  if (map_shape[y_coordinate+y_move+x][x_coordinate+x_move+2*y]&&block_shape[x][y])</p><p><b>  return 0;</b></p><p>

37、;<b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>

38、;<b>  return 1;</b></p><p><b>  }</b></p><p><b>  關鍵算法 3;</b></p><p>  算法功能:消除已經(jīng)填滿的一行。</p><p>  void Deleteline()//擦除一行方塊</p>

39、<p><b>  {</b></p><p>  for(int y=0;y<4;y++)</p><p><b>  {</b></p><p>  for(int x=0;x<4;x++)</p><p><b>  {</b></p>

40、;<p>  if(block_tshape[y][x]==1)</p><p>  if(Block_Full(y))//判斷是否滿行</p><p>  { textout(handle,30,7,GColors,1,"消行成功!");</p><p>  Sleep(500);</p><p>  

41、textout(handle,30,7,GColors,1," ");//顯示“消行成功”</p><p>  cout<<'\a';//消行時蜂鳴</p><p>  score+=10;//加分</p><p>  if(speed<=49)//更改速度</p><p&g

42、t;<b>  {</b></p><p>  speed=score/10;</p><p>  if(speed>49)</p><p><b>  {</b></p><p><b>  speed=49;</b></p><p>  del

43、ay_max=2;</p><p><b>  }</b></p><p><b>  else</b></p><p>  delay_max=100-speed*2;</p><p><b>  }</b></p><p>  char output

44、[10];//臨時輸出矩陣</p><p>  itoa(score,output,10);</p><p>  textout(handle,58,9,BColors,1,output);</p><p>  itoa(speed,output,10);</p><p>  textout(handle,58,5,BColors,1,out

45、put);</p><p>  for(int a=y_coordinate+y;a>3;a--)</p><p><b>  {</b></p><p>  for(int b=21;b<45;b+=2)</p><p>  map_shape[a][b]=map_shape[a-1][b];</p&

46、gt;<p>  }//從消行處開始下移地圖矩陣</p><p>  for(int x=y_coordinate+y;x>3;x--)</p><p><b>  {</b></p><p>  for(int y=21;y<45;y+=2)</p><p><b>  {</

47、b></p><p>  textout(handle,y,x,Colors,1," ");</p><p>  if(map_shape[x][y]==1)</p><p>  textout(handle,y,x,Colors,1,"■");</p><p><b>  }</

48、b></p><p>  }//從消行處開始向上重新打印</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></

49、p><p>  2.3 程序設計的難點和關鍵點</p><p><b>  第一</b></p><p>  對于方塊的位置的判斷。因為在方塊做任何操作之前都要進行判斷,看變化之后的方塊所處的位置具不具備出現(xiàn)方塊的條件,即是否該坐標位置是否已經(jīng)被占用。因此一個能夠通用的判斷函數(shù)就非常關鍵,在本程序中函數(shù)bool Available()就發(fā)揮著這個作

50、用。</p><p><b>  第二</b></p><p>  對于方塊的操作。向左向右相對來說比較好解決,只需要修改橫坐標即可,而向上鍵則需要實現(xiàn)方塊的反轉,這需要用到一個類似矩陣轉置的算法。向下的實現(xiàn)引入了延遲量,即相當每一層橫坐標的循環(huán)中給玩家一個操作時間,當玩家按“↓”就相當于放棄調整進入下一個橫坐標的循環(huán)。</p><p><

51、;b>  第三</b></p><p>  對于消行的判斷與操作。因為“■”字符橫坐標占兩個的問題,導致打印方塊時橫坐標都要乘以2,于是統(tǒng)一取左邊第一個位置為1進行各種操作。故最終判斷是否滿行時該行的地圖矩陣存儲的數(shù)據(jù)是1、0交錯的。在判斷消行時因為每次消行判斷只與當前操作的方塊有關,所以判斷只需在有方塊的橫坐標處進行判斷,再者消行時也只從開始消行的橫坐標向上操作,一下部分不需要變動,可以增加程

52、序執(zhí)行的效率。</p><p><b>  2.4 調試的方法</b></p><p>  問題 1:“■”字符橫向輸出占兩格問題</p><p>  同樣是坐標,因為之前下手寫比較簡單的打印和擦除函數(shù)實現(xiàn)方塊移動的時候,沒有細想就用橫坐標乘以2的方式把方塊畫出來了,到了后期編判斷函數(shù)的時候一直為此煩惱,后來索性把打印的“■”換成“10”觀察數(shù)

53、據(jù)應該如何存儲,而得出向左靠齊存儲的想法。</p><p>  問題 2:判斷函數(shù)問題</p><p>  因為要編一個通用的判斷函數(shù),所以一直向左向右判斷與向下判斷與原地判斷就要都寫在一個函數(shù)里,再加上橫向輸出占兩格的問題,一度無法實現(xiàn),不過通過不斷運行調試,縱然有很多錯誤之處,但每發(fā)現(xiàn)一個錯誤就會都修改程序消除這個錯誤,但是其他錯誤并沒有解決,但當你針對每一個錯誤解決完的時候,也就是編

54、出了正確代碼的時候。</p><p>  問題4:itoa函數(shù)的調試過程</p><p>  分數(shù)顯示時需用調用了這個函數(shù)。經(jīng)過多次調試,發(fā)現(xiàn)其初始是默認初始,便把初始置0,后來運行程序分數(shù)便能夠正確累加。</p><p><b>  問題3:語法錯誤</b></p><p>  程序剛編寫的時候有許多語法錯誤,后經(jīng)過不

55、斷地設斷點調試,以及分模塊的調試,逐步修正,完成了整個程序。</p><p>  2.5 程序性能評價</p><p>  在程序運行的效果上還是非常流暢的,不論是方塊自身的反轉變換移動,還是滿行后的消行都沒有延遲,在實現(xiàn)鍵盤操縱的過程中也沒有什么延遲感。</p><p>  在程序設計上大體上感覺還是不錯的,通過幾個函數(shù)模塊互相嵌套調用實現(xiàn)程序設計上的幾個模塊的功

56、能,減少了代碼重復率,增加了代碼執(zhí)行的效率。</p><p>  在程序的精簡度方面做的還不夠,由于許多函數(shù)內都重復調用了一些變量,導致可能設置了較多的全局變量。</p><p>  另外方塊并沒有實現(xiàn)彩色隨機出現(xiàn),而都為紅色。且在界面右邊也未設計出現(xiàn)下一個方塊的函數(shù),增大了游戲的難度。但基于此程序中方塊生成及打印的算法,這兩點恐怕無法實現(xiàn),在這一點上做得不夠好。</p>&

57、lt;p><b>  三.心得體會</b></p><p>  通過這次小學期的計算機實習,我的編程能力的得到了很大提升。通過實踐將原來學習的許多理論知識應用到編程實際中,不僅鞏固了自己的與原來已經(jīng)掌握的知識,還鍛煉了自己的動手能力,增強了信心。</p><p>  之前正常課時的C++學習只是基于書本,平時的上機也只局限于對一些小程序的調試和部分語句的編寫,表

58、明上雖然懂了,但是離實踐還有很遠。我們真正消化為自己掌握的內容其實很少,所以對于C++,只是個平面的印象,然而這次計算機實習讓它變得立體鮮活。</p><p>  一開始的我還毫無頭緒,但是通過老師的講解,我首先從網(wǎng)上查找了一些代碼,自己試著調試,嘗試先看懂每個函數(shù)的功能,大致了解編寫俄羅斯方塊的基本思路,再自己嘗試著一邊借鑒一邊原創(chuàng)。</p><p>  由于是自己編寫的程序,所以開始運

59、行時出現(xiàn)了很多錯誤,由此我對程序的調試過程有了更加深刻的理解,并能熟練地運用這些調試方法。某些錯誤是語法的錯誤,有的是自己的不仔細造成的錯誤,這些錯誤都使我對于C++的編程以及自己的細心程度有了極大的提升。</p><p>  通過這次計算機實習,通過俄羅斯方塊這個小游戲的編寫,我接觸了不少不曾用過的函數(shù),了解了控制臺編程,體會到模塊化,多文件,多線程的好處。這次實習讓我在編譯原理方面得到了鞏固,而且使我們對軟件

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論