

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 題目</b></p><p> 利用C++編寫俄羅斯方塊游戲,是俄羅斯游戲能夠在Microsoft Visual C++ 6.0上運(yùn)行該游戲。</p><p><b> 實(shí)驗(yàn)?zāi)康?lt;/b></p><p> 一方面通過對(duì)程序算法的設(shè)計(jì)和分析提高我們對(duì)問題進(jìn)行文字論述和文字表達(dá)的能力并
2、且培養(yǎng)我們進(jìn)行知識(shí)綜合,軟件開發(fā)和軟件的調(diào)試技術(shù),開發(fā)較大程序的能力。</p><p> 另一方面培養(yǎng)了我們相互合作的精神并培養(yǎng)了我們的創(chuàng)新意識(shí)。 </p><p><b> 需求分析</b></p><p><b> 功能需求</b></p><p> 隨機(jī)給出不同的形狀下落填充給定的區(qū)域
3、,若填滿一條便消掉,記分,設(shè)計(jì)不同的游戲難度,即方塊下落的速度不同,若在游戲中各形狀填滿了給定區(qū)域,為輸者。</p><p><b> 方塊及各種變換需求</b></p><p> 本游戲需要有7種方塊,而每種方塊還可以進(jìn)行旋轉(zhuǎn)。每種方塊每行每列最多只有4個(gè)小方塊??梢詫⑺鼈兎旁谝粋€(gè)n*m的區(qū)域內(nèi),該區(qū)域可以看作是有許多個(gè)等面積小方塊構(gòu)成的區(qū)域,而這些區(qū)域的狀態(tài)只
4、有兩種,被方塊占據(jù)或空閑。因此,對(duì)于整個(gè)游戲區(qū)域的空間是占據(jù)或空閑,可以用一位數(shù)來標(biāo)識(shí)。對(duì)于7種方塊和它們旋轉(zhuǎn)后的形態(tài)我們可以用不同的標(biāo)識(shí)進(jìn)行標(biāo)記。對(duì)于旋轉(zhuǎn),游戲中所有方塊都是按照逆時(shí)針旋轉(zhuǎn)的規(guī)則進(jìn)行的,而且在旋轉(zhuǎn)過程中它們不會(huì)因?yàn)樾D(zhuǎn)而下降,總會(huì)保持在同一高度。任何方塊經(jīng)過一個(gè)旋轉(zhuǎn)周期還會(huì)變回原型。 </p><p><b> 操作的需求 </b></p><p
5、><b> 向上鍵 </b></p><p> 產(chǎn)生方塊旋轉(zhuǎn)操作,方塊并非任何情況都能旋轉(zhuǎn),如果旋轉(zhuǎn)后與小方格矩陣顯示的方塊有沖突或超出邊界時(shí),均不能發(fā)生旋轉(zhuǎn)。因此首先要判斷是否有足夠的空間進(jìn)行旋轉(zhuǎn)。然后選擇是否旋轉(zhuǎn)。 </p><p><b> 向下鍵 </b></p><p> 產(chǎn)生方塊加速下落操作,如果
6、方塊已經(jīng)到達(dá)游戲區(qū)域底部或者已經(jīng)有其他方塊遮擋,則方塊停止下降。 </p><p><b> 向左鍵 </b></p><p> 產(chǎn)生下落方塊左移操作。首先要判斷此方塊是否能夠發(fā)生左移,當(dāng)越界或被其他顯示方塊阻擋時(shí),則不能左移。 </p><p><b> 向右鍵 </b></p><p>
7、 產(chǎn)生下落方塊右移操作。首先要判斷此方塊是否能夠發(fā)生右移,當(dāng)越界或被其他顯示方塊阻擋時(shí),則不能右移。</p><p><b> 詳細(xì)設(shè)計(jì)</b></p><p><b> 主要功能設(shè)計(jì)</b></p><p> 根據(jù)分析,俄羅斯方塊這個(gè)程序一共要實(shí)現(xiàn)如下幾個(gè)功能,開始游戲(F8)、游戲的暫停\繼續(xù)(S)和退出游戲(Q
8、)。其中游戲控制最為主要和重要,它控制著整個(gè)游戲的畫面和有關(guān)數(shù)據(jù)的操作,是游戲的核心部分。暫停和退出功能做成一體,在退出的提示下不做任何操作即可實(shí)現(xiàn)暫停的功能。</p><p><b> 程序流程圖</b></p><p> 根據(jù)分析后的程序結(jié)構(gòu)圖設(shè)計(jì)出相應(yīng)的流程圖。俄羅斯方塊的內(nèi)容主要包括游戲開始,畫背景和邊框,顯示分?jǐn)?shù)等級(jí)和下一個(gè)方塊的預(yù)覽圖;根據(jù)速度沒隔一定
9、時(shí)間方塊自動(dòng)下落,當(dāng)有按鍵操作時(shí),根據(jù)相應(yīng)按鍵執(zhí)行動(dòng)作,每次動(dòng)作前要判斷是否動(dòng)作可以執(zhí)行。下落方塊滿一行時(shí),消去該行,根據(jù)消去行數(shù)得到相應(yīng)分?jǐn)?shù)。分?jǐn)?shù)達(dá)到一定程度,等級(jí)提升,速度加快。同時(shí)可以響應(yīng)Esc按鍵,提示是否退出程序。</p><p><b> 游戲界面</b></p><p> 俄羅斯方塊的游戲界面包括游戲區(qū)域邊框、下落方塊繪制、右部計(jì)分和預(yù)覽圖顯示等。&
10、lt;/p><p> 游戲區(qū)域邊框的繪制比較簡(jiǎn)單,循環(huán)中確定光標(biāo)的位置輸出特定字符,即可完成邊框繪制。游戲區(qū)方塊的繪制,循環(huán)從數(shù)據(jù)數(shù)組中依次讀出數(shù)據(jù),根據(jù)讀到的數(shù)據(jù)顯示“□”,最后組成方塊的形狀,完成方塊的繪制。計(jì)分和預(yù)覽圖部分先畫出一個(gè)矩形區(qū)域,然后控制光標(biāo)在其中顯示分?jǐn)?shù)、等級(jí)、預(yù)覽圖和提示信息。</p><p><b> 生成方塊</b></p>&
11、lt;p> 本程序中生成的方塊有7種形狀,每一種方塊以shapeindex標(biāo)記,在程序運(yùn)行生成方塊時(shí),調(diào)用shapeindex=rand()%5+1;語句,確定當(dāng)前要顯示的是哪一個(gè)方塊形狀。而在實(shí)際運(yùn)行中,第一次需要調(diào)用兩次生成方塊函數(shù)make(),將先產(chǎn)生的賦給游戲當(dāng)前方塊,第二個(gè)賦給預(yù)覽圖方塊。以后每次產(chǎn)生一個(gè)方塊,把預(yù)覽方塊賦給當(dāng)前方塊,把新產(chǎn)生的賦給預(yù)覽方塊。</p><p><b>
12、 方塊變形</b></p><p> 俄羅斯方塊的特點(diǎn)就在于通過方塊的變形拼滿整行來消去該行方塊從而使游戲可以繼續(xù)下去,很難想象不能變形的俄羅斯方塊是什么樣子。而變形的過程就是根據(jù)當(dāng)前方塊形狀改變方塊的相對(duì)位置,這樣就可以改變方塊的形狀了。在程序中每當(dāng)按下“↑”鍵,程序判斷可以變形后,根據(jù)當(dāng)前方塊的形狀序號(hào)shapeindex和變化形狀序號(hào)changeindex調(diào)用相應(yīng)的方塊數(shù)值賦給draw()函數(shù)
13、,通過刷新重畫就可以顯示變化后的方塊了。</p><p><b> 方塊顯示</b></p><p> 以上方塊的操作都是數(shù)據(jù)層面的操作,而真正要在游戲窗口中看到數(shù)據(jù)的變化,還必須把方塊不斷的繪制出來。這就是draw()函數(shù)的作用。把當(dāng)前運(yùn)動(dòng)的方塊對(duì)應(yīng)節(jié)點(diǎn)存儲(chǔ)在一個(gè)4*4數(shù)組里,變形和生成方塊的過程就是更新該數(shù)組數(shù)據(jù)的過程。然后在draw()函數(shù)里檢測(cè)數(shù)組的各個(gè)值
14、,并控制光標(biāo)跳到一定位置,畫出“□”組成方塊。</p><p><b> 障礙判斷</b></p><p> 障礙判斷,就是在方塊運(yùn)動(dòng)中或者變形中判斷周圍是否有障礙阻礙下落、移位、變形。當(dāng)方塊下落遇到下面有方塊或者到達(dá)下邊界則應(yīng)停止下落并記錄數(shù)據(jù),存入背景數(shù)據(jù)數(shù)組。變形時(shí)應(yīng)判斷這個(gè)變形是否可以進(jìn)行,如果有障礙則不能變形。例如當(dāng)方塊達(dá)到右邊界,而若變形則會(huì)越過邊界,
15、那么這個(gè)變形的命令是不應(yīng)執(zhí)行的。所有這些判斷都由meet()函數(shù)進(jìn)行,根據(jù)是否有障礙返回1或0,再由其他函數(shù)接收?qǐng)?zhí)行相應(yīng)操作。</p><p><b> 消行計(jì)分</b></p><p> 游戲玩家拼滿一行后,程序消去滿行,并計(jì)分。中當(dāng)一個(gè)方塊下落停止后,程序檢查方塊是否充滿了游戲區(qū)域,如果是結(jié)束游戲。不是,則判斷是否構(gòu)成消行條件,從下落方塊的最低點(diǎn)依次向上檢查是
16、否可以消行,根據(jù)消去行數(shù)分?jǐn)?shù)增加。分?jǐn)?shù)達(dá)到一定程度,等級(jí)提升,分?jǐn)?shù)暫定為每1000升一級(jí)。</p><p><b> 暫停退出</b></p><p> 游戲的友好性在于能考慮用戶的需要,隨時(shí)可以暫停/繼續(xù)游戲,在不愿繼續(xù)游戲時(shí)退出游戲。本程序可以在用戶需要的時(shí)候響應(yīng)Esc按鍵,提示是否退出游戲,如果不做選擇即可暫停游戲,等待選擇。</p><
17、p><b> 程序調(diào)試</b></p><p> 經(jīng)過調(diào)試和修改,程序完全實(shí)現(xiàn)設(shè)計(jì)要求,成功模擬了俄羅斯方塊的運(yùn)行過程和游戲效果,只是界面略微簡(jiǎn)陋,但已從程序?qū)用嫔蠈?shí)現(xiàn)了游戲,達(dá)到了這次實(shí)訓(xùn)的要求和目的。程序正常生成方塊,根據(jù)速度值每隔一定時(shí)間自動(dòng)下落,如有操作按鍵按下,根據(jù)按鍵實(shí)現(xiàn)位移和變形。當(dāng)方塊滿一行后,可以消除該行,同時(shí)記錄分?jǐn)?shù)和等級(jí)。按下Esc鍵紅色提示信息正常顯示,可以
18、響應(yīng)Y,N鍵決定是否退出游戲</p><p><b> 軟件使用說明</b></p><p> 打開俄羅斯方塊游戲后,通過控制方向區(qū)域的“↑”、“↓”、“←”、“→”來控制,“↑”鍵代表變形轉(zhuǎn)換,“↓”、“←”、“右”均代表方向鍵,“Q”代表退出游戲鍵。若想暫停游戲,可通過“S”鍵,當(dāng)初來詢問框是,可不做選擇,則可達(dá)到暫停的效果</p><p&
19、gt;<b> 實(shí)驗(yàn)結(jié)果</b></p><p><b> 經(jīng)驗(yàn)和教訓(xùn)</b></p><p> 通過這次課程設(shè)計(jì),我收獲了很多。首先把所學(xué)知識(shí)加以利用和鞏固,其次在實(shí)踐中遇到問題去探索和學(xué)習(xí),更增加了新知識(shí)。在程序設(shè)計(jì)編寫過程中兩個(gè)類的數(shù)據(jù)交換是個(gè)比較麻煩的過程,這個(gè)類的定義過程中要用到另一個(gè)類做參數(shù)類型,而在后一個(gè)類中亦需要第一個(gè)類做參
20、數(shù)類型,出現(xiàn)了互相調(diào)用的情況。</p><p> 編譯提示未定義,只好在兩個(gè)類外定義函數(shù)負(fù)責(zé)兩個(gè)類函數(shù)的數(shù)據(jù)交換。實(shí)踐證明達(dá)到了預(yù)期的目的,積累了經(jīng)驗(yàn)。由于程序是用文本窗口模擬的圖形,界面比較簡(jiǎn)陋,如果使用MFC用C++來實(shí)現(xiàn),那么界面將會(huì)非常好,只是由于所學(xué)知識(shí)有限,只有下一步去探索了。</p><p> 通過這次的學(xué)習(xí)設(shè)計(jì),我發(fā)現(xiàn)我還有許許多多的不足的地方,比如c++的程序設(shè)計(jì),源
21、代碼的書寫等等,剛開始我發(fā)現(xiàn)我的問題后,十分緊張,感覺很絕望,沒有別人的幫助,自己動(dòng)手設(shè)計(jì)曾經(jīng)自己想都沒想過的東西,雖然很興奮,但想想自己無從下手,原來的興奮勁一下子都沒了,很忙然。但是,通過與王老師的交流,經(jīng)過老師的耐心講解,我慢慢感到希望又重生了,于是我通過上網(wǎng)查找資料,進(jìn)圖書館查找書籍等,終于知道了俄羅斯方塊游戲的設(shè)計(jì)概念,終于知道了設(shè)計(jì)的方法,于是,漸漸地我的游戲設(shè)計(jì)理念誕生了。</p><p> 通過
22、幾個(gè)禮拜的設(shè)計(jì),我的游戲漸漸初見成效了,當(dāng)我把回車鍵摁下的一剎那,我十分激動(dòng),眼前的既熟悉又陌生的游戲出現(xiàn)在了我的面前,看著自己設(shè)計(jì)的童年時(shí)代經(jīng)常玩的游戲,我感慨萬千。通過這次設(shè)計(jì),我學(xué)會(huì)了很多東西,例如通過網(wǎng)絡(luò)資料來尋求幫助,自己改正錯(cuò)誤,加強(qiáng)了我自己的自己動(dòng)手能力,對(duì)今后的學(xué)習(xí)和生活有很大的幫助,有助于以后的課程設(shè)計(jì)順利完成。</p><p><b> 工作日志</b></p&g
23、t;<p><b> 參考書籍、網(wǎng)址</b></p><p> ?。?]楊永國.Visual C++ 6.0實(shí)用教程.北京:清華大學(xué)出版社.2004年</p><p> ?。?]唐俊明.Visual C++ 6.0 編程實(shí)例與技巧.北京:高等教育出版,2002</p><p> ?。?]曹向東 張國海 C++語言程序設(shè)計(jì) 機(jī)械工
24、業(yè)出版社 2003 </p><p> ?。?]浦濱 C++游戲編程從入門到精通 科學(xué)出版社 2006</p><p> ?。?]段鋼 編著 加密與解密(第三版).電子工業(yè)出版社.2009年8月 </p><p> ?。?] 潘錦平.軟件系統(tǒng)開發(fā)技術(shù).西安:西安電子科技大學(xué)出版社, 1997年 </p><p> 源程序代碼(詳細(xì)的注釋)
25、</p><p> #include <windows.h></p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #include <time.h></p><p> #includ
26、e <conio.h> </p><p> class Console</p><p><b> {</b></p><p><b> public:</b></p><p><b> Console()</b></p><p>&l
27、t;b> {</b></p><p> hStdOutput = INVALID_HANDLE_VALUE;</p><p> hStdError = INVALID_HANDLE_VALUE;</p><p><b> }</b></p><p> bool Open( void )<
28、;/p><p><b> {</b></p><p> hStdOutput = GetStdHandle( STD_OUTPUT_HANDLE );</p><p> hStdError = GetStdHandle( STD_ERROR_HANDLE );</p><p> return INVALID_HA
29、NDLE_VALUE!=hStdOutput && INVALID_HANDLE_VALUE!=hStdError;</p><p><b> }</b></p><p> inline bool SetTitle( char* title ) // 設(shè)置標(biāo)題</p><p><b> {</b>&l
30、t;/p><p> return TRUE==SetConsoleTitle(title);</p><p><b> }</b></p><p> bool RemoveCursor( void ) // 去處光標(biāo)</p><p><b> {</b></p><
31、p> CONSOLE_CURSOR_INFO cci;</p><p> if( !GetConsoleCursorInfo( hStdOutput, &cci ) ) return false;</p><p> cci.bVisible = false;</p><p> if( !SetConsoleCursorInfo( hStdOut
32、put, &cci ) ) return false;</p><p> if( !GetConsoleCursorInfo( hStdError, &cci ) ) return false;</p><p> cci.bVisible = false;</p><p> if( !SetConsoleCursorInfo( hStdErr
33、or, &cci ) ) return false;</p><p> return true;</p><p><b> }</b></p><p> bool SetWindowRect( short x, short y ) // 設(shè)置窗體尺寸</p><p><b> {</b&
34、gt;</p><p> SMALL_RECT wrt = { 0, 0, x, y };</p><p> if( !SetConsoleWindowInfo( hStdOutput, TRUE, &wrt ) ) return false;</p><p> if( !SetConsoleWindowInfo( hStdError, TRUE,
35、&wrt ) ) return false;</p><p> return true;</p><p><b> }</b></p><p> bool SetBufSize( short x, short y ) // 設(shè)置緩沖尺寸</p><p><b> {</b></
36、p><p> COORD coord = { x, y };</p><p> if( !SetConsoleScreenBufferSize( hStdOutput, coord ) ) return false;</p><p> if( !SetConsoleScreenBufferSize( hStdError, coord ) ) return fal
37、se;</p><p> return true;</p><p><b> }</b></p><p> bool GotoXY( short x, short y ) // 移動(dòng)光標(biāo)</p><p><b> {</b></p><p> COORD coord
38、 = { x, y };</p><p> if( !SetConsoleCursorPosition( hStdOutput, coord ) ) return false;</p><p> if( !SetConsoleCursorPosition( hStdError, coord ) ) return false;</p><p> return
39、true;</p><p><b> }</b></p><p> bool SetColor( WORD color ) // 設(shè)置前景色/背景色</p><p><b> {</b></p><p> if( !SetConsoleTextAttribute( hStdOutput, c
40、olor ) ) return false;</p><p> if( !SetConsoleTextAttribute( hStdError, color ) ) return false;</p><p> return true;</p><p><b> }</b></p><p> bool Outp
41、utString( const char* pstr, size_t len=0 ) // 輸出字符串</p><p><b> {</b></p><p> DWORD n = 0;</p><p> return TRUE==WriteConsole( hStdOutput, pstr, len?len:strlen(pstr), &
42、amp;n, NULL );</p><p><b> }</b></p><p> bool OutputStringNoMove( short x, short y, const char* pstr, size_t len=0 ) // 輸出字符串</p><p><b> {</b></p>&
43、lt;p> COORD coord = { x, y };</p><p> DWORD n = 0;</p><p> return TRUE==WriteConsoleOutputCharacter( hStdOutput, pstr, len?len:strlen(pstr), coord, &n );</p><p><b>
44、 }</b></p><p><b> private:</b></p><p> HANDLE hStdOutput;</p><p> HANDLE hStdError;</p><p><b> };</b></p><p> const char
45、 bg[] =</p><p> "┏━━━━━━━━━━━┓ "</p><p> "┃■■■■■■■■■■■┃ ←↓→↑ "</p><p> "┃■■■■■■■■■■■┃ Begin: F8 "</p><p> "┃■■■■■■■
46、■■■■┃ "</p><p> "┃■■■■■■■■■■■┃ Sleep "</p><p> "┃■■■■■■■■■■■┃ Quit "</p><p> "┃■■■■■■■■■■■┃ "</p><p
47、> "┃■■■■■■■■■■■┃ "</p><p> "┃■■■■■■■■■■■┃ NEXT "</p><p> "┃■■■■■■■■■■■┃┏━━━━┓"</p><p> "┃■■■■■■■■■■■┃┃ ┃"</p>&
48、lt;p> "┃■■■■■■■■■■■┃┃ ┃"</p><p> "┃■■■■■■■■■■■┃┗━━━━┛"</p><p> "┃■■■■■■■■■■■┃ LEVEL "</p><p> "┃■■■■■■■■■■■┃┏━━━━┓"</p><
49、p> "┃■■■■■■■■■■■┃┃ 0┃"</p><p> "┃■■■■■■■■■■■┃┗━━━━┛"</p><p> "┃■■■■■■■■■■■┃ SCORE "</p><p> "┃■■■■■■■■■■■┃┏━━━━┓"</p><
50、;p> "┃■■■■■■■■■■■┃┃ 00000┃"</p><p> "┗━━━━━━━━━━━┛┗━━━━┛";</p><p> const char bk[7][4][4][4] =</p><p><b> {</b></p><p><b>
51、; {</b></p><p> { { 0,1,1,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },</p><p> { { 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } },</p><p> { { 0,1,1,0 },{ 1,1,0,0 },{ 0,0,0
52、,0 },{ 0,0,0,0 } },</p><p> { { 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } }</p><p><b> }</b></p><p><b> ,</b></p><p><b> {</b&g
53、t;</p><p> { { 1,1,0,0 },{ 0,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },</p><p> { { 0,1,0,0 },{ 1,1,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } },</p><p> { { 1,1,0,0 },{ 0,1,1,0 },{ 0,0,0,0 },{ 0,0,0
54、,0 } },</p><p> { { 0,1,0,0 },{ 1,1,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } }</p><p><b> }</b></p><p><b> ,</b></p><p><b> {</b></p>
55、<p> { { 1,1,1,0 },{ 1,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },</p><p> { { 1,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,0,0,0 } },</p><p> { { 0,0,1,0 },{ 1,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },</
56、p><p> { { 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } }</p><p><b> }</b></p><p><b> ,</b></p><p><b> {</b></p><p>
57、 { { 1,1,1,0 },{ 0,0,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },</p><p> { { 1,1,0,0 },{ 1,0,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } },</p><p> { { 1,0,0,0 },{ 1,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },</p><p
58、> { { 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 } }</p><p><b> }</b></p><p><b> ,</b></p><p><b> {</b></p><p> { { 1,1,0,0
59、 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },</p><p> { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },</p><p> { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },</p><p> { { 1,
60、1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }</p><p><b> }</b></p><p><b> ,</b></p><p><b> {</b></p><p> { { 0,1,0,0 },{ 1,1,1,0
61、 },{ 0,0,0,0 },{ 0,0,0,0 } },</p><p> { { 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } },</p><p> { { 1,1,1,0 },{ 0,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },</p><p> { { 1,0,0,0 },{ 1,
62、1,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } }</p><p><b> }</b></p><p><b> ,</b></p><p><b> {</b></p><p> { { 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0
63、 },{ 0,0,0,0 } },</p><p> { { 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 } },</p><p> { { 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },</p><p> { { 1,0,0,0 },{ 1,0,0,0 },{ 1,
64、0,0,0 },{ 1,0,0,0 } }</p><p><b> }</b></p><p><b> };</b></p><p> const WORD COLOR_A = FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY; // 運(yùn)動(dòng)中的顏色</
65、p><p> const WORD COLOR_B = FOREGROUND_RED; // 固定不動(dòng)的顏色</p><p> const WORD COLOR_C = FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE; // 空白處的顏色</p>
66、<p> int score = 0, level = 0;</p><p> char data[19][11] = { 0 };</p><p> int next = -1;</p><p> int x=4, y=-2, c=-1, z=0; // x坐標(biāo),坐標(biāo),當(dāng)前方塊,方向</p><p> Console c
67、sl; // 定義控制臺(tái)對(duì)象</p><p> void DrawScoreLevel( void ) // 繪制得分</p><p><b> {</b></p><p> char tmp[6];</p><p> sprintf( tmp, "%05d", score );</p&
68、gt;<p> csl.OutputStringNoMove( 31, 19, tmp, 5 );</p><p> sprintf( tmp, "%1d", level );</p><p> csl.OutputStringNoMove( 35, 15, tmp, 1 );</p><p><b> }<
69、/b></p><p> void DrawNext( void ) // 繪制 "next框" 中的圖形</p><p><b> {</b></p><p> for( int i=0; i<2; ++i )</p><p><b> {</b><
70、/p><p> for( int j=0; j<4; ++j )</p><p><b> {</b></p><p> csl.OutputStringNoMove( 28+j*2, 10+i, bk[next][0][i][j]==0?" ":"■", 2 );</p><
71、p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void DrawOver( void ) // 游戲結(jié)束</p><p><b> {</b></p>
72、<p> csl.OutputStringNoMove( 28, 10, "GAME" );</p><p> csl.OutputStringNoMove( 28, 11, "OVER" );</p><p><b> }</b></p><p> void Draw( WORD c
73、olor )</p><p><b> {</b></p><p> for( int i=0; i<4; ++i )</p><p><b> {</b></p><p> if( y+i<0 || y+i>= 19 ) continue;</p><
74、p> for( int j=0; j<4; ++j )</p><p><b> {</b></p><p> if( bk[c][z][i][j] == 1 )</p><p><b> {</b></p><p> csl.SetColor( color );</p&
75、gt;<p> csl.GotoXY( 2+x*2+j*2, 1+y+i );</p><p> csl.OutputString( "■", 2 );</p><p><b> }</b></p><p><b> }</b></p><p><b&
76、gt; }</b></p><p><b> }</b></p><p> bool IsFit( int x, int y, int c, int z ) // 給定的x,y,c,z是否可行</p><p><b> {</b></p><p> for( int i=0;
77、i<4; ++i )</p><p><b> {</b></p><p> for( int j=0; j<4; ++j )</p><p><b> {</b></p><p> if( bk[c][z][i][j]==1 )</p><p><
78、b> {</b></p><p> if( y+i < 0 ) continue;</p><p> if( y+i>=19 || x+j<0 || x+j>=11 || data[y+i][x+j]==1 ) return false;</p><p><b> }</b></p>
79、<p><b> }</b></p><p><b> }</b></p><p> return true;</p><p><b> }</b></p><p> void RemoveRow( void ) // 消行</p><
80、;p><b> {</b></p><p> const char FULLLINE[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };</p><p> int linecount = 0;</p><p> for( int i=0; i<19; ++i )</p><p
81、><b> {</b></p><p> if( 0 == memcmp( data[i], FULLLINE, 11 ) )</p><p><b> {</b></p><p> ++linecount;</p><p> for( int m=0; m<11; ++m )
82、</p><p><b> {</b></p><p> for( int n=i; n>1; --n )</p><p><b> {</b></p><p> data[n][m] = data[n-1][m];</p><p> csl.SetColor
83、( data[n][m]==1?COLOR_B:COLOR_C );</p><p> csl.GotoXY( 2+m*2, 1+n );</p><p> csl.OutputString( "■", 2 );</p><p><b> }</b></p><p> data[0][m] =
84、 0;</p><p> csl.OutputStringNoMove( 2+m*2, 1, "■", 2 );</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
85、<p> char data[19][11] = { 0 };</p><p> if( linecount == 0 ) return;</p><p> int _score = 0;</p><p> switch( linecount )</p><p><b> {</b></p>
86、;<p> case 1: _score = 100; break;</p><p> case 2: _score = 300; break;</p><p> case 3: _score = 700; break;</p><p> case 4: _score = 1500;break;</p><p>&
87、lt;b> }</b></p><p> score += _score;</p><p> if( score > 99999 ) score = 99999;</p><p> level = score/10000;</p><p> DrawScoreLevel();</p><p
88、><b> }</b></p><p> void MoveTrans( void ) // 逆時(shí)針翻轉(zhuǎn)</p><p><b> {</b></p><p> if( IsFit( x, y, c, (z+1)%4 ) )</p><p><b> {</b>
89、;</p><p> Draw( COLOR_C );</p><p> z=(z+1)%4;</p><p> Draw( COLOR_A );</p><p><b> }</b></p><p><b> }</b></p><p>
90、 void MoveLeft( void ) // 向左移</p><p><b> {</b></p><p> if( IsFit( x-1, y, c, z ) )</p><p><b> {</b></p><p> Draw( COLOR_C );</p>&
91、lt;p><b> --x;</b></p><p> Draw( COLOR_A );</p><p><b> }</b></p><p><b> }</b></p><p> void MoveRight( void ) // 向右移</p>
92、;<p><b> {</b></p><p> if( IsFit( x+1, y, c, z ) )</p><p><b> {</b></p><p> Draw( COLOR_C );</p><p><b> ++x;</b></p&g
93、t;<p> Draw( COLOR_A );</p><p><b> }</b></p><p><b> }</b></p><p> void MoveDown( void ) // 向下移</p><p><b> {</b></p&
94、gt;<p> if( IsFit( x, y+1, c, z ) )</p><p><b> {</b></p><p> Draw( COLOR_C );</p><p><b> ++y;</b></p><p> Draw( COLOR_A );</p>
95、<p><b> }</b></p><p> else if( y != -2 ) // 觸底</p><p><b> {</b></p><p> Draw( COLOR_B );</p><p> for( int i=0; i<4; ++i )</p&g
96、t;<p><b> {</b></p><p> if( y+i<0 ) continue;</p><p> for( int j=0; j<4; ++j )</p><p><b> {</b></p><p> if( bk[c][z][i][j] ==
97、1 )</p><p><b> {</b></p><p> data[y+i][x+j] = 1;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b><
98、;/p><p> RemoveRow();</p><p> x=4, y=-2, c=next, z=0;</p><p> next = rand()%7;</p><p> DrawNext();</p><p><b> }</b></p><p> els
99、e // 游戲結(jié)束</p><p><b> {</b></p><p> DrawOver();</p><p><b> }</b></p><p><b> }</b></p><p> void MessageDeal( void )&
100、lt;/p><p><b> {</b></p><p> int cycle = 9 - level;</p><p> for( ; ; )</p><p><b> {</b></p><p> for( int i=0; i<cycle; ++i )<
101、;/p><p><b> {</b></p><p> if( _kbhit() )</p><p><b> {</b></p><p> switch( _getch() )</p><p><b> {</b></p><
102、p><b> case 'Q':</b></p><p> case 'q': // 退出</p><p><b> return;</b></p><p><b> break;</b></p><p> case 'S
103、': // 暫停</p><p><b> case 's':</b></p><p> for( ; ; )</p><p><b> {</b></p><p> switch( _getch() )</p><p><b>
104、{</b></p><p><b> case 'Q':</b></p><p> case 'q': // 退出</p><p><b> return;</b></p><p><b> case 'S':</b
105、></p><p><b> case 's':</b></p><p> goto LABLE_CONTINUE;</p><p><b> break;</b></p><p><b> }</b></p><p>&l
106、t;b> }</b></p><p> LABLE_CONTINUE:</p><p><b> break;</b></p><p> case 0xe0: // ←↓→ ↑</p><p> switch( _getch() )</p><p><b>
107、 {</b></p><p> case 0x4B: // ←</p><p> MoveLeft();</p><p><b> break;</b></p><p> case 0x50: // ↓</p><p> MoveDown();</p><
108、;p><b> break;</b></p><p> case 0x4d: // →</p><p> MoveRight();</p><p> break; // ↑ 變形</p><p> case 0x48:</p><p> MoveTrans();</p>
109、;<p><b> default:</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> default:
110、</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> Sleep( 55 );</p><p><b> }</b&g
111、t;</p><p> MoveDown();</p><p><b> }</b></p><p><b> }</b></p><p> int main()</p><p><b> {</b></p><p>
112、 csl.Open();</p><p> csl.SetTitle( "俄羅斯方塊 " ); // 設(shè)置標(biāo)題</p><p> csl.RemoveCursor(); // 去處光標(biāo)</p><p> csl.SetWindowRect( 38-1, 21-1 ); // 設(shè)置窗體尺寸</p><p>
113、 csl.SetBufSize( 38, 21 ); // 設(shè)置緩沖尺寸</p><p> csl.OutputStringNoMove( 0,0,bg ); // 輸出背景字符</p><p> srand( time(0) ); // 設(shè)置隨機(jī)種子</p><p> next = rand()%7;</p><p&g
114、t; DrawNext();</p><p><b> {</b></p><p> for( char c = (char)_getch(); c!='B'&&c!='b'; c=(char)_getch() ) // 開始 Begin</p><p><b> ;}</
115、b></p><p> x=4, y=-2, c=next, z=0;</p><p> next = rand()%7;</p><p> DrawNext();</p><p> MessageDeal();</p><p><b> return 0;</b></p&g
溫馨提示
- 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ì)報(bào)告
- c++俄羅斯方塊課程設(shè)計(jì)
- c++俄羅斯方塊課程設(shè)計(jì)
- c++俄羅斯方塊課程設(shè)計(jì)報(bào)告書
- 俄羅斯方塊課程設(shè)計(jì)-- 用c++實(shí)現(xiàn)的俄羅斯方塊程序設(shè)計(jì)
- c課程設(shè)計(jì)--俄羅斯方塊
- c++課程設(shè)計(jì)報(bào)告---俄羅斯方塊的設(shè)計(jì)與實(shí)現(xiàn)
- c語言課程設(shè)計(jì)報(bào)告-俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- c_課程設(shè)計(jì)-俄羅斯方塊
- c#俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)---俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)--俄羅斯方塊設(shè)計(jì)報(bào)告
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論