OpenGL實(shí)現(xiàn)俄羅斯方塊源代碼_第1頁(yè)
OpenGL實(shí)現(xiàn)俄羅斯方塊源代碼_第2頁(yè)
OpenGL實(shí)現(xiàn)俄羅斯方塊源代碼_第3頁(yè)
OpenGL實(shí)現(xiàn)俄羅斯方塊源代碼_第4頁(yè)
OpenGL實(shí)現(xiàn)俄羅斯方塊源代碼_第5頁(yè)
已閱讀5頁(yè),還剩10頁(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、精選文庫(kù)OpenGL實(shí)現(xiàn)俄羅斯方塊一、 設(shè)計(jì)思路本程序采用以C+為基礎(chǔ)并利用OpenGl庫(kù)函數(shù)的方式實(shí)現(xiàn)俄羅斯方塊程序,實(shí)現(xiàn)俄羅斯方塊中正方形,T形,L形,反L形,直線型,Z字形,反Z字形七種形狀的變換操作,七種形狀的坐標(biāo)被存儲(chǔ)在一個(gè)三維數(shù)組中,每次隨機(jī)選擇一個(gè)形狀生成并下落,在下落過(guò)程中監(jiān)聽(tīng)鍵盤(pán)事件。二、 詳細(xì)設(shè)計(jì)說(shuō)明本程序中主要的函數(shù)及其作用說(shuō)明如下:down:定時(shí)下落函數(shù),由glutTimerFunc(1000,down,1);函數(shù)設(shè)置每隔1000毫秒即調(diào)用一次該函數(shù),在函數(shù)中將方塊的所有縱坐標(biāo)減一個(gè)單位。key: 鍵盤(pán)事件監(jiān)聽(tīng)函數(shù),當(dāng)鍵盤(pán)上有按鍵被觸發(fā)的時(shí)候即調(diào)用該函數(shù),函數(shù)內(nèi)部支持w

2、,a,s,d四個(gè)鍵的響應(yīng),依次代表方向鍵上,左,右,下,其中w鍵是用來(lái)控制圖形變換的,每次按w鍵時(shí),圖形在現(xiàn)有基礎(chǔ)上順時(shí)針變換一次。CheckConflict:沖突檢測(cè)函數(shù),檢測(cè)方塊下一次將要移動(dòng)的位置是否會(huì)碰到已有的方塊或者左右兩邊的墻壁。CheckDelete:每一次方塊落到底部之后,調(diào)用該函數(shù)檢查是否有滿行,如果有則調(diào)用Delete函數(shù)刪除該行。myDisplay1:作圖函數(shù)。Change:變換函數(shù),主要是通過(guò)計(jì)算變換后的圖形與之前圖形的坐標(biāo)關(guān)系來(lái)實(shí)現(xiàn)。三、 源代碼#include#include#include#include#includeusing namespace std;#d

3、efine LEFT a#define RIGHT d#define UP w#define DOWN s#define START 0/定義圖形的范圍#define END 19#define SIZE 25/*初始化七個(gè)二維數(shù)組,即七個(gè)塊剛開(kāi)始產(chǎn)生時(shí)出現(xiàn)的位置*這里需要考慮的情況是:剛開(kāi)始產(chǎn)生時(shí)有的方塊還只露出來(lái)一部分,*如果這個(gè)時(shí)候按了UP鍵進(jìn)行變換應(yīng)該怎么處理*本程序最初設(shè)計(jì)并不考慮這個(gè)問(wèn)題,一開(kāi)始即畫(huà)出方塊的各個(gè)部分,以后再考慮完善的事情*另外,記錄坐標(biāo)的順序?yàn)閺淖笾劣?,從上至?/GLfloat b53=0.0f,0.9f,0.0f,0.8f,0.0f,0.7f,0.0f,0.6f

4、,/1、記錄長(zhǎng)條四個(gè)坐標(biāo)-0.1f,0.9f,0.0f,0.9f,-0.1f,0.8f,0.0f,0.8f,/2、記錄正方形-0.1f,0.9f,-0.2f,0.8f,-0.1f,0.8f,0.0f,0.8f,/3、T字形-0.1f,0.9f,0.0f,0.9f,0.0f,0.8f,0.1f,0.8f,/4、記錄Z字形-0.1f,0.9f,0.0f,0.9f,-0.2f,0.8f,-0.1f,0.8f,/5、記錄倒Z字形-0.1f,0.9f,-0.1f,0.8f,-0.1f,0.7f,0.0f,0.7f,/6、記錄L字形0.0f,0.9f,0.0f,0.8f,-0.1f,0.7f,0.0f,0

5、.7f,/7、記錄倒L字形;GLfloat curLoc53;GLint currentBlock=2;/記錄當(dāng)前正在下落的是第幾種方塊,順序如上面所示GLint turn7=0;/應(yīng)該變換成第幾種形態(tài)了GLfloat xd=0.0f,yd=0.0f;/*這里定義的over是用來(lái)判斷方塊是否到達(dá)了不能再往下降的地方,到了則置其為true,否則就修改為false。其中有這樣幾種情況需要修改over:1、重新生成了一個(gè)方塊,修改over=false2、方塊到大底部,修改over=true*/bool over=false;/記錄游戲是否結(jié)束bool end=false;int score=0;/設(shè)

6、置一個(gè)鎖,在下降操作時(shí)不允許變換,在變換時(shí)不允許下降操作,否則將會(huì)產(chǎn)生資源競(jìng)爭(zhēng)/int lock=1;/*定義一個(gè)20*20的矩陣來(lái)記錄當(dāng)前整個(gè)畫(huà)面中各個(gè)小格子的情況,可用來(lái)消除滿格行矩陣的存儲(chǔ)順序?yàn)閺淖蟮接?,從下到上,包含下?biāo)0BLOCKij中i對(duì)應(yīng)的是縱坐標(biāo),j對(duì)應(yīng)的是橫坐標(biāo)(這個(gè)有點(diǎn)痛苦),但是在消去滿格的時(shí)候還是不變,只是在用b數(shù)組給其賦值時(shí)需要反過(guò)來(lái)*/GLint BLOCKSIZESIZE;void down(int id);void InitBLOCK();void Change();void CheckDelete();int CheckConflict(int lef_rig

7、=0);void CreateBlocks();void myDisplay1();void key(unsigned char k,int x,int y);void Delete(bool *empty);void show();void show()int i,j;for(i=0;i4;i+)/函數(shù)調(diào)用的順序?qū)﹀e(cuò)誤有一定的影響for(j=0;j2;j+)coutcurLocij ;coutendl;/*初始化方塊矩陣,方塊是一個(gè)上端開(kāi)口的長(zhǎng)方形*/void InitBLOCK()int i,j;for(i=0;iSIZE;i+)for(j=0;jSIZE;j+)BLOCKij=0;for

