📄 block.java
字号:
import java.awt.*;
import javax.swing.*;
//所有方块的根类,作为主窗体类的内部类
public abstract class Block{
int[] rows;//四个小方块的行号
int[] columns;//四个小方块的列号
Color color;
Boolean isToBottom,isToTop,isClear;//到顶,到底和是否可以清除方块以计分的标志
final int LEFT=1;//方块动作标志常量
final int RIGHT=2;
final int TURN=3;
final int DOWN=4;
final int NORMAL=5;
int direction;//动作标志
int status;//方块翻转的当前状态
GameMainFrame gmf;
public Block(GameMainFrame gmf){
this.gmf=gmf;
rows=new int[4];
columns=new int[4];
for(int i=0;i<4;i++){
rows[i]=0;
columns[i]=0;
}
isToBottom=false;
isToTop=false;
isClear=false;
direction=0;
status=1;
}
abstract void turn();//抽象方法,由所有方块子类实现(实现各方块的翻转方法)
public void clear(){//清楚方法
for(int i=0;i<4;i++){
gmf.playBlocks[rows[i]][columns[i]].setBackground(Color.lightGray);
gmf.playBlocks[rows[i]][columns[i]].setVisible(false);
}
}
public void show(){//刷新方法
for(int i=0;i<4;i++){
gmf.playBlocks[rows[i]][columns[i]].setBackground(color);
gmf.playBlocks[rows[i]][columns[i]].setVisible(true);
}
}
public void downToBottom(){//方块一下到底
while(!isToBottom)dowmoneLine();
}
public void dowmoneLine(){//方块逐层下落
for(int i=0;i<4;i++){
if(rows[i]==19){
isToBottom=true;
break;
}
if(gmf.flagBlocks[rows[i]+1][columns[i]]!=0){//方块下有方块则标志到底
isToBottom=true;
if(rows[i]<=2){
isToTop=true;
}
break;
}
}
if(isToTop){//到顶,游戏结束
//JOptionPane.showMessageDialog(gmf.gameJPanel,this,"游戏结束!");
//JOptionPane.showMseeageDialog(gmf,"游戏结束!","游戏结束!",JOptionPane.INFORMATION_MESSAGE);
return;
}
if(isToBottom){//到底,设置底部标志
for(int j=0;j<4;j++){
gmf.flagBlocks[rows[j]][columns[j]]=1;
}
gmf.score+=5;
//清楚能够消除的行
for(int i=0;i<20;i++){
isClear=true;
for(int j=0;j<15;j++){
if(gmf.flagBlocks[i][j]==0){//一行中有空格(即没满),退出该层循环
isClear=false;
break;
}
}
if(isClear){
for(int j=i;j>0;j--){
for(int k=0;k<15;k++){
gmf.flagBlocks[j][k]=gmf.flagBlocks[j-1][k];//将待消行的上一行的标志付给该行
gmf.playBlocks[j][k].setBackground(gmf.playBlocks[j-1][k].getBackground());
if(gmf.flagBlocks[j][k]!=0)gmf.playBlocks[j][k].setVisible(true);
else gmf.playBlocks[j][k].setVisible(false);
}
}
//消行之后累分
gmf.score+=20;
gmf.totalLines++;
gmf.currentLines++;
if(gmf.currentLines>20&&gmf.level<=10){
gmf.currentLines=0;
gmf.level++;
gmf.speed-=50;
}
}//if(isClear)
}//for
gmf.score_JLabel.setText(Long.toString(gmf.score));//更新记分
}//if(isToBottom)
this.clear();
for(int i=0;i<4;i++){
if(!isToBottom)rows[i]++;
}
this.show();
}
public void left(){//方块向左移
for(int i=0;i<4;i++){
if(columns[i]<=0)return;//到左边界,返回
if(gmf.flagBlocks[rows[i]][columns[i]-1]!=0)return;//左边界有方块,返回
}
clear();//清除方块显示
for(int i=0;i<4;i++)columns[i]--;//左移一列
show();//重新显示方块
}
public void right(){//方块向右移
for(int i=0;i<4;i++){
if(columns[i]>=14)return;//到右边界,返回
if(gmf.flagBlocks[rows[i]][columns[i]+1]!=0)return;//右边界有方块,返回
}
clear();//清除方块显示
for(int i=0;i<4;i++)columns[i]++;//左移一列
show();//重新显示方块
}
public boolean getIsBottom(){//返回到底标志
return this.isToBottom;
}
public boolean getIsTop(){//返回到顶标志
return this.isToTop;
}
public void setDirection(int direction){//设置方向标志
this.direction=direction;
}
public int getDirection(){//返回方向标志
return this.direction;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -