c++課程設計俄羅斯方塊_第1頁
c++課程設計俄羅斯方塊_第2頁
c++課程設計俄羅斯方塊_第3頁
c++課程設計俄羅斯方塊_第4頁
c++課程設計俄羅斯方塊_第5頁
已閱讀5頁,還剩26頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、四 川 理 工 學 院課 程 設 計 書學院 計算機學院 專業 計算機科學與技術 班級 計科2014級 題目 俄羅斯方塊 教師 何紹榮 王非 學生 雷元剛 張柯 摘 要近年來隨著計算機在社會領域的不斷發展,C+作為一門高級語言,能夠實現面向對象編程。作為相較于C語言而言,C+設計無需復雜的程序設計環境,并且兼容C語言且比C語言更加安全和簡潔。俄羅斯方塊是大多數人兒時的游戲,它通過移動、旋轉和擺放游戲自動輸出的各種方塊,使之排列成完整的一行或多行并且消除得分。本課程設計完成了俄羅斯方塊的下落,旋轉,加速,預覽下一個方塊。以及音樂的播放和幫助文檔的創建,分數的讀取和記錄。通過編寫本程序,讓作者對消

2、息循環和窗口的創建有了深入的理解,并且理解了俄羅斯方塊的運行原理。同時掌握書寫程序設計開發文檔的能力。關鍵詞:窗口句柄;回調函數;位圖方塊;俄羅斯方塊; 目 錄前 言11.1 需求分析21.2 系統功能及結構簡介21.2.2 系統結構2第二章 詳細設計32.1界面設計32.1.1 UI界面設計32.2 格模塊功能設計42.2.1各按鈕功能的實現42.3游戲區域模塊62.4控制區域模塊62.5系統流程圖62.6具體函數設計72.7小結8第三章 測試計劃93.1測試方案93.2測試項目及功能93.3測試人員與目的93.4 測試結果9第四章 致謝13參 考 文 獻14附錄A15四川理工學院課程設計前

3、 言 俄羅斯方塊游戲由莫斯科科學學院程序員Alexei Pajitnov設計,發行于1985年。他在玩過一個拼圖游戲之后受到啟發,從而制作了一個以Electronica 60為平臺的俄羅斯方塊的游戲。后來經瓦丁格拉西莫夫移植到PC上,并且在莫斯科的電腦界傳播。帕基特諾夫因此開始小有名氣。隨后幾年,俄羅斯方塊開始登陸各大游戲主機。也曾因為版權問題引起過許多糾紛。但是拜亞洲盜版商人所賜,俄羅斯方塊被引進到國內,如今已成為家喻戶曉的著名游戲了。如今電子游戲業如此繁榮,作為電子游戲鼻祖的俄羅斯方塊起到了決定性的作用。如今俄羅斯方塊已有多種版本,有的加了幾種特殊形狀,有的可以使用道具,還有連機

4、的俄羅斯方塊等等。但萬變不離其宗,不管怎么變,游戲的基本規則是沒有變化的。游戲玩法十分簡單,如今已經成為一種公認的規則:屏幕頂部以隨機順序落下形狀各異的方塊,你要試圖用它們拼成沒有空隙的行列。堅持得時間越長,游戲速度也就變得越來越快,而游戲的吸引力就在于使你頂住碎塊的進攻,支撐的時間比上一次更長。由于玩法簡單,容易上手,如今仍是風靡全球,老少皆宜的一款游戲第一章 設計簡介及設計方案論述1.1 需求分析隨著社會的發展,越來越多的人開始接觸電腦,也有越來越多的人開始喜歡上玩電腦游戲,而俄羅斯方塊是一款經典的游戲,對于廣大人群都有吸引力,游戲可以讓人們得到放松,提高人們的工作效率。而好的人機交互界面