8、(i=0;iSIZE;i+)BLOCK0i=1;for(i=0;i4;i+)for(j=0;j2;j+)curLocij=bcurrentBlockij;void Change()/將圖形做變換,采用順時(shí)針旋轉(zhuǎn)的規(guī)律(下面的工作即是填入坐標(biāo))GLfloat temp00=curLoc00;GLfloat temp01=curLoc01;GLfloat temp10=curLoc10;GLfloat temp11=curLoc11;GLfloat temp20=curLoc20;GLfloat temp21=curLoc21;GLfloat temp30=curLoc30;GLfloat tem

9、p31=curLoc31;switch(currentBlock)case 0:/長(zhǎng)條switch(turn0)case 0:curLoc00=temp10-0.1f;curLoc01=temp11;curLoc20=temp10+0.1f;curLoc21=temp11;curLoc30=temp10+0.2f;curLoc31=temp11;break;case 1:curLoc00=temp10;curLoc01=temp11+0.1f;curLoc20=temp10;curLoc21=temp11-0.1f;curLoc30=temp10;curLoc31=temp11-0.2f;br

10、eak;turn0=(turn0+1)%2;break;case 1:/正方形break;case 2:/T字形/coutturn2=turn2endl;switch(turn2)case 0:curLoc10=temp20;curLoc11=temp21;curLoc20=temp30;curLoc21=temp31;curLoc30=temp20;curLoc31=temp21-0.1f;break;case 1:curLoc00=temp10-0.1f;curLoc01=temp11;break;case 2:curLoc00=temp10;curLoc01=temp11+0.1f;cu

11、rLoc10=temp00;curLoc11=temp01;curLoc20=temp10;curLoc21=temp11;break;case 3:curLoc30=temp20+0.1f;curLoc31=temp21;break;turn2=(turn2+1)%4;break;case 3:/Z字形switch(turn3)case 0:curLoc00=temp10+0.1f;curLoc01=temp11+0.1f;curLoc20=temp10+0.1f;curLoc21=temp11;curLoc30=temp20;curLoc31=temp21;break;case 1:cur

12、Loc00=temp10-0.1f;curLoc01=temp11;curLoc20=temp30;curLoc21=temp31;curLoc30=temp30+0.1f;curLoc31=temp31;break;turn3=(turn3+1)%2;break;case 4:/反Z字形switch(turn4)case 0:curLoc00=temp00-0.1f;curLoc01=temp01+0.1f;curLoc10=temp00-0.1f;curLoc11=temp01;curLoc20=temp00;curLoc21=temp01;curLoc30=temp00;curLoc31

