第8章 游戲?qū)嵗齙第1頁(yè)
第8章 游戲?qū)嵗齙第2頁(yè)
第8章 游戲?qū)嵗齙第3頁(yè)
第8章 游戲?qū)嵗齙第4頁(yè)
第8章 游戲?qū)嵗齙第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、VC+程序設(shè)計(jì)主講教師:賈澎濤主講教師:賈澎濤第八章 俄羅斯游戲開(kāi)發(fā)綜合前面所學(xué)的知識(shí),熟悉面向?qū)ο蟪绦蛟O(shè)綜合前面所學(xué)的知識(shí),熟悉面向?qū)ο蟪绦蛟O(shè)計(jì)的全過(guò)程,即面向?qū)ο蟮姆治?、面向?qū)ο笥?jì)的全過(guò)程,即面向?qū)ο蟮姆治?、面向?qū)ο蟮脑O(shè)計(jì)、面向?qū)ο蟮膶?shí)現(xiàn)三個(gè)過(guò)程,創(chuàng)建一的設(shè)計(jì)、面向?qū)ο蟮膶?shí)現(xiàn)三個(gè)過(guò)程,創(chuàng)建一個(gè)實(shí)用的游戲程序。個(gè)實(shí)用的游戲程序。 游戲說(shuō)明及規(guī)則游戲說(shuō)明及規(guī)則n俄羅斯俄羅斯方塊是由俄羅斯人阿列克謝方塊是由俄羅斯人阿列克謝帕基帕基特諾夫發(fā)明的。俄羅斯方塊原名是俄語(yǔ)特諾夫發(fā)明的。俄羅斯方塊原名是俄語(yǔ)(英語(yǔ)是(英語(yǔ)是Tetris),這個(gè)名字來(lái)),這個(gè)名字來(lái)源于源于希臘希臘語(yǔ)語(yǔ)tetra,意思是,意思

2、是“四四”,而游,而游戲的作者最喜歡網(wǎng)球(戲的作者最喜歡網(wǎng)球(tennis)。于是,)。于是,他把兩個(gè)詞他把兩個(gè)詞tetra和和tennis合而為一,命合而為一,命名為名為Tetris,這也就是俄羅斯方塊名字,這也就是俄羅斯方塊名字的由來(lái)。的由來(lái)。nTetris游戲在一個(gè)游戲在一個(gè)m*n的矩形框內(nèi)進(jìn)行。游戲開(kāi)始時(shí),的矩形框內(nèi)進(jìn)行。游戲開(kāi)始時(shí),矩形框的頂部會(huì)隨機(jī)出現(xiàn)一個(gè)由四個(gè)小方塊構(gòu)成的磚矩形框的頂部會(huì)隨機(jī)出現(xiàn)一個(gè)由四個(gè)小方塊構(gòu)成的磚塊,每過(guò)一個(gè)很短的時(shí)間(我們稱這個(gè)時(shí)間為一個(gè)塊,每過(guò)一個(gè)很短的時(shí)間(我們稱這個(gè)時(shí)間為一個(gè)tick),它就會(huì)下落一格,直到它碰到矩形框的底部,),它就會(huì)下落一格,直到

3、它碰到矩形框的底部,然后再過(guò)一個(gè)然后再過(guò)一個(gè)tick它就會(huì)固定在矩形框的底部,成為它就會(huì)固定在矩形框的底部,成為固定塊。接著再過(guò)一個(gè)固定塊。接著再過(guò)一個(gè)tick頂部又會(huì)出現(xiàn)下一個(gè)隨機(jī)頂部又會(huì)出現(xiàn)下一個(gè)隨機(jī)形狀,同樣每隔一個(gè)形狀,同樣每隔一個(gè)tick都會(huì)下落,直到接觸到底部都會(huì)下落,直到接觸到底部或者接觸到下面的固定塊時(shí),再過(guò)一個(gè)或者接觸到下面的固定塊時(shí),再過(guò)一個(gè)tick它也會(huì)成它也會(huì)成為固定塊,再過(guò)一個(gè)為固定塊,再過(guò)一個(gè)tick之后會(huì)進(jìn)行檢查,發(fā)現(xiàn)有充之后會(huì)進(jìn)行檢查,發(fā)現(xiàn)有充滿方塊的行則會(huì)消除它,同時(shí)頂部出現(xiàn)下一個(gè)隨機(jī)形滿方塊的行則會(huì)消除它,同時(shí)頂部出現(xiàn)下一個(gè)隨機(jī)形狀。直到頂部出現(xiàn)的隨機(jī)形狀在

