俄羅斯方塊c++課程設計報告_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  題目</b></p><p>  利用C++編寫俄羅斯方塊游戲,是俄羅斯游戲能夠在Microsoft Visual C++ 6.0上運行該游戲。</p><p><b>  實驗目的</b></p><p>  一方面通過對程序算法的設計和分析提高我們對問題進行文字論述和文字表達的能力并

2、且培養(yǎng)我們進行知識綜合,軟件開發(fā)和軟件的調(diào)試技術(shù),開發(fā)較大程序的能力。</p><p>  另一方面培養(yǎng)了我們相互合作的精神并培養(yǎng)了我們的創(chuàng)新意識。 </p><p><b>  需求分析</b></p><p><b>  功能需求</b></p><p>  隨機給出不同的形狀下落填充給定的區(qū)域

3、,若填滿一條便消掉,記分,設計不同的游戲難度,即方塊下落的速度不同,若在游戲中各形狀填滿了給定區(qū)域,為輸者。</p><p><b>  方塊及各種變換需求</b></p><p>  本游戲需要有7種方塊,而每種方塊還可以進行旋轉(zhuǎn)。每種方塊每行每列最多只有4個小方塊??梢詫⑺鼈兎旁谝粋€n*m的區(qū)域內(nèi),該區(qū)域可以看作是有許多個等面積小方塊構(gòu)成的區(qū)域,而這些區(qū)域的狀態(tài)只

4、有兩種,被方塊占據(jù)或空閑。因此,對于整個游戲區(qū)域的空間是占據(jù)或空閑,可以用一位數(shù)來標識。對于7種方塊和它們旋轉(zhuǎn)后的形態(tài)我們可以用不同的標識進行標記。對于旋轉(zhuǎn),游戲中所有方塊都是按照逆時針旋轉(zhuǎn)的規(guī)則進行的,而且在旋轉(zhuǎn)過程中它們不會因為旋轉(zhuǎn)而下降,總會保持在同一高度。任何方塊經(jīng)過一個旋轉(zhuǎn)周期還會變回原型。 </p><p><b>  操作的需求 </b></p><p

5、><b>  向上鍵 </b></p><p>  產(chǎn)生方塊旋轉(zhuǎn)操作,方塊并非任何情況都能旋轉(zhuǎn),如果旋轉(zhuǎn)后與小方格矩陣顯示的方塊有沖突或超出邊界時,均不能發(fā)生旋轉(zhuǎn)。因此首先要判斷是否有足夠的空間進行旋轉(zhuǎn)。然后選擇是否旋轉(zhuǎn)。 </p><p><b>  向下鍵 </b></p><p>  產(chǎn)生方塊加速下落操作,如果

6、方塊已經(jīng)到達游戲區(qū)域底部或者已經(jīng)有其他方塊遮擋,則方塊停止下降。 </p><p><b>  向左鍵 </b></p><p>  產(chǎn)生下落方塊左移操作。首先要判斷此方塊是否能夠發(fā)生左移,當越界或被其他顯示方塊阻擋時,則不能左移。 </p><p><b>  向右鍵 </b></p><p> 

7、 產(chǎn)生下落方塊右移操作。首先要判斷此方塊是否能夠發(fā)生右移,當越界或被其他顯示方塊阻擋時,則不能右移。</p><p><b>  詳細設計</b></p><p><b>  主要功能設計</b></p><p>  根據(jù)分析,俄羅斯方塊這個程序一共要實現(xiàn)如下幾個功能,開始游戲(F8)、游戲的暫停\繼續(xù)(S)和退出游戲(Q

8、)。其中游戲控制最為主要和重要,它控制著整個游戲的畫面和有關(guān)數(shù)據(jù)的操作,是游戲的核心部分。暫停和退出功能做成一體,在退出的提示下不做任何操作即可實現(xiàn)暫停的功能。</p><p><b>  程序流程圖</b></p><p>  根據(jù)分析后的程序結(jié)構(gòu)圖設計出相應的流程圖。俄羅斯方塊的內(nèi)容主要包括游戲開始,畫背景和邊框,顯示分數(shù)等級和下一個方塊的預覽圖;根據(jù)速度沒隔一定

9、時間方塊自動下落,當有按鍵操作時,根據(jù)相應按鍵執(zhí)行動作,每次動作前要判斷是否動作可以執(zhí)行。下落方塊滿一行時,消去該行,根據(jù)消去行數(shù)得到相應分數(shù)。分數(shù)達到一定程度,等級提升,速度加快。同時可以響應Esc按鍵,提示是否退出程序。</p><p><b>  游戲界面</b></p><p>  俄羅斯方塊的游戲界面包括游戲區(qū)域邊框、下落方塊繪制、右部計分和預覽圖顯示等。&