5、,也能給人以美好的感官享受。1.2 系統功能及結構簡介此俄羅斯方塊程序能夠實現顯示現一個方塊的形狀,以及顯示當前用戶的得分和等級并寫入到文件中,能夠暫停,重玩,退出,幫助文件,切換音樂,關閉音樂。在游戲的過程中,如果想要暫停,可以點擊菜單欄上的游戲里的暫停,或者點擊空格鍵暫停。再次點擊空格鍵游戲繼續。如果要切換音樂,可以點擊設置里的音樂選項,單擊2中不同風格的音樂。1.2.2 系統結構利用的是MFC對話框程序的構成框架,然后再利用Windows提供的資源,運用控件,自己制作了對話框和人機交互界面。如圖2.1所示。圖2.1 程序結構圖 第二章 詳細設計2.1界面設計2.1.1 UI界面設計打開V

6、C C+6.0新建一個工程,選擇對話框。便生成了一個窗口。然后打開ResouceView,點開Dialog,插入Dialog,利用控件,繪制各個按鈕。如圖2.1所示。圖2.1 俄羅斯方塊首先設計游戲的UI界面,先創建工具欄(第二行)添加位圖資源的ID,以及按鈕的個數,大小,寬度,高度,工具欄風格。添加tbButtons數組,IDM_NEW 新游戲,IDM_PAUSE 暫停,IDM_STOP 停止,IDM_MUSIC音樂,IDM_HELP幫助,并添加豎直的分割直線。然后為控件添加響應函數發出單機消息。編寫窗口消息循環和窗口回調函數,并且用Case用來捕獲消息并處理。2.2 格模塊功能設計2.2.

7、1各按鈕功能的實現(1)處理”暫?!卑粹o單擊暫停按鈕后,在message被捕獲后傳如回調函數后,判斷是否是消息,再將其轉化為int類型,并再使用case語句捕獲然后調用GamePause函數來處理。如果游戲結束就直接返回,如果游戲上一個狀態是開始,那么就顯示游戲暫停,并調用SendMessage()顯示游戲暫停,調用KillTimer()讓方塊停止下落,調用TetrisMusic()停止播放音樂。最后將狀態設置為取反。如圖2.2所示。 圖2.2 程序暫停圖(2)處理”停止”按鈕單擊停止按鈕后,窗口捕獲后,調用回調函數匹配IDM_STOP,如果y=-1,還沒有開始游戲,就直接返回。否則就調用Ga

8、meOver(),輸出游戲結束。如圖2.3所示。(3)處理”開始”按鈕單擊開始按鈕后,通過message捕獲后,執行GameStart()函數,開始初始化游戲的數據,初始化Matrix矩陣,并將其初始化的顏色的值賦值為-1。初始化方塊的位置為X=4,Y=-1。初始化標志變量,bStart和bGover都設置為FALSE。初始化游戲區,初始化計分器,等級設置為1級,慢行,分數都設置為0,最高分從文件中讀取。(4)處理”退出”按鈕單擊退出按鈕后,通過message捕獲后,執行SendMessage()后銷毀窗口。窗口也就隨著被系統銷毀了。(5)處理”幫助”按鈕當點擊幫助這個按鈕的時候,通過消息循環

9、,捕獲到的消息傳遞給回調函數進行處理,在成功的與IDM_HELP匹配后,調用DialogBox()彈出 一個消息框,這個消息框是我們實現建立好的,如圖所示。只需要通過函數來調用它就可以了。上面會有一些關于游戲的規則和游戲 方式的說明等。如圖2.4,2.5所示。圖2.3 游戲結束圖 圖2.4 幫助界面圖2.5 幫助消息框2.3游戲區域模塊圖2.6 游戲區結構圖2.4控制區域模塊圖2.7 控制模塊結構圖2.5系統流程圖 圖 2.8程序流程圖是否到頂部是否到頂部是否到頂部是否到頂部2.6具體函數設計LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);窗

10、口回調函數,在窗口運行過程中處理控件產生的消息以及鍵盤按下的消息,采用消息循環機制void SetNormalText(HWND,BOOL);字體設置函數,處理窗口顯示的字體格式,美化界面void GameUI(HWND);窗口控件的布局,以及控件的布局,圖形化界面的主要實現函數void DrawButton(LPARAM);繪制游戲區域的四個方向按鍵void DrawTetris(HDC,int,int,int);繪制要顯示出來的方塊,方塊顯示的主函數void DrawNext(HDC);繪制預覽區,顯示下一個方塊的主要函數void DrawMatrix(HDC);繪制游戲區域的實現函數,實

