版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 衛(wèi)生用品更衣室管理制度
- 衛(wèi)生院行風(fēng)督查制度
- 衛(wèi)生院三病物資管理制度
- 生活區(qū)衛(wèi)生物品管理制度
- 衛(wèi)生院疾病預(yù)防管理制度
- 衛(wèi)生所規(guī)范管理制度
- 養(yǎng)殖場(chǎng)日常衛(wèi)生管理制度
- 幼兒園8項(xiàng)衛(wèi)生管理制度
- 衛(wèi)生所首診負(fù)責(zé)制度
- 衛(wèi)生院新冠病人轉(zhuǎn)診制度
- 九年級(jí)年級(jí)組長(zhǎng)工作總結(jié)
- 2025屆安徽省省級(jí)示范高中高一物理第一學(xué)期期末經(jīng)典試題含解析
- 現(xiàn)金日記賬模板(出納版)
- DB34T 1948-2013 建設(shè)工程造價(jià)咨詢檔案立卷標(biāo)準(zhǔn)
- 2024中藥藥渣處理協(xié)議
- 心源性暈厥的查房
- 機(jī)械氣道廓清技術(shù)臨床應(yīng)用專家共識(shí)(2023版)解讀
- 壓力性損傷風(fēng)險(xiǎn)評(píng)估與管理護(hù)理課件
- 專家解析:渲染,烘托等的區(qū)別課件
- 廣州花城匯UUPARK招商手冊(cè)
- 20S517 排水管道出水口
評(píng)論
0/150
提交評(píng)論