13、=temp01-0.1f;break;case 1:curLoc00=temp20;curLoc01=temp21;curLoc10=temp20+0.1f;curLoc11=temp21;curLoc20=temp10;curLoc21=temp11-0.1f;break;turn4=(turn4+1)%2;break;case 5:/L字形switch(turn5)case 0:curLoc00=temp10;curLoc01=temp11;curLoc10=temp10+0.1f;curLoc11=temp11;curLoc20=temp10+0.2f;curLoc21=temp11;c

14、urLoc30=temp20;curLoc31=temp21;break;case 1:curLoc00=temp00;curLoc01=temp01+0.1f;curLoc10=temp10;curLoc11=temp11+0.1f;curLoc20=temp10;curLoc21=temp11;curLoc30=temp10;curLoc31=temp11-0.1f;break;case 2:curLoc00=temp20+0.1f;curLoc01=temp21;curLoc10=temp20-0.1f;curLoc11=temp21-0.1f;curLoc20=temp20;curLo

15、c21=temp21-0.1f;curLoc30=temp20+0.1f;curLoc31=temp21-0.1f;break;case 3:curLoc00=temp10;curLoc01=temp11+0.2f;curLoc10=temp10;curLoc11=temp11+0.1f;curLoc20=temp10;curLoc21=temp11;curLoc30=temp20;curLoc31=temp21;break;turn5=(turn5+1)%4;break;case 6:/反L字形switch(turn6)case 0:curLoc00=temp20-0.1f;curLoc01

16、=temp21+0.1f;curLoc10=temp20-0.1f;curLoc11=temp21;break;case 1:curLoc00=temp00+0.1f;curLoc01=temp01+0.1f;curLoc10=temp30;curLoc11=temp31+0.2f;curLoc20=temp00+0.1f;curLoc21=temp01;curLoc30=temp20;curLoc31=temp21;break;case 2:curLoc00=temp00-0.1f;curLoc01=temp01-0.1f;curLoc10=temp20;curLoc11=temp21;cu

17、rLoc20=temp20+0.1f;curLoc21=temp21;curLoc30=temp30+0.1f;curLoc31=temp31;break;case 3:curLoc00=temp20;curLoc01=temp21+0.1f;curLoc10=temp20;curLoc11=temp21;curLoc20=temp30-0.1f;curLoc21=temp31;curLoc30=temp30;curLoc31=temp31;break;turn6=(turn6+1)%4;break;/如果旋轉(zhuǎn)非法(即旋轉(zhuǎn)時(shí)碰到墻壁了),則要恢復(fù)原來(lái)的狀態(tài)int ret;ret=CheckCo

18、nflict();if(ret = 1)curLoc00=temp00;curLoc01=temp01;curLoc10=temp10;curLoc11=temp11;curLoc20=temp20;curLoc21=temp21;curLoc30=temp30;curLoc31=temp31;/*消除滿格的一行,在每次over被修改為true的時(shí)候都要檢查一遍算法思想是從第0行開(kāi)始依次判斷,如果empty為true則將下面的向上,并不是判斷一次就移動(dòng)所有的,而是只移動(dòng)最近的,將空出來(lái)的那一行的empty標(biāo)記為true*/void Delete(int *empty)int i,j;int p

19、os;while(1)/將上面非空的行填補(bǔ)到下面的空行中i=1;while(i = 20)break;j=i+1;while(j = 20)break;if(j 20&emptyj != -1)for(pos=0;pos20;pos+)BLOCKipos=BLOCKjpos;emptyi=emptyj;emptyj=-1;for(i=1;i20;i+)if(emptyi != 0)for(j=0;j20;j+)BLOCKij=0;/*1、判斷新生成的圖形是否和原來(lái)的圖形有沖突,有則不能更改,這個(gè)地方比較不好實(shí)現(xiàn)*2、判斷是否有滿格的行,有則調(diào)用Delete函數(shù)去掉*3、這里似乎還要加上判斷是否

20、到大頂部,如果到達(dá)頂部則游戲結(jié)束(可采用監(jiān)視方框最上*面一行之上那行里面有沒(méi)有方格,如果有的話則游戲結(jié)束)*結(jié)束之后就可以把當(dāng)前方塊存入BLOCK中*empty表示一行中方塊的數(shù)目,-1表示為空行,0表示部分為空,1表示滿行*/void CheckDelete()/目前這個(gè)函數(shù)還只是實(shí)現(xiàn)了一個(gè)方塊到達(dá)終點(diǎn)之后是否有能夠被刪除的行int i,j;int emptySIZE;bool is_needed=false;int count;for(i=0;iSIZE;i+)emptyi=-1;for(i=0;i4;i+)double x=(curLoci0+1)*10+0.5;/此處無(wú)需注意取值,因?yàn)?/p>