10、lt;/p><p>  游戲區(qū)域邊框的繪制比較簡單,循環(huán)中確定光標的位置輸出特定字符,即可完成邊框繪制。游戲區(qū)方塊的繪制,循環(huán)從數(shù)據(jù)數(shù)組中依次讀出數(shù)據(jù),根據(jù)讀到的數(shù)據(jù)顯示“□”,最后組成方塊的形狀,完成方塊的繪制。計分和預覽圖部分先畫出一個矩形區(qū)域,然后控制光標在其中顯示分數(shù)、等級、預覽圖和提示信息。</p><p><b>  生成方塊</b></p>&

11、lt;p>  本程序中生成的方塊有7種形狀,每一種方塊以shapeindex標記,在程序運行生成方塊時,調(diào)用shapeindex=rand()%5+1;語句,確定當前要顯示的是哪一個方塊形狀。而在實際運行中,第一次需要調(diào)用兩次生成方塊函數(shù)make(),將先產(chǎn)生的賦給游戲當前方塊,第二個賦給預覽圖方塊。以后每次產(chǎn)生一個方塊,把預覽方塊賦給當前方塊,把新產(chǎn)生的賦給預覽方塊。</p><p><b> 

12、 方塊變形</b></p><p>  俄羅斯方塊的特點就在于通過方塊的變形拼滿整行來消去該行方塊從而使游戲可以繼續(xù)下去,很難想象不能變形的俄羅斯方塊是什么樣子。而變形的過程就是根據(jù)當前方塊形狀改變方塊的相對位置,這樣就可以改變方塊的形狀了。在程序中每當按下“↑”鍵,程序判斷可以變形后,根據(jù)當前方塊的形狀序號shapeindex和變化形狀序號changeindex調(diào)用相應的方塊數(shù)值賦給draw()函數(shù)

13、,通過刷新重畫就可以顯示變化后的方塊了。</p><p><b>  方塊顯示</b></p><p>  以上方塊的操作都是數(shù)據(jù)層面的操作,而真正要在游戲窗口中看到數(shù)據(jù)的變化,還必須把方塊不斷的繪制出來。這就是draw()函數(shù)的作用。把當前運動的方塊對應節(jié)點存儲在一個4*4數(shù)組里,變形和生成方塊的過程就是更新該數(shù)組數(shù)據(jù)的過程。然后在draw()函數(shù)里檢測數(shù)組的各個值

14、,并控制光標跳到一定位置,畫出“□”組成方塊。</p><p><b>  障礙判斷</b></p><p>  障礙判斷,就是在方塊運動中或者變形中判斷周圍是否有障礙阻礙下落、移位、變形。當方塊下落遇到下面有方塊或者到達下邊界則應停止下落并記錄數(shù)據(jù),存入背景數(shù)據(jù)數(shù)組。變形時應判斷這個變形是否可以進行,如果有障礙則不能變形。例如當方塊達到右邊界,而若變形則會越過邊界,

15、那么這個變形的命令是不應執(zhí)行的。所有這些判斷都由meet()函數(shù)進行,根據(jù)是否有障礙返回1或0,再由其他函數(shù)接收執(zhí)行相應操作。</p><p><b>  消行計分</b></p><p>  游戲玩家拼滿一行后,程序消去滿行,并計分。中當一個方塊下落停止后,程序檢查方塊是否充滿了游戲區(qū)域,如果是結(jié)束游戲。不是,則判斷是否構(gòu)成消行條件,從下落方塊的最低點依次向上檢查是

16、否可以消行,根據(jù)消去行數(shù)分數(shù)增加。分數(shù)達到一定程度,等級提升,分數(shù)暫定為每1000升一級。</p><p><b>  暫停退出</b></p><p>  游戲的友好性在于能考慮用戶的需要,隨時可以暫停/繼續(xù)游戲,在不愿繼續(xù)游戲時退出游戲。本程序可以在用戶需要的時候響應Esc按鍵,提示是否退出游戲,如果不做選擇即可暫停游戲,等待選擇。</p><

17、p><b>  程序調(diào)試</b></p><p>  經(jīng)過調(diào)試和修改,程序完全實現(xiàn)設計要求,成功模擬了俄羅斯方塊的運行過程和游戲效果,只是界面略微簡陋,但已從程序?qū)用嫔蠈崿F(xiàn)了游戲,達到了這次實訓的要求和目的。程序正常生成方塊,根據(jù)速度值每隔一定時間自動下落,如有操作按鍵按下,根據(jù)按鍵實現(xiàn)位移和變形。當方塊滿一行后,可以消除該行,同時記錄分數(shù)和等級。按下Esc鍵紅色提示信息正常顯示,可以