11、現游戲區域的繪制,使方塊在游戲區域中顯示,游戲運行的主要區域void RandomBlock(int *,int *,int *);隨機產生方塊的主要函數,能夠隨機的產生方塊BOOL CheckBlock(int,int);檢查越界函數,在方塊下落和旋轉過程中判斷是否可以執行void DropTetris(HWND);方塊下落函數,定時器產生消息后調用此函數,使方塊能夠實現下落功能void RankTetris(HWND);方塊旋轉實現函數,在下落過程中方塊可以旋轉成四種形狀中的任意一種,實現變形功能void GameStart(HWND);游戲開始時調用,實現游戲初始化功能void Game

12、Pause(HWND);游戲暫停時調用,實現游戲的暫停功能void GameOver(HWND);游戲結束時調用,實現游戲的掃尾工作int TetrisIni(int);加載配置文件,從配置文件中讀取數據。例如:最高分BOOL CALLBACK HelpDlgProc(HWND,UINT,WPARAM,LPARAM);幫助對話框的回調函數,實現對游戲操作者的幫助功能BOOL CALLBACK MusicDlgProc(HWND,UINT,WPARAM,LPARAM);音樂設置對話框的回調函數,實現對音樂選擇的功能void TetrisMusic(BOOL);音樂對話框調用此函數void Mus

13、icItem(int);音樂條目選擇調用此函數2.7小結在本次的課程設計中,充分認識到了自己的不足之處,以及許多需要學習的地方。在實驗中也遇到了許多問題,在界面設計與實現上花費了許多時間,對MFC的不熟悉也是進度緩慢的一個重要原因。并且在許多C+的基礎知識不是很扎實,暴露出問題。在老師的指導下,同學的幫助下完成了程序,也學到了許多新的知識。這次的課程設計,收獲了許多新知識,提高了分析問題和解決問題能力。在課程設計中學習了MFC的新知識,知道了更多的Windows API,在以后的學習中,相信這些新知識都能夠很好的幫助學習。并且在此次實驗中,能夠與同學更好的交流,與同一組的同學也有更好的了解,能

14、夠分工完成項目,增長了經驗。第三章 測試計劃 3.1測試方案 本游戲的測試方法采用檢查各個功能能否實現的方法3.2測試項目及功能3.2.1控制區功能測試開始按鍵:實現游戲的開始暫停按鍵:實現游戲暫停繼續按鍵:實現游戲繼續3.2.2菜單區功能測試新游戲菜單選項:游戲結束從新開始新一輪的游戲退出菜單選項:退出游戲開始菜單選項:開始游戲暫停菜單選項:暫停正在進行的游戲從新開始:重新開始游戲停止菜單選項:停止正在進行的游戲幫助提示菜單選項: 游戲控制鍵3.2.3游戲區功能測試:顯示俄羅斯方塊3.2.4預覽區域:顯示下一個方塊的樣式3.3測試人員與目的測試人員: 雷元剛 張柯測試目的:找出程序中存在的B

15、ug,并且完善相關功能。3.4 測試結果測試1:名稱:控制區功能測試 目的:測試控制區各個功能的按鈕。 內容: 包括游戲開始,暫停,繼續,停止 測試圖如圖3.1: 圖3.1 程序界面圖 測試結果:開始,暫停,繼續功能都正常作用。測試2:名稱:菜單區功能測試 目的:測試菜單區各個子菜單的功能 內容:游戲菜單的幫助選項菜單,音樂設置菜單以及子菜單下控件的正常工作。 測試圖如圖3.2:圖3.2 程序幫助界面圖測試結果:幫助對話框能夠正常工作,菜單項以及子菜單項也能夠作用。測試3:名稱:顯示區功能測試 目的:測試玩家操作的功能內容:實現方塊的移動,下落翻轉,消除升級等。測試圖如圖3.3: 圖3.3 游

