Java實(shí)現(xiàn)俄羅斯方塊的源碼分享_第1頁(yè)
Java實(shí)現(xiàn)俄羅斯方塊的源碼分享_第2頁(yè)
Java實(shí)現(xiàn)俄羅斯方塊的源碼分享_第3頁(yè)
Java實(shí)現(xiàn)俄羅斯方塊的源碼分享_第4頁(yè)
Java實(shí)現(xiàn)俄羅斯方塊的源碼分享_第5頁(yè)
已閱讀5頁(yè),還剩11頁(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)介

第Java實(shí)現(xiàn)俄羅斯方塊的源碼分享7、移除某一行方塊上面的方塊后讓上面的方塊掉落

8、刷新移除某一行方塊后的界面

9、清除方塊

10、繪制方塊

11、鍵盤控制方塊的移動(dòng)、變形和快速下落

12、游戲的暫停功能

三小時(shí)純手工打造,具體實(shí)現(xiàn)代碼:

importjavax.swing.*;

importjava.awt.*;

importjava.awt.event.KeyEvent;

importjava.awt.event.KeyListener;

importjava.util.Random;

publicclassstartextendsJFrameimplementsKeyListener{

publicstaticvoidmain(String[]args)throwsException{

//SwingUtilities.invokeLater(start::initWindow);

startt=newstart();

t.game_begin();

//游戲的行數(shù)為26,列數(shù)為12

privatestaticfinalintgame_x=26;

privatestaticfinalintgame_y=12;

//文本域數(shù)組

JTextArea[][]text;

//二維數(shù)組

int[][]data;

//顯示游戲狀態(tài)的標(biāo)簽

JLabelLabel1;

//顯示游戲分?jǐn)?shù)的標(biāo)簽

JLabelLabel;

//提示暫停鍵的標(biāo)簽

JLabellabel;

//用于判斷游戲是否結(jié)束

booleanisrunning;

//用于存儲(chǔ)所有方塊的數(shù)組

int[]allRect;

//用于存儲(chǔ)當(dāng)前方塊的變量

intrect;

//線程的休眠時(shí)間

inttime=1000;

//表示方塊坐標(biāo)

intx,y;

//該變量用于計(jì)算得分

intscore=0;

//定義一個(gè)標(biāo)志變量,判斷游戲是否暫停

booleangame_pause=false;

//定義一個(gè)變量,用于記錄按下暫停的次數(shù)

intpause=0;

publicvoidinitWindow(){

//設(shè)置窗口大小

this.setSize(600,850);

//設(shè)置窗口是否可見(jiàn)

this.setVisible(true);

//設(shè)置窗口居中

this.setLocationRelativeTo(null);

//設(shè)置釋放窗體

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//設(shè)置窗體大小不可變

this.setResizable(false);

//設(shè)置標(biāo)題

this.setTitle("俄羅斯方塊");

publicstart(){

text=newJTextArea[game_x][game_y];

data=newint[game_x][game_y];

//初始化游戲狀態(tài)的標(biāo)簽

Label1=newJLabel("游戲狀態(tài):正在游戲中!");

//初始化游戲分?jǐn)?shù)的標(biāo)簽

Label=newJLabel("游戲得分:0");

//初始化提示標(biāo)簽

label=newJLabel("按下s鍵,即可暫停游戲!");

initGamePanel();

initExplainPanel();

initWindow();

//初始化游戲開(kāi)始的標(biāo)志

isrunning=true;

//初始化存放方塊的數(shù)組

allRect=newint[]{0x00cc,0x8888,0x000f,0x888f,0xf888,0xf111,0x111f,0x0eee,0xffff,0x0008

,0x0888,0x000e,0x0088,0x000c,0x08c8,0x00e4,0x04c4,0x004e,0x08c4,0x006c,0x04c8,0x00c6};

//初始化游戲界面

publicvoidinitGamePanel(){

JPanelgame_main=newJPanel();

game_main.setLayout(newGridLayout(game_x,game_y,1,1));

for(inti=0;itext.length;i++){

for(intj=0;jtext[i].length;j++){

//設(shè)置文本域的行列數(shù)

text[i][j]=newJTextArea(game_x,game_y);

//設(shè)置文本域的背景顏色

text[i][j].setBackground(Color.WHITE);//白色

//添加鍵盤監(jiān)聽(tīng)事件

text[i][j].addKeyListener(this);

//初始化游戲邊界

if(j==0||j==text[i].length-1||i==text.length-1){

text[i][j].setBackground(Color.BLACK);//設(shè)置為黑色,這里看個(gè)人喜好設(shè)置

data[i][j]=1;//表示這里有方塊

//設(shè)置文本域不可編輯

text[i][j].setEditable(false);

//文本區(qū)域添加到主面板上去

game_main.add(text[i][j]);

//將主面板添加到窗口中

this.setLayout(newBorderLayout());

this.add(game_main,BorderLayout.CENTER);//把游戲區(qū)域添加到窗口的中間

//初始化游戲的說(shuō)明界面

publicvoidinitExplainPanel(){

//創(chuàng)建游戲的左說(shuō)明面板

JPanelexplain_left=newJPanel();

//創(chuàng)建游戲的右說(shuō)明面板

JPanelexplain_right=newJPanel();

//初始化格式布局

explain_left.setLayout(newGridLayout(4,1));

explain_right.setLayout(newGridLayout(3,1));

//在左說(shuō)明面板,添加說(shuō)明文字

explain_left.add(newJLabel("按空格鍵,方塊變形"));

explain_left.add(newJLabel("按左箭頭,方塊左移"));

explain_left.add(newJLabel("按右箭頭,方塊右移"));

explain_left.add(newJLabel("按下箭頭,方塊下落"));

//設(shè)置游戲標(biāo)簽的內(nèi)容為紅色字體

Label1.setForeground(Color.RED);

//將游戲狀態(tài)和得分、提示添加到右面板上

explain_right.add(label);

explain_right.add(Label);

explain_right.add(Label1);

//將左說(shuō)明面板添加到窗口左側(cè)

this.add(explain_left,BorderLayout.WEST);

//將右說(shuō)明面板添加到窗口右側(cè)

this.add(explain_right,BorderLayout.EAST);

//開(kāi)始游戲的方法

publicvoidgame_begin()throwsException{

while(true){

//判斷游戲是否結(jié)束

if(!isrunning){

break;

//進(jìn)行游戲

game_run();

//在標(biāo)簽位置顯示游戲結(jié)束

Label1.setText("游戲狀態(tài):游戲結(jié)束!");

//隨機(jī)生成下落方塊形狀的方法

publicvoidranRect(){

Randomrandom=newRandom();

rect=allRect[random.nextInt(22)];

//游戲運(yùn)行的方法

publicvoidgame_run()throwsException{

ranRect();

//方塊下落位置

x=0;

y=5;

for(inti=0;igame_x;i++){

Thread.sleep(time);

if(game_pause){

i--;

}else{

//判斷方塊是否可以下落

if(!canFall(x,y)){

//將data變成1,表示有方塊占用

changData(x,y);

//循環(huán)遍歷4層,看是否有行可以消除

for(intj=x;jx+4;j++){

intsum=0;

for(intk=1;k=(game_y-2);k++){

if(data[j][k]==1){

sum++;

//判斷是否有一行可以被消除

if(sum==(game_y-2)){

//消除J這一行

removeRow(j);

//判斷游戲是否失敗

for(intj=1;j(game_y-2);j++){

if(data[3][j]==1){

isrunning=false;

break;

break;//方塊無(wú)法下落,我們應(yīng)該重新生成一個(gè)方塊,并重新遍歷26層

}else{

//方塊可以下落,層數(shù)加一

x++;

//方塊下落一格

fall(x,y);

//判斷方塊是否可以繼續(xù)下落的方法

publicbooleancanFall(intm,intn){

//定義一個(gè)變量

inttemp=0x8000;

//遍歷4*4方格

for(inti=0;ii++){

for(intj=0;jj++){

if((temprect)!=0){

//判斷該位置的下一行是否有方塊

if(data[m+1][n]==1){

returnfalse;

n++;

temp=1;//右移一位

m++;

n=n-4;//讓n回歸首列

//循環(huán)結(jié)束,可以下落

returntrue;

//改變不可下降的方塊對(duì)應(yīng)的區(qū)域的值的方法

publicvoidchangData(intm,intn){

//定義一個(gè)變量

inttemp=0x8000;

//遍歷整個(gè)4*4的方塊

for(inti=0;ii++){

for(intj=0;jj++){

if((temprect)!=0){

data[m][n]=1;

n++;

temp=1;//右移一位

m++;

n=n-4;

//移除某一行的所有方塊,并讓上面的方塊掉落的方法

publicvoidremoveRow(introw){

inttemp=100;

for(inti=row;ii--){

for(intj=1;j=(game_y-2);j++){

//進(jìn)行覆蓋

data[i][j]=data[i-1][j];

//刷新游戲區(qū)域

reflesh(row);

//方塊加速

if(timetemp){

time-=temp;

//每消除一行,得分加100

score+=temp;

//顯示變化后的分?jǐn)?shù)

Label.setText("游戲得分:"+score);

//刷新移除某一行后的游戲界面的方法

publicvoidreflesh(introw){

//遍歷row上面的游戲區(qū)域

for(inti=row;ii--){

for(intj=1;j=(game_y-2);j++){

if(data[i][j]==1){//如果是方塊,將方塊設(shè)置為藍(lán)色

text[i][j].setBackground(Color.BLUE);

}else{//如果不是方塊,說(shuō)明是游戲的背景區(qū)域

text[i][j].setBackground(Color.WHITE);//設(shè)置為白色

//方塊向下掉落一層的方法

publicvoidfall(intm,intn){

if(m0){

//清除上一層方塊

clear(m-1,n);

//重新繪制方塊

draw(m,n);

//清除方塊掉落后,上一層有顏色的地方的方法

publicvoidclear(intm,intn){

//定義一個(gè)變量

inttemp=0x8000;

for(inti=0;ii++){

for(intj=0;jj++){

if((temprect)!=0){

text[m][n].setBackground(Color.WHITE);//將其設(shè)置成背景顏色,相當(dāng)于消除

n++;

temp=1;//右移一位

m++;

n=n-4;

//重新繪制掉落后的方塊的方法

publicvoiddraw(intm,intn){

//定義一個(gè)變量

inttemp=0x8000;

for(inti=0;ii++){

for(intj=0;jj++){

if((temprect)!=0){

text[m][n].setBackground(Color.BLUE);//設(shè)置成之前的方塊顏色

n++;

temp=1;//右移一位

m++;

n=n-4;

@Override

publicvoidkeyTyped(KeyEvente){

//控制游戲暫停

if(e.getKeyChar()=='s'){//如果按下s,則游戲暫停

//判斷游戲是否結(jié)束

if(!isrunning){

return;

pause++;

//判斷是按下一次,暫停游戲

if(pause==1){

game_pause=true;

Label1.setText("游戲狀態(tài):暫停中!");

//判斷是按下兩次,繼續(xù)游戲

if(pause==2){

game_pause=false;

pause=0;//重置暫停次數(shù)

Label1.setText("游戲狀態(tài):正在游戲中!");

//控制方塊進(jìn)行變形

if(e.getKeyChar()==KeyEvent.VK_SPACE){

//判斷游戲是否結(jié)束

if(!isrunning){

return;

//判斷游戲是否暫停

if(game_pause){

return;

//定義變量,存儲(chǔ)目前方塊的索引

intold;

for(old=0;oldallRect.length;old++){

//判斷是否是當(dāng)前方塊

if(rect==allRect[old]){

break;

//定義變量,存儲(chǔ)變形后的方塊

intnext;

//判斷是完整方塊

if(old==0||old==7||old==8||old==9){

return;

//清除當(dāng)前方塊

clear(x,y);

if(old==1||old==2){

next=allRect[old==12:1];

//如果可以變形

if(canTurn(next,x,y)){

rect=next;

if(old=3old=6){

next=allRect[old+163:old+1];

if(canTurn(next,x,y)){

rect=next;

if(old==10||old==11){

next=allRect[old==1011:10];

if(canTurn(next,x,y)){

rect=next;

if(old==12||old==13){

next=allRect[old==1213:12];

if(canTurn(next,x,y)){

rect=next;

if(old=14old=17){

next=allRect[old+11714:old+1];

if(canTurn(next,x,y)){

rect=next;

if(old==18||old==19){

next=allRect[old==1819:18];

if(canTurn(next,x,y)){

rect=next;

if(old==20||old==21){

next=allRect[old==2021:20];

if(canTurn(next,x,y)){

rect=next;

//重新繪制變形后的方塊

draw(x,y);

publicbooleancanTurn(inta,intm,intn){

//創(chuàng)建變量

inttemp=0x8000;

//遍歷整個(gè)方塊

for(inti=0;ii++){

for(intj=0;jj++){

if((temprect)!=0){

if(data[m][n]==1){

returnfalse;

n++;

temp=1;

m++;

n=n-4;

//可以變形

returntrue;

@Override

publicvoidkeyPressed(KeyEvente){

//方塊進(jìn)行左移

if(e.getKeyCode()==37){//左箭頭對(duì)應(yīng)的數(shù)值為37

//判斷游戲是否結(jié)束

if(!isrunning){

return;

//判斷游戲是否暫停

if(game_pause){

return;

//方塊是否碰到左墻壁

if(y=1){

return;

//方塊的左邊是否有方塊

inttemp=0x8000;

for(inti=x;ix+4;i++){

for(intj=y;jy+4;j++){

if((temprect)!=0){

if(data[i][j-1]==1){

return;

temp=1;

//清除目前方塊

clear(x,y);

y--;//向左移動(dòng)

draw(x,y);//重新繪制出向左移動(dòng)后的方塊

//方塊進(jìn)行右移

if(e.getKeyCode()==39){//右箭頭對(duì)應(yīng)的數(shù)值為39

//判斷游戲是否結(jié)束

if

溫馨提示

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