二維數組在俄羅斯方塊游戲編程中的應用

上傳人:冷*** 文檔編號:22512409 上傳時間:2021-05-27 格式:DOCX 頁數:3 大小:13.57KB
收藏 版權申訴 舉報 下載
二維數組在俄羅斯方塊游戲編程中的應用_第1頁
第1頁 / 共3頁
二維數組在俄羅斯方塊游戲編程中的應用_第2頁
第2頁 / 共3頁
二維數組在俄羅斯方塊游戲編程中的應用_第3頁
第3頁 / 共3頁

最后一頁預覽完了!喜歡就下載吧,查找使用更方便

25 積分

下載資源

資源描述:

《二維數組在俄羅斯方塊游戲編程中的應用》由會員分享,可在線閱讀,更多相關《二維數組在俄羅斯方塊游戲編程中的應用(3頁珍藏版)》請在裝配圖網上搜索。

1、二維數組在俄羅斯方塊游戲編程中的應用 摘 要:在俄羅斯方塊游戲編程過程中,二維數組起到了至關重要的作用,我們通過控制二維數組元素的值來達到控制方塊的目的,在游戲中的障礙判斷、行滿判斷及其各種形狀方塊的左右移動,實際上都需要借助于它。本文借俄羅斯方塊游戲編程來指導大家對二維數組的學習和應用。 關鍵詞:二維數組;坐標;位圖(DIB)資源   俄羅斯方塊是大家都很熟悉的游戲,在其Windows應用程序的開發(fā)過程中,總的來說需要解決幾個關鍵性的問題:其一是如何實現(xiàn)各個方塊圖案形狀之間的轉換;其二是在方塊圖案下落時如何判斷下方有無障礙;其三就是如何判斷一行是否填滿及其消除的

2、辦法。這些功能都需要采用一定的算法來實現(xiàn)。   在程序的開發(fā)過程中,我們采用了二維數組的辦法來控制整個方框的狀態(tài),從而比較容易理解的解決了上述的三個主要問題。此應用程序是采用Microsoft Visual C++程序語言在Windows 98及Windows XP上運行成功,下面就詳細介紹二維數組在程序中的應用方法。   首先,我們需要分析方塊圖案的種類及其狀態(tài)的問題。典型的也是最常見的俄羅斯方塊游戲中共有7類圖案,每一類圖案又有若干變形的狀態(tài)。為了讓大家直觀了解,所有圖案和變形狀態(tài)如圖一所示。    圖一   在某一類圖案下落的過程中,我們可以通過鍵盤控制此類圖案各狀態(tài)間的轉換。由于

3、方塊是在Windows的“可視”窗口中顯示出來的,因此我們還需要調用位圖(DIB)資源。實際上在Windows操作系統(tǒng)中每一個位圖資源都是以矩形的形式定義的(即定義位圖資源的寬和高)。如果對每一類圖案的每一個變形狀態(tài)都用不同的位圖來表示,則由圖一可知總共要定義19幅位圖,這樣不但增加了繪制位圖的工作量,而且在變形狀態(tài)間轉換時容易引起閃爍和位置抖動。而更為麻煩的是它非常不利于下落時障礙判斷和行是否填滿狀態(tài)的判斷??紤]到每一種圖案實際上是由四個大小完全相同的小方塊所組成。四個這樣的小方塊通過不同的位置組合就可以形成上述的七大類19種狀態(tài)的圖案。因此實際上我們只需要繪制一幅小方塊的DIB位圖。由于連

4、續(xù)調用四次位圖的時間很短,不會超過人眼睛的視覺停留時間,因此我們看上去是一幅完整的位圖。   我們把各個小方塊的左上角坐標分別用(cx1,cy1),(cx2,cy2),(cx3,cy3),(cx4,cy4)來代表,程序中控制這些坐標之間的關系就相當于控制了小方塊組合的形狀,圖二就表明了第三類圖案的變形狀態(tài)轉換情況。      圖二   下面來定義游戲窗口,我們假定游戲的左上角坐標點為(ulPosx,ulPosy),邊框寬度定義為frmwidth,邊框內的寬和高分別是16mWidth和20mHeight。其中mWidth和mHeight分別是小方塊的寬和高,我們通常設定兩者相等。我們可以理

5、解,在功能實現(xiàn)上,可以看做是先擦除圖案,往下移動一個mHeight距離后再將圖案顯示出來的過程。若移動一個mHeight距離后,任一個小方塊的左上角縱坐標都沒有超出方框底線,并且任一小方塊當前所處位置所對應的數組元素都不等于1,就說明當前圖案沒有到底,也沒有遇到障礙物,這是我們可以直接將其顯示出來;否則,在顯示之前應當向上移動一個mHeight距離,即取消剛才所做的距離移動。在這里擦除圖案和顯示圖案分別用函數EraseDesign()和PaintDesign()來實現(xiàn);函數CalcStatus()的作用是計算public變量i1-i4、j1-j4的值,這里擦除圖案和顯示圖案分別用函數Erase