4、剛出現(xiàn)時(shí)就與固定塊狀。直到頂部出現(xiàn)的隨機(jī)形狀在剛出現(xiàn)時(shí)就與固定塊重疊,表示游戲結(jié)束。重疊,表示游戲結(jié)束。操作說(shuō)明:n光標(biāo)左鍵光標(biāo)左鍵左移左移光標(biāo)右鍵光標(biāo)右鍵右移右移光標(biāo)上鍵光標(biāo)上鍵翻轉(zhuǎn)翻轉(zhuǎn)光標(biāo)下鍵光標(biāo)下鍵下移下移Tetris游戲的分析、設(shè)計(jì)與實(shí)現(xiàn)游戲的分析、設(shè)計(jì)與實(shí)現(xiàn) n1. Tetris游戲的矩形框類游戲的矩形框類CBinn首先我們應(yīng)該描述首先我們應(yīng)該描述Tetris游戲的矩形框。這里游戲的矩形框。這里我們定義一個(gè)我們定義一個(gè)CBin類描述類描述Tetris游戲的矩形框。游戲的矩形框。對(duì)矩形框進(jìn)行分析,它應(yīng)該有三個(gè)私有的數(shù)據(jù)對(duì)矩形框進(jìn)行分析,它應(yīng)該有三個(gè)私有的數(shù)據(jù)成員為:成員為:image,

5、 width和和height。CBin類將類將Tetris游戲的矩形框描述成為一個(gè)二維數(shù)組游戲的矩形框描述成為一個(gè)二維數(shù)組image, 變量變量width和和height存儲(chǔ)了存儲(chǔ)了image的的維數(shù)。如圖維數(shù)。如圖1所示。有磚塊的地方的值為磚塊所示。有磚塊的地方的值為磚塊的顏色值(例如的顏色值(例如1為紅色,為紅色,4為藍(lán)色),沒(méi)有磚為藍(lán)色),沒(méi)有磚塊的地方應(yīng)為塊的地方應(yīng)為0值。值。 函數(shù)名稱函數(shù)名稱函數(shù)說(shuō)明函數(shù)說(shuō)明CBin(unsigned int w, unsigned int h) 構(gòu)造函數(shù),用來(lái)初始化數(shù)據(jù)成員構(gòu)造函數(shù),用來(lái)初始化數(shù)據(jù)成員width 和和 height,并為,并為ima

6、ge分配空分配空間并初始化。間并初始化。CBin()析構(gòu)函數(shù),刪除在構(gòu)造函數(shù)中為析構(gòu)函數(shù),刪除在構(gòu)造函數(shù)中為image分配的空間。分配的空間。void getImage(unsigned char* destImage)將將image的數(shù)據(jù)拷貝到的數(shù)據(jù)拷貝到 destImage. 你可以假設(shè)你可以假設(shè)destImage指向的空間足指向的空間足夠容納夠容納image的數(shù)據(jù)的數(shù)據(jù).void setImage(unsigned char* srcImage)把把srcImage 中的數(shù)據(jù)拷貝到中的數(shù)據(jù)拷貝到image. 你可以假設(shè)你可以假設(shè)srcImage是一個(gè)合法的是一個(gè)合法的指針指針.unsig

7、ned int removeFullLines()檢查檢查image,如果任何一行完全填,如果任何一行完全填滿,則刪除這一行,并讓上面行的滿,則刪除這一行,并讓上面行的數(shù)據(jù)下移一行,返回刪除的總行數(shù)。數(shù)據(jù)下移一行,返回刪除的總行數(shù)。 n現(xiàn)在來(lái)完成一些現(xiàn)在來(lái)完成一些Tetris磚塊類。磚塊類。Tetris的的常用磚塊見(jiàn)下圖。經(jīng)分析所有的磚塊都常用磚塊見(jiàn)下圖。經(jīng)分析所有的磚塊都有共同的特征,因此我們定義了一個(gè)基有共同的特征,因此我們定義了一個(gè)基類類CBrick,這是一個(gè)抽象類。,這是一個(gè)抽象類。 圖圖11.2 Tetris的常用磚塊的常用磚塊 nCIBrick 類有四個(gè)數(shù)據(jù)成員類有四個(gè)數(shù)據(jù)成員:

8、orientation, posX, posY, and colour。orientation 表示了表示了“I”磚塊的四個(gè)狀磚塊的四個(gè)狀態(tài),可能的取值為態(tài),可能的取值為 0, 1, 2, 3,磚塊的磚塊的狀態(tài)如圖狀態(tài)如圖11.4所示,由狀態(tài)所示,由狀態(tài)0到狀態(tài)到狀態(tài)1是是“I”磚塊固定一個(gè)特定點(diǎn)順時(shí)針旋轉(zhuǎn)磚塊固定一個(gè)特定點(diǎn)順時(shí)針旋轉(zhuǎn)90度。依此類推,狀態(tài)度。依此類推,狀態(tài)3的下一個(gè)狀態(tài)是狀的下一個(gè)狀態(tài)是狀態(tài)態(tài)0。posX, posY記錄了特定點(diǎn)(圖中記錄了特定點(diǎn)(圖中黑點(diǎn))的坐標(biāo)。黑點(diǎn))的坐標(biāo)。Colour為磚塊的顏色值。為磚塊的顏色值。 可視化設(shè)計(jì)n實(shí)驗(yàn)指導(dǎo)書實(shí)驗(yàn)指導(dǎo)書P105雙緩沖雙緩沖

9、n普通繪圖方式與雙緩沖繪圖方式的區(qū)別普通繪圖方式與雙緩沖繪圖方式的區(qū)別在于:普通繪圖方式可以看做是在屏幕在于:普通繪圖方式可以看做是在屏幕上直接繪制圖形,雙緩沖繪圖方式是現(xiàn)上直接繪制圖形,雙緩沖繪圖方式是現(xiàn)在內(nèi)存中創(chuàng)建的在內(nèi)存中創(chuàng)建的“虛擬屏幕虛擬屏幕”上繪制,上繪制,然后將繪制完成的圖形一次性然后將繪制完成的圖形一次性“拷貝拷貝”到屏幕上。到屏幕上。n1. 在上述實(shí)驗(yàn)的基礎(chǔ)上,實(shí)現(xiàn)其它類型在上述實(shí)驗(yàn)的基礎(chǔ)上,實(shí)現(xiàn)其它類型的磚塊。的磚塊。n2. 進(jìn)一步完善程序,實(shí)現(xiàn)兩個(gè)人能同時(shí)進(jìn)一步完善程序,實(shí)現(xiàn)兩個(gè)人能同時(shí)玩的游戲模式。玩的游戲模式。 另一種另一種Tetris實(shí)現(xiàn)思路實(shí)現(xiàn)思路n前面的實(shí)例為了

10、讓大家應(yīng)用前面的實(shí)例為了讓大家應(yīng)用C+的封裝的封裝性、繼承性和多態(tài)性,代碼顯得復(fù)雜。性、繼承性和多態(tài)性,代碼顯得復(fù)雜。下面我們使用數(shù)學(xué)的方法簡(jiǎn)化代碼下面我們使用數(shù)學(xué)的方法簡(jiǎn)化代碼n重新設(shè)計(jì)重新設(shè)計(jì)CBrick類類n觀察方塊,可以發(fā)現(xiàn),所有的方塊都有觀察方塊,可以發(fā)現(xiàn),所有的方塊都有4個(gè)小的正方形組成,那么可以使用個(gè)小的正方形組成,那么可以使用4個(gè)坐個(gè)坐標(biāo)分別表示標(biāo)分別表示4個(gè)小方塊所處的位置,從而個(gè)小方塊所處的位置,從而確定方塊的類型。確定方塊的類型。n左上角的小方塊坐標(biāo)為(左上角的小方塊坐標(biāo)為(0,0),向右為),向右為X軸正方向,向下為軸正方向,向下為Y軸正方向軸正方向static int

11、 brickX74=0,1,2,3,0,1,1,2,2,1,1,0,1,1,2,2 ,0,0,1,2,2,2,1,0,0,1,1,2;static int brickY74=0,0,0,0,0,0,1,1,0,0,1,1,0,1,0,1 ,0,1,1,1,0,1,1,1,0,0,1,0;#ifndef BRICK_H#define BRICK_H#include bin.hstatic int brickX74=0,1,2,3,0,1,1,2,2,1,1,0,1,1,2,2,0,0,1,2,2,2,1,0,0,1,1,2;staticint brickY74=0,0,0,0,0,0,1,1,0

12、,0,1,1,0,1,0,1,0,1,1,1,0,1,1,1,0,0,1,0;class CBrick protected: int colour; unsigned int x4; unsigned int y4; public: CBrick(); unsigned char getColour() return colour; ; void setColour(unsigned char newColour) colour = newColour; ; bool move(int offsetX,int offsetY,unsigned char* binImage); /移動(dòng)移動(dòng) bo