18、響應Y,N鍵決定是否退出游戲</p><p><b>  軟件使用說明</b></p><p>  打開俄羅斯方塊游戲后,通過控制方向區(qū)域的“↑”、“↓”、“←”、“→”來控制,“↑”鍵代表變形轉(zhuǎn)換,“↓”、“←”、“右”均代表方向鍵,“Q”代表退出游戲鍵。若想暫停游戲,可通過“S”鍵,當初來詢問框是,可不做選擇,則可達到暫停的效果</p><p&

19、gt;<b>  實驗結(jié)果</b></p><p><b>  經(jīng)驗和教訓</b></p><p>  通過這次課程設計,我收獲了很多。首先把所學知識加以利用和鞏固,其次在實踐中遇到問題去探索和學習,更增加了新知識。在程序設計編寫過程中兩個類的數(shù)據(jù)交換是個比較麻煩的過程,這個類的定義過程中要用到另一個類做參數(shù)類型,而在后一個類中亦需要第一個類做參

20、數(shù)類型,出現(xiàn)了互相調(diào)用的情況。</p><p>  編譯提示未定義,只好在兩個類外定義函數(shù)負責兩個類函數(shù)的數(shù)據(jù)交換。實踐證明達到了預期的目的,積累了經(jīng)驗。由于程序是用文本窗口模擬的圖形,界面比較簡陋,如果使用MFC用C++來實現(xiàn),那么界面將會非常好,只是由于所學知識有限,只有下一步去探索了。</p><p>  通過這次的學習設計,我發(fā)現(xiàn)我還有許許多多的不足的地方,比如c++的程序設計,源

21、代碼的書寫等等,剛開始我發(fā)現(xiàn)我的問題后,十分緊張,感覺很絕望,沒有別人的幫助,自己動手設計曾經(jīng)自己想都沒想過的東西,雖然很興奮,但想想自己無從下手,原來的興奮勁一下子都沒了,很忙然。但是,通過與王老師的交流,經(jīng)過老師的耐心講解,我慢慢感到希望又重生了,于是我通過上網(wǎng)查找資料,進圖書館查找書籍等,終于知道了俄羅斯方塊游戲的設計概念,終于知道了設計的方法,于是,漸漸地我的游戲設計理念誕生了。</p><p>  通過

22、幾個禮拜的設計,我的游戲漸漸初見成效了,當我把回車鍵摁下的一剎那,我十分激動,眼前的既熟悉又陌生的游戲出現(xiàn)在了我的面前,看著自己設計的童年時代經(jīng)常玩的游戲,我感慨萬千。通過這次設計,我學會了很多東西,例如通過網(wǎng)絡資料來尋求幫助,自己改正錯誤,加強了我自己的自己動手能力,對今后的學習和生活有很大的幫助,有助于以后的課程設計順利完成。</p><p><b>  工作日志</b></p&g

23、t;<p><b>  參考書籍、網(wǎng)址</b></p><p> ?。?]楊永國.Visual C++ 6.0實用教程.北京:清華大學出版社.2004年</p><p> ?。?]唐俊明.Visual C++ 6.0 編程實例與技巧.北京:高等教育出版,2002</p><p> ?。?]曹向東 張國海 C++語言程序設計 機械工

24、業(yè)出版社 2003 </p><p> ?。?]浦濱 C++游戲編程從入門到精通 科學出版社 2006</p><p> ?。?]段鋼 編著 加密與解密(第三版).電子工業(yè)出版社.2009年8月 </p><p> ?。?] 潘錦平.軟件系統(tǒng)開發(fā)技術(shù).西安:西安電子科技大學出版社, 1997年 </p><p>  源程序代碼(詳細的注釋)

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 ) // 設置標題</p><p><b>  {</b>&l

30、t;/p><p>  return TRUE==SetConsoleTitle(title);</p><p><b>  }</b></p><p>  bool RemoveCursor( void ) // 去處光標</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 ) // 設置窗體尺寸</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 ) // 設置緩沖尺寸</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 ) // 移動光標</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 ) // 設置前景色/背景色</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; // 運動中的顏色</

65、p><p>  const WORD COLOR_B = FOREGROUND_RED; // 固定不動的顏色</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坐標,坐標,當前方塊,方向</p><p>  Console c

67、sl; // 定義控制臺對象</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 ) // 逆時針翻轉(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( "俄羅斯方塊 " ); // 設置標題</p><p>  csl.RemoveCursor(); // 去處光標</p><p>  csl.SetWindowRect( 38-1, 21-1 ); // 設置窗體尺寸</p><p>

113、  csl.SetBufSize( 38, 21 ); // 設置緩沖尺寸</p><p>  csl.OutputStringNoMove( 0,0,bg ); // 輸出背景字符</p><p>  srand( time(0) ); // 設置隨機種子</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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論