版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《c++俄羅斯方塊》課程設(shè)計(jì)--俄羅斯方塊
- c++俄羅斯方塊課程設(shè)計(jì)
- c++俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)-- 用c++實(shí)現(xiàn)的俄羅斯方塊程序設(shè)計(jì)
- 俄羅斯方塊c++課程設(shè)計(jì)報(bào)告
- c語言課程設(shè)計(jì)報(bào)告-俄羅斯方塊
- c++課程設(shè)計(jì)報(bào)告---俄羅斯方塊的設(shè)計(jì)與實(shí)現(xiàn)
- c++俄羅斯方塊課程設(shè)計(jì)報(bào)告書
- c課程設(shè)計(jì)--俄羅斯方塊
- 俄羅斯方塊游戲課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)--俄羅斯方塊游戲
- java課程設(shè)計(jì)---俄羅斯方塊游戲
- java課程設(shè)計(jì)---俄羅斯方塊游戲
- 基于java語言的俄羅斯方塊游戲課程設(shè)計(jì)
- c_課程設(shè)計(jì)-俄羅斯方塊
- c#俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)---俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論