16、戲結束圖測試結果:可以正常游戲,能夠開始,暫停,結束,重新開始,但是存在Bug,在結束的位圖不能很好消失,方塊還能夠在按鍵下運動,還存在問題,需要改正。第四章 致謝經過兩天的不懈努力,很興奮能完成一個C+編程,緊張的心終于可以平靜了。從中體會到以及學習到很多關于C+的很大方面的只是,是我更加了解了C+,并更加熟練了C+。在此次設計中我也遇到了很多的問題,都是經過查看老師所給的關于課程設計書和圖書館借的書才明白所用函數的用法,更重要的是上課時老師的細心教學,使我們學會了許多關于C+的基礎知識,為本次的課程設計打好了很好的基礎。從而使我能夠順利完成這次課程設計。在本次做課程設計過程中,要感謝何紹榮

17、老師的悉心關照,一直陪伴我們,并為大家講解不懂的地方,很是辛苦,也很是忙碌。還要感謝學院為我們此次課程設計提供機房,讓我們有了良好的學習環境可以利用做課程設計,從很大的程度上增強了我們對于C+學習的興趣。和小組成員一塊討論,多聽聽別人的想法,想辦法改進自己,這使我受益匪淺。只有比較才能知道自己的不足。結束課程設計時,明白了自己與實際所需的距離,因為現在畢業求職難,特別是對于像自己一般的人,更多的時侯是社會,職業選擇自己,而不是更多的自己去選擇職業,所以更應該把所學的知識靈活地用于實踐,這次課程設計就是對自己一個很好的鍛煉機會,無論任何的償試,都是自己以后很寶貴的經驗,更是對自己的一種充實。參

18、考 文 獻1 鄭莉,董淵,何江舟. C+語言程序設計M. 北京:清華大學出版社,2010. 2 譚浩強. C程序設計M. 北京:清華大學出版社,2010. 3 陳明. 軟件工程M. 北京:中國鐵道出版社,2011.4 Ian Sommerville. Software Engineering, Ninth Editi M. 北京:機械工業出版社,2011.5 Eric Freeman,ElElisabeth Freeman. HeadFirst設計模式M. 北京:中國電力出版社,2007.6 嚴蔚敏,吳偉民. 數據結構(C語言版)M. 北京:清華大學出版社,2015.7 鄧俊輝. 數據結構(C

19、+語言版) M. 北京:清華大學出版社,2010.附錄A部分源程序如下:Tetris.h頭文件如下:#include <windows.h>#include <time.h>#include <commctrl.h>#include <shlobj.h>#include "resource/resource.h"HINSTANCE hInst; /實例句柄HWND hStatus; /狀態欄句柄HMENU hMenu; /菜單句柄HWND hLevel,hLayer,hSorce,hSorceMax; /計分器句柄static

20、 TBBUTTON tbButtons =/WM_COMMAND 消息 /Bitmap/zero-based index of button image /idCommand/command to be sent when button pressed /fsState/button state-see below /fsStyle/ button style-see below /dwData/application-defined value /iString/zero-based index of button label string0,IDM_NEW,TBSTATE_ENABLED,

21、TBSTYLE_BUTTON,0,0,-1,1,IDM_PAUSE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1,2,IDM_STOP,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1,0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1,3,IDM_MUSIC,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1,4,IDM_HELP,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1,0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1; /

22、工具欄數據結構struct Block POINT a; POINT b; POINT c; POINT d; ; /方塊模型數據結構static Block Tetris74 = /(1)0,0,0,1,1,0,1,1, 0,0,0,1,1,0,1,1,0,0,0,1,1,0,1,1, 0,0,0,1,1,0,1,1,/ (2)0,0,1,0,1,1,2,1, 1,0,1,1,0,1,0,2,0,0,1,0,1,1,2,1, 1,0,1,1,0,1,0,2,/ / (2)1,0,2,0,0,1,1,1, 0,0,0,1,1,1,1,2,1,0,2,0,0,1,1,1, 0,0,0,1,1,1