13、ol rotate(unsigned char* binImage); /旋轉(zhuǎn)旋轉(zhuǎn) void operator(unsigned char* binImage);/輸出圖像輸出圖像;#endif構(gòu)造函數(shù)構(gòu)造函數(shù)CBrick:CBrick()colour = (rand() % 7)+1;for(int i=0;i4;i+)xi=brickXcolour-1i;yi=brickYcolour-1i;移動(dòng)方塊移動(dòng)方塊bool CBrick:move(int offsetX,int offsetY,unsigned char* binImage)int i;int X4,Y4;for(i=0;i4;

14、i+)/針對(duì)每一個(gè)小方格的移動(dòng)針對(duì)每一個(gè)小方格的移動(dòng)Xi=xi+offsetX;Yi=yi+offsetY;if(Xi=10|Yi=20) /判斷是否能夠移動(dòng)成功判斷是否能夠移動(dòng)成功return false;if(binImageYiXi!=0)return false;for(i=0;i4;i+)xi=Xi;yi=Yi;return true;旋轉(zhuǎn)旋轉(zhuǎn)n點(diǎn)點(diǎn)P(x,y)到原點(diǎn)到原點(diǎn)O繞繞O點(diǎn)逆時(shí)針旋轉(zhuǎn)角度點(diǎn)逆時(shí)針旋轉(zhuǎn)角度后到點(diǎn)后到點(diǎn)P(x,y)。由三角函數(shù)的幾何意由三角函數(shù)的幾何意義,有義,有x = r*cos ,y = r*sin 和和x = r*cos( +) , y = r*sin(

15、+ ),推推出:出: x = x * cos y * sin y = y * cos + x * sin n當(dāng)把旋轉(zhuǎn)點(diǎn)一般化為當(dāng)把旋轉(zhuǎn)點(diǎn)一般化為Q(x0,y0),得到:得到: x = x0 + (x - x0) cos - (y - y0) sin y = y0 + (y - y0) cos + (x - x0) sin 旋轉(zhuǎn)旋轉(zhuǎn)n任意點(diǎn)(任意點(diǎn)(x, y)繞其中心繞其中心 (x0, y0)逆時(shí)針旋轉(zhuǎn)逆時(shí)針旋轉(zhuǎn)angle角度后,新的坐標(biāo)位置(角度后,新的坐標(biāo)位置(x1, y1)的計(jì)算公式為:的計(jì)算公式為: x1 = (x x0) cos (y y0) sin x0; y1= (x x0) si

16、n (y y0) cos y0; n將坐標(biāo)將坐標(biāo)(x,y)繞繞(x0,y0)順時(shí)針旋轉(zhuǎn)順時(shí)針旋轉(zhuǎn)90度度(相當(dāng)相當(dāng)于逆時(shí)針于逆時(shí)針-90度度),得到的新坐標(biāo),得到的新坐標(biāo)(x1,y1),則,則滿足:滿足:nx1=x0+y-y0ny1=y0+x0-x旋轉(zhuǎn)bool CBrick:rotate(unsigned char* binImage)int i;int xt4,yt4;for(i=0;i4;i+)/進(jìn)行順時(shí)針進(jìn)行順時(shí)針90度坐標(biāo)變換度坐標(biāo)變換xti=yi+x1-y1;yti=x1+y1-xi;if(xti=10|yti=20)return false;if(binImageytixti!=0

17、)return false;for(i=0;i(unsigned char* binImage) for(int i=0;igetWidth();binHeight=bin-getHeight();/ start the game if (!brickInFlight&!gameOver) activeBrick = new CBrick; bin-getImage(outputImage); notCollide=activeBrick-move(binWidth/2, 0,outputImage); if (notCollide) brickInFlight = 1; active

18、Brick-operator(outputImage); Invalidate(FALSE); else /程序結(jié)束程序結(jié)束 gameOver = 1; delete activeBrick; brickInFlight = 0; if (brickInFlight&!gameOver) bin-getImage(outputImage); notCollide = activeBrick-move(0,1,outputImage); /下落下落 if (notCollide) activeBrick-operator(outputImage); else brickInFlight

19、= 0; /bin-getImage(outputImage); activeBrick-operator(outputImage); bin-setImage(outputImage);Invalidate(FALSE); numLines = numLines + bin-removeFullLines(); bin-getImage(outputImage); Invalidate(FALSE); if (gameOver) KillTimer(0);if(MessageBox(輸了吧,還玩么輸了吧,還玩么,提示提示,MB_YESNO)=IDYES)OnGameStart();else /exit(0); PostQuitMessage(0);/這兩種方法都可以退出程序這兩種方法都可以退出程序 CView:

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論