




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、VC+程序設(shè)計主講教師:賈澎濤主講教師:賈澎濤第八章 俄羅斯游戲開發(fā)綜合前面所學(xué)的知識,熟悉面向?qū)ο蟪绦蛟O(shè)綜合前面所學(xué)的知識,熟悉面向?qū)ο蟪绦蛟O(shè)計的全過程,即面向?qū)ο蟮姆治觥⒚嫦驅(qū)ο笥嫷娜^程,即面向?qū)ο蟮姆治?、面向?qū)ο蟮脑O(shè)計、面向?qū)ο蟮膶崿F(xiàn)三個過程,創(chuàng)建一的設(shè)計、面向?qū)ο蟮膶崿F(xiàn)三個過程,創(chuàng)建一個實用的游戲程序。個實用的游戲程序。 游戲說明及規(guī)則游戲說明及規(guī)則n俄羅斯俄羅斯方塊是由俄羅斯人阿列克謝方塊是由俄羅斯人阿列克謝帕基帕基特諾夫發(fā)明的。俄羅斯方塊原名是俄語特諾夫發(fā)明的。俄羅斯方塊原名是俄語(英語是(英語是Tetris),這個名字來),這個名字來源于源于希臘希臘語語tetra,意思是,意思
2、是“四四”,而游,而游戲的作者最喜歡網(wǎng)球(戲的作者最喜歡網(wǎng)球(tennis)。于是,)。于是,他把兩個詞他把兩個詞tetra和和tennis合而為一,命合而為一,命名為名為Tetris,這也就是俄羅斯方塊名字,這也就是俄羅斯方塊名字的由來。的由來。nTetris游戲在一個游戲在一個m*n的矩形框內(nèi)進行。游戲開始時,的矩形框內(nèi)進行。游戲開始時,矩形框的頂部會隨機出現(xiàn)一個由四個小方塊構(gòu)成的磚矩形框的頂部會隨機出現(xiàn)一個由四個小方塊構(gòu)成的磚塊,每過一個很短的時間(我們稱這個時間為一個塊,每過一個很短的時間(我們稱這個時間為一個tick),它就會下落一格,直到它碰到矩形框的底部,),它就會下落一格,直到
3、它碰到矩形框的底部,然后再過一個然后再過一個tick它就會固定在矩形框的底部,成為它就會固定在矩形框的底部,成為固定塊。接著再過一個固定塊。接著再過一個tick頂部又會出現(xiàn)下一個隨機頂部又會出現(xiàn)下一個隨機形狀,同樣每隔一個形狀,同樣每隔一個tick都會下落,直到接觸到底部都會下落,直到接觸到底部或者接觸到下面的固定塊時,再過一個或者接觸到下面的固定塊時,再過一個tick它也會成它也會成為固定塊,再過一個為固定塊,再過一個tick之后會進行檢查,發(fā)現(xiàn)有充之后會進行檢查,發(fā)現(xiàn)有充滿方塊的行則會消除它,同時頂部出現(xiàn)下一個隨機形滿方塊的行則會消除它,同時頂部出現(xiàn)下一個隨機形狀。直到頂部出現(xiàn)的隨機形狀在
4、剛出現(xiàn)時就與固定塊狀。直到頂部出現(xiàn)的隨機形狀在剛出現(xiàn)時就與固定塊重疊,表示游戲結(jié)束。重疊,表示游戲結(jié)束。操作說明:n光標左鍵光標左鍵左移左移光標右鍵光標右鍵右移右移光標上鍵光標上鍵翻轉(zhuǎn)翻轉(zhuǎn)光標下鍵光標下鍵下移下移Tetris游戲的分析、設(shè)計與實現(xiàn)游戲的分析、設(shè)計與實現(xiàn) n1. Tetris游戲的矩形框類游戲的矩形框類CBinn首先我們應(yīng)該描述首先我們應(yīng)該描述Tetris游戲的矩形框。這里游戲的矩形框。這里我們定義一個我們定義一個CBin類描述類描述Tetris游戲的矩形框。游戲的矩形框。對矩形框進行分析,它應(yīng)該有三個私有的數(shù)據(jù)對矩形框進行分析,它應(yīng)該有三個私有的數(shù)據(jù)成員為:成員為:image,
5、 width和和height。CBin類將類將Tetris游戲的矩形框描述成為一個二維數(shù)組游戲的矩形框描述成為一個二維數(shù)組image, 變量變量width和和height存儲了存儲了image的的維數(shù)。如圖維數(shù)。如圖1所示。有磚塊的地方的值為磚塊所示。有磚塊的地方的值為磚塊的顏色值(例如的顏色值(例如1為紅色,為紅色,4為藍色),沒有磚為藍色),沒有磚塊的地方應(yīng)為塊的地方應(yīng)為0值。值。 函數(shù)名稱函數(shù)名稱函數(shù)說明函數(shù)說明CBin(unsigned int w, unsigned int h) 構(gòu)造函數(shù),用來初始化數(shù)據(jù)成員構(gòu)造函數(shù),用來初始化數(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是一個合法的是一個合法的指針指針.unsig
7、ned int removeFullLines()檢查檢查image,如果任何一行完全填,如果任何一行完全填滿,則刪除這一行,并讓上面行的滿,則刪除這一行,并讓上面行的數(shù)據(jù)下移一行,返回刪除的總行數(shù)。數(shù)據(jù)下移一行,返回刪除的總行數(shù)。 n現(xiàn)在來完成一些現(xiàn)在來完成一些Tetris磚塊類。磚塊類。Tetris的的常用磚塊見下圖。經(jīng)分析所有的磚塊都常用磚塊見下圖。經(jīng)分析所有的磚塊都有共同的特征,因此我們定義了一個基有共同的特征,因此我們定義了一個基類類CBrick,這是一個抽象類。,這是一個抽象類。 圖圖11.2 Tetris的常用磚塊的常用磚塊 nCIBrick 類有四個數(shù)據(jù)成員類有四個數(shù)據(jù)成員:
8、orientation, posX, posY, and colour。orientation 表示了表示了“I”磚塊的四個狀磚塊的四個狀態(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”磚塊固定一個特定點順時針旋轉(zhuǎn)磚塊固定一個特定點順時針旋轉(zhuǎn)90度。依此類推,狀態(tài)度。依此類推,狀態(tài)3的下一個狀態(tài)是狀的下一個狀態(tài)是狀態(tài)態(tài)0。posX, posY記錄了特定點(圖中記錄了特定點(圖中黑點)的坐標。黑點)的坐標。Colour為磚塊的顏色值。為磚塊的顏色值。 可視化設(shè)計n實驗指導(dǎo)書實驗指導(dǎo)書P105雙緩沖雙緩沖
9、n普通繪圖方式與雙緩沖繪圖方式的區(qū)別普通繪圖方式與雙緩沖繪圖方式的區(qū)別在于:普通繪圖方式可以看做是在屏幕在于:普通繪圖方式可以看做是在屏幕上直接繪制圖形,雙緩沖繪圖方式是現(xiàn)上直接繪制圖形,雙緩沖繪圖方式是現(xiàn)在內(nèi)存中創(chuàng)建的在內(nèi)存中創(chuàng)建的“虛擬屏幕虛擬屏幕”上繪制,上繪制,然后將繪制完成的圖形一次性然后將繪制完成的圖形一次性“拷貝拷貝”到屏幕上。到屏幕上。n1. 在上述實驗的基礎(chǔ)上,實現(xiàn)其它類型在上述實驗的基礎(chǔ)上,實現(xiàn)其它類型的磚塊。的磚塊。n2. 進一步完善程序,實現(xiàn)兩個人能同時進一步完善程序,實現(xiàn)兩個人能同時玩的游戲模式。玩的游戲模式。 另一種另一種Tetris實現(xiàn)思路實現(xiàn)思路n前面的實例為了
10、讓大家應(yīng)用前面的實例為了讓大家應(yīng)用C+的封裝的封裝性、繼承性和多態(tài)性,代碼顯得復(fù)雜。性、繼承性和多態(tài)性,代碼顯得復(fù)雜。下面我們使用數(shù)學(xué)的方法簡化代碼下面我們使用數(shù)學(xué)的方法簡化代碼n重新設(shè)計重新設(shè)計CBrick類類n觀察方塊,可以發(fā)現(xiàn),所有的方塊都有觀察方塊,可以發(fā)現(xiàn),所有的方塊都有4個小的正方形組成,那么可以使用個小的正方形組成,那么可以使用4個坐個坐標分別表示標分別表示4個小方塊所處的位置,從而個小方塊所處的位置,從而確定方塊的類型。確定方塊的類型。n左上角的小方塊坐標為(左上角的小方塊坐標為(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); /移動移動 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;移動方塊移動方塊bool CBrick:move(int offsetX,int offsetY,unsigned char* binImage)int i;int X4,Y4;for(i=0;i4;
14、i+)/針對每一個小方格的移動針對每一個小方格的移動Xi=xi+offsetX;Yi=yi+offsetY;if(Xi=10|Yi=20) /判斷是否能夠移動成功判斷是否能夠移動成功return false;if(binImageYiXi!=0)return false;for(i=0;i4;i+)xi=Xi;yi=Yi;return true;旋轉(zhuǎn)旋轉(zhuǎn)n點點P(x,y)到原點到原點O繞繞O點逆時針旋轉(zhuǎn)角度點逆時針旋轉(zhuǎ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當把旋轉(zhuǎn)點一般化為當把旋轉(zhuǎ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任意點(任意點(x, y)繞其中心繞其中心 (x0, y0)逆時針旋轉(zhuǎn)逆時針旋轉(zhuǎn)angle角度后,新的坐標位置(角度后,新的坐標位置(x1, y1)的計算公式為:的計算公式為: x1 = (x x0) cos (y y0) sin x0; y1= (x x0) si
16、n (y y0) cos y0; n將坐標將坐標(x,y)繞繞(x0,y0)順時針旋轉(zhuǎn)順時針旋轉(zhuǎn)90度度(相當相當于逆時針于逆時針-90度度),得到的新坐標,得到的新坐標(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+)/進行順時針進行順時針90度坐標變換度坐標變換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; activeBric
18、k-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 = 0; /bi
19、n-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);/這兩種方法都可以退出程序這兩種方法都
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 漢字筆畫課件演示
- 遼寧省七校協(xié)作體2025-2026學(xué)年高三上學(xué)期開學(xué)考試英語模擬試題(含解析)
- 2025年山西省臨汾市中考物理模擬試卷(含答案)
- 3D打印技術(shù)與應(yīng)用知到智慧樹答案
- 互聯(lián)網(wǎng)醫(yī)療機構(gòu)經(jīng)營模式分析
- 內(nèi)衣行業(yè)市場趨勢預(yù)測
- 2025雙方合作經(jīng)營教育公司合同范本
- 軍事理論-國家安全環(huán)境強化版知到智慧樹見面課答案
- 漢字書寫與鑒賞課件
- 水粉陶罐基礎(chǔ)知識培訓(xùn)課件
- TCAPC 016-2024 院外呼吸慢病健康管理規(guī)范
- 露天礦山安全知識培訓(xùn)課件
- 《中小企業(yè)員工激勵機制存在的問題及完善對策研究》4000字
- 第1章 汽車4S店概述
- 呼蘭河傳完整版課件
- 醫(yī)療器械監(jiān)管實務(wù)
- 旅游景區(qū)反恐防爆應(yīng)急預(yù)案
- 實驗室隱患排查培訓(xùn)
- 浪潮iqt在線測評題及答案
- 中外運社招在線測評題
- GB/T 18802.331-2024低壓電涌保護器元件第331部分:金屬氧化物壓敏電阻(MOV)的性能要求和試驗方法
評論
0/150
提交評論