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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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

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

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

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

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

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

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

8、他函數(shù)中實(shí)現(xiàn),使程序更加簡潔明了,清晰而有層次。除main函數(shù)外,還有Start,Begin,Block_birth,Print,Clear,Turn,Intomap,Available,Deleteline,Gameover十個(gè)實(shí)現(xiàn)算法的函數(shù),分別用來實(shí)現(xiàn)初始界面,初始游戲,生成方塊,打印方塊,擦除方塊,旋轉(zhuǎn)方塊,更改地圖矩陣,判斷是否放下,消行,游戲結(jié)束的功能。</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 關(guān)鍵算法描述</p><p>  本工程主要采用了數(shù)組來存儲(chǔ)矩陣,用三維數(shù)組(block_

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

12、維的地圖矩陣map_shape[24][46],在有方塊的地方值為1,無則為0,對(duì)于“■”字符橫坐標(biāo)占兩個(gè)的問題,統(tǒng)一取其左邊第一個(gè)位置為1進(jìn)行各種判斷操作。</p><p><b>  關(guān)鍵算法 1:</b></p><p>  算法功能:在主程序中接收鍵盤傳來的信息,并對(duì)所要操縱的方塊做相應(yīng)的操作(翻轉(zhuǎn),左移,右移,下落),包括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 方塊翻轉(zhuǎn)</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];//臨時(shí)輸出矩陣</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: //輸入錯(cuò)誤提示</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>  關(guān)鍵算法 2:</b></p><p>  算法功能:判

32、斷方塊能否出現(xiàn)在某個(gè)位置。</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>  關(guān)鍵算法 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';//消行時(shí)蜂鳴</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];//臨時(shí)輸出矩陣</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 程序設(shè)計(jì)的難點(diǎn)和關(guān)鍵點(diǎn)</p><p><b>  第一</b></p><p>  對(duì)于方塊的位置的判斷。因?yàn)樵诜綁K做任何操作之前都要進(jìn)行判斷,看變化之后的方塊所處的位置具不具備出現(xiàn)方塊的條件,即是否該坐標(biāo)位置是否已經(jīng)被占用。因此一個(gè)能夠通用的判斷函數(shù)就非常關(guān)鍵,在本程序中函數(shù)bool Available()就發(fā)揮著這個(gè)作

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

51、;b>  第三</b></p><p>  對(duì)于消行的判斷與操作。因?yàn)椤啊觥弊址麢M坐標(biāo)占兩個(gè)的問題,導(dǎo)致打印方塊時(shí)橫坐標(biāo)都要乘以2,于是統(tǒng)一取左邊第一個(gè)位置為1進(jìn)行各種操作。故最終判斷是否滿行時(shí)該行的地圖矩陣存儲(chǔ)的數(shù)據(jù)是1、0交錯(cuò)的。在判斷消行時(shí)因?yàn)槊看蜗信袛嘀慌c當(dāng)前操作的方塊有關(guān),所以判斷只需在有方塊的橫坐標(biāo)處進(jìn)行判斷,再者消行時(shí)也只從開始消行的橫坐標(biāo)向上操作,一下部分不需要變動(dòng),可以增加程

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

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

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(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)論