23、,1,2,/(2)0,0,1,0,2,0,3,0, 1,0,1,1,1,2,1,3,0,0,1,0,2,0,3,0, 1,0,1,1,1,2,1,3,/ /(4)1,0,0,1,1,1,2,1, 0,0,0,1,1,1,0,2,0,0,1,0,2,0,1,1, 1,0,0,1,1,1,1,2,/(4)0,0,0,1,1,1,2,1, 0,0,1,0,0,1,0,2,0,0,1,0,2,0,2,1, 1,0,1,1,0,2,1,2,/ /(4)2,0,0,1,1,1,2,1, 0,0,0,1,0,2,1,2,0,0,1,0,2,0,0,1, 0,0,1,0,1,1,1,2; /七種方塊全部變形數

24、據結構int i, j ,c; /運動中的方塊數據 Tetrisij顏色值cint ii, jj, cc; /下一個方塊數據 同上int x, y; /運動中的方塊坐標值int Matrix1910; /游戲區矩陣BOOL bStart; /開始、暫停標志BOOL bGOver; /游戲結束標志HDC hDcBitmap; /裝載方格位圖用的DCHDC hDcAlert; /裝載提示位圖用的DCTCHAR szBuffer50; /緩沖字符串int iLevel,iSorce,iLayer,iSorceMax; /計分變量BOOL bMusicOn; /音樂開關int iMusicBG; /背

25、景音樂/全部函數聲明LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);void SetNormalText(HWND,BOOL);void GameUI(HWND);void DrawButton(LPARAM);void DrawTetris(HDC,int,int,int);void DrawNext(HDC);void DrawMatrix(HDC);void RandomBlock(int *,int *,int *);BOOL CheckBlock(int,int);void DropTetris(HWND);void RankTet

26、ris(HWND);void GameStart(HWND);void GamePause(HWND);void GameOver(HWND);int TetrisIni(int);BOOL CALLBACK HelpDlgProc(HWND,UINT,WPARAM,LPARAM);BOOL CALLBACK MusicDlgProc(HWND,UINT,WPARAM,LPARAM);void TetrisMusic(BOOL);void MusicItem(int);Tetris.cpp部分源程序如下:#include "Tetris.h"/初始化數據void GameS

27、tart(HWND hwnd)intm, n;HDChdc;hDcBitmap = CreateCompatibleDC(NULL);/初始化Matrix矩陣for ( m=0; m<=18; m+ )for ( n=0; n<=9; n+ )Matrixmn = -1; /Matrixmn處初始顏色值為-1/初始化方塊位置x = 4; y = -1;/初始化標志變量bStart = FALSE;bGOver = FALSE;/初始化游戲區hdc = GetDC(hwnd);DrawMatrix(hdc);ReleaseDC(hwnd,hdc);/初始化計分器iLevel = 1;