21、checkConflict已經(jīng)解決double y=(curLoci1+1)*10+0.5;BLOCK(int)y(int)x=1;/融合for(i=1;i20;i+)count=0;for(j=0;j 0&count 20)emptyi=0;if(is_needed=true)/如果有滿行則去刪除,否則免之Delete(empty);int CheckConflict(int lef_rig)int i;for(i=0;i0?(x+0.5):(x-0.5);if(lef_rig = 1)int tmpx=(int)x;if(tmpx 19|tmpx 0)break;if(BLOCK(int)

22、y(int)x=1) /判斷是否發(fā)生沖突break;if(i 4)return 1;return 0;/*關(guān)鍵部分在這里,主要是要判斷方塊下一次的移動(dòng)是否合法,本程序通過(guò)對(duì)b數(shù)組所存儲(chǔ)的下標(biāo)是否在BLOCK數(shù)組中已經(jīng)為1來(lái)判斷,這樣,只需要在BLOCK的最外層加一圈1,就不用通過(guò)原來(lái)的方式來(lái)判斷方塊是否越界*/void key(unsigned char k,int x,int y)int i,ret;if(over = false)if(k=UP)/此處需要改成調(diào)用變換圖形樣式的函數(shù)Change();else if(k=DOWN)/后續(xù)還要修改,移動(dòng)到底部過(guò)了一段時(shí)間之后就不能左右移動(dòng)了fo

23、r(i=0;i4;i+)/需繼續(xù)添加以1和-1作為哨兵curLoci1-=0.1f;ret=CheckConflict();if(ret = 1)/發(fā)生沖突,則將修改復(fù)原for(i=0;i4;i+)curLoci1+=0.1f;over=true;/并且可以生成下一個(gè)方塊了else if(k=RIGHT)for(i=0;i4;i+)curLoci0+=0.1f;ret=CheckConflict(1);if(ret = 1)/發(fā)生沖突,則將修改復(fù)原for(i=0;i4;i+)curLoci0-=0.1f;else if(k=LEFT)for(i=0;i4;i+)curLoci0-=0.1f;r

24、et=CheckConflict(1);if(ret = 1)/發(fā)生沖突,則將修改復(fù)原for(i=0;i4;i+)curLoci0+=0.1f;if(over=true)CheckDelete();glutPostRedisplay();/調(diào)用這個(gè)函數(shù)可以重新繪圖,每次相應(yīng)消息之后,所有全部重繪/*讓方塊定時(shí)下降*/void down(int id)int i,ret;if(over!=true)for(i=0;i4;i+)/需繼續(xù)添加以1和-1作為哨兵curLoci1-=0.1f;ret=CheckConflict();if(ret = 1)/發(fā)生沖突,則將修改復(fù)原for(i=0;i= bc

25、urrentBlock01)coutGame over,your score is:score*100endl;exit(1);over=true;/并且可以生成下一個(gè)方塊了if(over=true)CheckDelete();glutPostRedisplay();glutTimerFunc(1000,down,1);/作圖函數(shù),要修改,利用BLOCK數(shù)組繪圖void myDisplay1()int i,j;glClear(GL_COLOR_BUFFER_BIT);/不能使用深度測(cè)試,否則畫(huà)出來(lái)的圖形很亂for(i=0;i20;i+)for(j=0;j20;j+)if(BLOCKij=1)g

26、lColor3f(0.0f,1.0f,0.0f);/用藍(lán)色畫(huà)圖glRectf(j/10.0f-1.0f,i/10.0f-1.0f,j/10.0f-1.0f+0.1f,i/10.0f-1.0f+0.1f);glLineWidth(2.0f);glBegin(GL_LINE_LOOP);glColor3f(0.0f,0.0f,0.0f);glVertex2f(j/10.0f-1.0f,i/10.0f-1.0f);glVertex2f(j/10.0f-1.0f+0.1f,i/10.0f-1.0f);glVertex2f(j/10.0f-1.0f+0.1f,i/10.0f-1.0f+0.1f);glVertex2f(j/10.0f-1.0f,i/10.0f-1.0f+0.1f);glEnd();glFlush();if(over = false)for(i=0;i4;i+)glColor3f(0.0f,1.0f,0.0f);/用藍(lán)色畫(huà)圖glRectf(curLoci0,curLoci1,cu

溫馨提示

  • 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)論