6、Design()和PaintDesign()來實現(xiàn)。函數Calcstatus()的作用是計算public變量i1到i4、j1到j4的值,程序代碼如下: Void CBlocks View::OnTimer(UINT nIDEvent) {EraseDesign(); cy1+=mHeight; cy2+=mHeight; cy3+=mHeight; cy4+=mHeight; CalcStatus(); if (cy1>(ulPosy+frmwidth+19*mHeight)︱︱cy2>(ulPosy+frmwidth+19*mHeight)︱︱ cy3>(ulPosy+frmwidt

7、h+19*mHeight)︱︱cy4>(ulPosy+frmwidth+19*mHeight)︱︱ (array==1)︱︱(array==1) ︱︱(array==1) ︱︱(array==1)) {cy1-=mHeight; cy2-=mHeight; cy3-=mHeight; cy4-=mHeight; PaintDesign(); array=1; array=1; array=1; array=1;} else PaintDesign();} void CBlocksView:: EraseDesign()//擦除方塊 {CClientDC dc(this); CBrush whi

8、teBrush(RGB(255,255,255)), CRect rect1(cx1,cy1,cx1+mWidth,cy1+mHeight); CRect rect2(cx2,cy2,cx2+mWidth,cy2+mHeight); CRect rect3(cx3,cy3,cx3+mWidth,cy3+mHeight); CRect rect4(cx4,cy4,cx4+mWidth,cy4+mHeight); dc.FillRect(&rect1,&whiteBrush); dc.FillRect(&rect2,&whiteBrush); dc.FillRect(&rect3,&whiteBr

9、ush); dc.FillRect(&rect4,&whiteBrush);} void CBlocksView:: PaintDesign()//繪制方塊 { CClientDC dc(this);CDC ppDC;CBitmap Bmp;Bmp.LoadBitmap(ID-101);ppDC,CreateCompatibleDC(&dc); CBitmap*m-OldBmp=ppDC.SelectObject(&Bmp);dc.BitBlt(cx1,cy1,mWidth,mHeight,&ppDC,0,0,SRCCOPY); dc.BitBlt(cx2,cy2,mWidth,mHeight

10、,&ppDC,0,0,SRCCOPY); dc.BitBlt(cx3,cy3,mWidth,mHeight,&ppDC,0,0,SRCCOPY); dc.BitBlt(cx4,cy4,mWidth,mHeight,&ppDC,0,0,SRCCOPY); ppDC.SelectObject(m-OldBap);} void CBlocksView::CalcStatus()//方塊坐標->行列數 {i1=(cy1-ulPosy-frmwidth)/mHeight;j1=( cx1-ulPosx-frmwidth)/mWidth;同樣可得i2-i4,j2-j4。 有了二維數組的概念以后,我們很容

11、易進行一行填滿與否的判斷,只要掃描二維數組的各元素,如果一行的所有元素都等于1,則此行填滿,予以消除,然后將此行以上各行狀態(tài)依次下移,注意:如果相鄰兩行都填滿時,要多處理一次(程序中的i++很重要)代碼如下: void CBlocksView::DetectFill()//判斷此行是否填滿 { CClientDC dc(this); CBrush whiteBrush(RGB(255,255,255)), ;CDC ppDC; CBitmap Bmp; Bmp.LoadBitmap (ID-101);ppDC,CreateCompatibleDC(&dc); CBitmap*m-OldBmp=

12、ppDC.SelectObject(&Bmp); for(int i=19;i>=0;i--){BOOL IsFilled=TURE;for(int j=0;j=1;k--)for(int l=0;l<=15;l++) array=array; for(int n=1;n<=i;n++)for(int m=0;m<=15;m++){if (array==1) dc.BitBlt(m*mWidth+ulPosx+frmwidth,n*mHeight+ulPosy+frmwidth,mWidth,mHeight,&ppDC,0,0,SRCCOPY); else{CRect rect(m*mWidt

13、h+ulPosx+frmwidth+mWidth, n*mHeight+ulPosy+frmwidth+mHeight), dc.FillRect(&rect,&whiteBrush);}} i++;}}ppDC,SelectObject(m-OldBmp);}   可以看出,在程序的開發(fā)處理中,二維數組起到至關重要的作用,我們通過控制二維數組元素的值來達到控制方塊的目的,無論是障礙判斷、行滿判斷還是左右移動都可以借助于它。當然,二維數組并不是唯一可行的算法,而且顯得計算有些繁瑣,本文僅是借這個家喻戶曉的游戲的編程來加深讀者對二維數組的理解,而并不希望在程序的編寫上局限于它。   參考文獻: 【1】 《程序設計基礎教程-C語言版》,馮山 主編,馬廷淮副主編,科學出版社 【2】 C++中二維數組與指針關系的剖析,丁衛(wèi)平等,南通工學院學報 【3】 《C語言教程》,譚浩強 主編,清華大學出版社

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

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網版權所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對上載內容本身不做任何修改或編輯。若文檔所含內容侵犯了您的版權或隱私,請立即通知裝配圖網,我們立即給予刪除!