28、/函數wsprintf()將一系列的字符和數值輸入到緩沖區wsprintf(szBuffer,TEXT("%i"),iLevel);/改變指定窗口的標題欄的文本內容SetWindowText(hLevel,szBuffer); /級別iLayer = 0;wsprintf(szBuffer,TEXT("%i"),iLayer);SetWindowText(hLayer,szBuffer); /滿行if ( iSorce > iSorceMax ) iSorceMax = iSorce;wsprintf(szBuffer,TEXT("%i&

29、quot;),iSorceMax);SetWindowText(hSorceMax,szBuffer); /最高分iSorce = 0;wsprintf(szBuffer,TEXT("%i"),iSorce);SetWindowText(hSorce,szBuffer); /得分SendMessage(hStatus,SB_SETTEXT,0,(LPARAM)TEXT("空格鍵開始/暫停");SendMessage(hStatus,SB_SETTEXT,1,(LPARAM)TEXT("方向鍵上鍵控制變形,左、右、下鍵控制移動");hD

30、cAlert = CreateCompatibleDC(NULL); /清除提示DC在的位圖return;/暫停/繼續游戲void GamePause(HWND hwnd)if( bGOver ) return;if ( bStart )KillTimer(hwnd, 1);SendMessage(hStatus,SB_SETTEXT,0,(LPARAM)TEXT("游戲暫停");TetrisMusic(FALSE);elseSetTimer(hwnd, 1, (550-55*iLevel), NULL);SendMessage(hStatus,SB_SETTEXT,0,(

31、LPARAM)TEXT("游戲中 -");TetrisMusic(TRUE);bStart = !bStart;return;/游戲結束void GameOver(HWND hwnd)HDChdc;KillTimer(hwnd, 1);SelectObject(hDcAlert,LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP9);hdc = GetDC(hwnd);BitBlt(hdc,40,200,160,50,hDcAlert,0,0,SRCCOPY);/繪制提示語ReleaseDC(hwnd,hdc);SendMessage(h

32、Status,SB_SETTEXT,0,(LPARAM)TEXT("游戲結束");bGOver = TRUE;x = 4; y = -1;TetrisMusic(FALSE);return;/用Matrix中的數據繪制游戲區void DrawMatrix(HDC hdc)intm, n;/繪制Matrix矩陣for ( m=0; m<=18; m+ )for ( n=0; n<=9; n+ )if ( Matrixmn = -1 )PatBlt(hdc,20+n*20,40+m*20,20,20,BLACKNESS);/該顏色為黑色elseSelectObjec

33、t(hDcBitmap,LoadBitmap(hInst,MAKEINTRESOURCE(120+Matrixmn); BitBlt(hdc,20+n*20,40+m*20,20,20,hDcBitmap,0,0,SRCCOPY);return;/繪制方塊void DrawTetris(HDC hdc, int iOffsetX, int iOffsetY, int iRank)int iX, iY, iJ;if ( y = -1 ) return;/如果方塊平移過則擦除原來的方塊位置if ( iOffsetX != 0 | iOffsetY != 0 )iX = x + Tetrisij.a

34、.x - iOffsetX;iY = y + Tetrisij.a.y - iOffsetY;PatBlt(hdc,20+iX*20,40+iY*20,20,20,BLACKNESS);iX = x + Tetrisij.b.x - iOffsetX;iY = y + Tetrisij.b.y - iOffsetY;PatBlt(hdc,20+iX*20,40+iY*20,20,20,BLACKNESS);iX = x + Tetrisij.c.x - iOffsetX;iY = y + Tetrisij.c.y - iOffsetY;PatBlt(hdc,20+iX*20,40+iY*20,

35、20,20,BLACKNESS);iX = x + Tetrisij.d.x - iOffsetX;iY = y + Tetrisij.d.y - iOffsetY;PatBlt(hdc,20+iX*20,40+iY*20,20,20,BLACKNESS);/如果方塊旋轉過則擦除原來的方塊位置if ( iRank != 0 )iJ = (j=0) ? 3 : j-1;iX = x + TetrisiiJ.a.x;iY = y + TetrisiiJ.a.y;PatBlt(hdc,20+iX*20,40+iY*20,20,20,BLACKNESS);iX = x + TetrisiiJ.b.x;

36、iY = y + TetrisiiJ.b.y;PatBlt(hdc,20+iX*20,40+iY*20,20,20,BLACKNESS);iX = x + TetrisiiJ.c.x;iY = y + TetrisiiJ.c.y;PatBlt(hdc,20+iX*20,40+iY*20,20,20,BLACKNESS);iX = x + TetrisiiJ.d.x;iY = y + TetrisiiJ.d.y;PatBlt(hdc,20+iX*20,40+iY*20,20,20,BLACKNESS);/繪制新位置方塊SelectObject(hDcBitmap,LoadBitmap(hInst

37、,MAKEINTRESOURCE(120+c);iX = x + Tetrisij.a.x;iY = y + Tetrisij.a.y;BitBlt(hdc,20+iX*20,40+iY*20,20,20,hDcBitmap,0,0,SRCCOPY);iX = x + Tetrisij.b.x;iY = y + Tetrisij.b.y;BitBlt(hdc,20+iX*20,40+iY*20,20,20,hDcBitmap,0,0,SRCCOPY);iX = x + Tetrisij.c.x;iY = y + Tetrisij.c.y;BitBlt(hdc,20+iX*20,40+iY*20

38、,20,20,hDcBitmap,0,0,SRCCOPY);iX = x + Tetrisij.d.x;iY = y + Tetrisij.d.y;BitBlt(hdc,20+iX*20,40+iY*20,20,20,hDcBitmap,0,0,SRCCOPY);return;/繪制預覽區void DrawNext(HDC hdc)RECTrc;intiX, iY;rc.left = 240; rc.top = 40;rc.right = 340; rc.bottom = 140;FillRect(hdc,&rc,CreateSolidBrush(RGB(0,0,0);/繪制預覽方塊S

39、electObject(hDcBitmap,LoadBitmap(hInst,MAKEINTRESOURCE(120+cc);iX = 1 + Tetrisiijj.a.x; iY = 1 + Tetrisiijj.a.y;BitBlt(hdc,240+iX*20,40+iY*20,20,20,hDcBitmap,0,0,SRCCOPY);iX = 1 + Tetrisiijj.b.x; iY = 1 + Tetrisiijj.b.y;BitBlt(hdc,240+iX*20,40+iY*20,20,20,hDcBitmap,0,0,SRCCOPY);iX = 1 + Tetrisiijj.c

40、.x; iY = 1 + Tetrisiijj.c.y;BitBlt(hdc,240+iX*20,40+iY*20,20,20,hDcBitmap,0,0,SRCCOPY);iX = 1 + Tetrisiijj.d.x; iY = 1 + Tetrisiijj.d.y;BitBlt(hdc,240+iX*20,40+iY*20,20,20,hDcBitmap,0,0,SRCCOPY);return;/隨機產生新的方塊數據void RandomBlock(int * l, int * m, int * n)srand(unsigned)time(NULL);* l = rand() % 7;*

41、 m = rand() % 4;* n = rand() % 7;return;/方塊越界檢測BOOL CheckBlock(int x, int y)intm, n;/初始位置不允許左右移動if( y = -1 ) return false;if ( Tetrisij.a.x+x<0 | Tetrisij.a.x+x>9 | Tetrisij.a.y+y>18 ) return FALSE;if ( Tetrisij.b.x+x<0 | Tetrisij.b.x+x>9 | Tetrisij.b.y+y>18 ) return FALSE;if ( Tet

42、risij.c.x+x<0 | Tetrisij.c.x+x>9 | Tetrisij.c.y+y>18 ) return FALSE;if ( Tetrisij.d.x+x<0 | Tetrisij.d.x+x>9 | Tetrisij.d.y+y>18 ) return FALSE;/方塊相遇檢測for ( m=0; m<=18; m+ )for ( n=0; n<=9; n+ )if ( m=Tetrisij.a.y+y && n=Tetrisij.a.x+x && Matrixmn!=-1 ) return

43、 FALSE;if ( m=Tetrisij.b.y+y && n=Tetrisij.b.x+x && Matrixmn!=-1 ) return FALSE;if ( m=Tetrisij.c.y+y && n=Tetrisij.c.x+x && Matrixmn!=-1 ) return FALSE;if ( m=Tetrisij.d.y+y && n=Tetrisij.d.x+x && Matrixmn!=-1 ) return FALSE;return TRUE;/方塊下落void DropTetris(HWND hwnd)BOOLbReDraw;int l, m, n;HDC hdc;/檢測下一個方塊位if ( CheckBlock(x,y+1) ) /可以下落hdc = GetDC(hwnd);if ( y = -1 )/傳遞方塊并重繪預覽區i = ii; j = jj; c = cc;RandomBlock(&ii,&jj,&cc);DrawNext(hdc);/繪制預覽區/繪制新方塊y +;DrawTe

溫馨提示

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

評論

0/150

提交評論