📄 elosframe.java
字号:
package com.e.user;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import java.util.Scanner;
public class ElosFrame extends Frame implements WindowListener
{
Dialog dlg;//窗口退出时的对话框
private final int DMOVE=-1;
private final int keyLeft=37;
private final int keyNum4=100;
private final int keyA=65;
private final int keyUp=38;
private final int keyNum8=104;
private final int keyW=87;
private final int keySpace=32;
private final int keyRight=39;
private final int keyNum6=102;
private final int keyD=68;
private final int keyDown=40;
private final int keyNum5=101;
private final int keyS=83;
private final int keyEnter=10;
private final int keyNum2=98;
private final int keyX=88;
private final int keyEsc=27;
private int fenbianlv=15;//1-15调节分辨率
private int jianGe=2;
private final int MAXX=20,MAXY=40;
private final int PX=50,PY=60,P_WIDTH=MAXX*fenbianlv,P_HEIGHT=MAXY*fenbianlv;
private final int BAR_WIDTH=P_WIDTH/MAXX,BAR_HEIGHT=P_HEIGHT/MAXY;
private int areaX,areaY;
private int score=0;
private int MESSAGE;
private final int T=4;//控制小盒子的大小
private final int N=7;//小盒子个数
private int[][] box=new int[T][T];
private int[][] area=new int[MAXY][MAXX];
private final int[][][] BOX={
{
{0,0,0,0},
{1,1,1,1},
{0,0,0,0},
{0,0,0,0}
},
{
{0,0,0,0},
{1,1,1,0},
{0,1,0,0},
{0,0,0,0}
},
{
{0,0,0,0},
{1,1,1,0},
{1,0,0,0},
{0,0,0,0}
},
{
{0,0,0,0},
{0,1,1,1},
{0,0,0,1},
{0,0,0,0}
},
{
{0,0,0,0},
{1,1,0,0},
{0,1,1,0},
{0,0,0,0}
},
{
{0,0,0,0},
{0,1,1,0},
{1,1,0,0},
{0,0,0,0}
},
{
{0,0,0,0},
{0,1,1,0},
{0,1,1,0},
{0,0,0,0}
}
};
private Canvas canvas=new Canvas();
private Graphics g;
private int timeDelay=150;
private boolean on=false;//控制游戏开关
public ElosFrame()
{
super("小方块游戏");
// requestFocus(); 唤醒键盘事件
canvas.addKeyListener(new KeyList());
canvas.addMouseListener(new MouseListen());
setBounds(100,30,600,700);
add(canvas);canvas.setBackground(Color.cyan);
addWindowListener(this);
setVisible(true);
g=canvas.getGraphics();
}
public void windowClosing(WindowEvent e){esc();}
public void windowClosed(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e)//窗口还原
{
initDraw();
}
public void windowOpened(WindowEvent e){}
private class KeyList implements KeyListener
{
public void keyPressed(KeyEvent e)
{
int m=e.getKeyCode();
if(m!=37&&m!=100&&m!=38&&m!=104&&m!=32&&m!=39&&m!=102&&m!=40&&m!=101
&&m!=10&&m!=98&&m!=27&&m!=65&&m!=87&&m!=68&&m!=83&&m!=88)
MESSAGE=DMOVE;
else MESSAGE=m;
}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}
}
private class MouseListen extends MouseAdapter
{
public void mouseClicked(MouseEvent e)
{
on=true;
}
}
private void begin()
{
int box_i;
char ch;
initDraw();
Random random=new Random();
do
{while(!on){}
box_i=random.nextInt(N);
areaY=0;
areaX=(MAXX+1)/2-1;
fbox(box_i);
farea(areaX,areaY);
draw(areaX,areaY);
MESSAGE=DMOVE;
while(noEnd(areaX,areaY))
{
if(MESSAGE==DMOVE)
{
timeDelay(timeDelay);//等待并接收键盘事件
timeDelay=150;//为了处理keyDown事件实现加速,只能这样
}
else
MESSAGE=DMOVE;
clearArea(areaX,areaY);
clearP(areaX,areaY);
switch(MESSAGE)
{
case keyNum4 :
case keyA :
case keyLeft :leftMoveArea(); break;
case keyNum6 :
case keyD :
case keyRight:rightMoveArea();break;
case keyNum2 :
case keyX :
case keyEnter:downMoveArea(); break;
case keyNum5 :
case keyS :
case keyDown :addDownMoveArea();break;
case keyNum8 :
case keyW :
case keySpace:
case keyUp :rotate_box();farea(areaX,areaY);break;
case keyEsc :esc();break;
case DMOVE :dMoveArea();
}
draw(areaX,areaY);
}
deleteLine(areaX,areaY);
}while(!gameOver());
// timeDelay(1000);
// esc();
}
private void initDraw()
{
timeDelay(100);
g.setColor(Color.ORANGE);
g.drawString("鼠标点击画布开始游戏",PX+P_WIDTH+10,200);
g.drawString("英文状态可用WASDX或Num Lock 4 5 8 2 6控制方块",PX+P_WIDTH,220);
g.setColor(Color.RED);
g.drawRect(PX-2,PY-2,P_WIDTH+4-jianGe,P_HEIGHT+4-jianGe);
g.drawRect(PX-1,PY-1,P_WIDTH+2-jianGe,P_HEIGHT+2-jianGe);
g.setColor(Color.GREEN);
g.fillRect(PX,PY,P_WIDTH,P_HEIGHT);
}
private void fbox(int b_i)
{
int i,j;
for(i=0;i<T;i++)
for(j=0;j<T;j++)
box[i][j]=BOX[b_i][i][j];
}
private void farea(int x,int y)
{
int i,j;
for(i=0;i<T;i++)
for(j=0;j<T;j++)
{
if(box[i][j]==1)
area[y+i][x+j]=1;
}
}
private void draw(int x,int y)//参数x,y已经无用
{
int px,py;
int i,j;
g.setColor(Color.BLACK);
g.fillRect(PX+P_WIDTH+10,55,100,20);
g.setColor(Color.RED);
g.drawString("分数:"+score,PX+P_WIDTH+10,70);
for(i=0;i<MAXY;i++) //刷屏
for(j=0;j<MAXX;j++)
{
if(area[i][j]==1)
{
g.setColor(Color.WHITE);
g.fillRect(PX+j*BAR_WIDTH,PY+i*BAR_HEIGHT,BAR_WIDTH-jianGe,BAR_HEIGHT-jianGe);
}
else
{
g.setColor(Color.GREEN);
g.fillRect(PX+j*BAR_WIDTH,PY+i*BAR_HEIGHT,BAR_WIDTH,BAR_HEIGHT);
}
}
}
private boolean noEnd(int x,int y)
{ int i,j;
/*if(y==MAXY-T) return false; */
for(i=T-1;i>=0;i--)//判断是否到底
{
for(j=T-1;j>=0;j--)
if(box[i][j]==1) break;
if((j!=-1)&&(box[i][j]==1)) break;
} if(i+y>=MAXY-1) return false;
/*if area[y+1][x]==1 return false*/
for(i=T-1;i>=0;i--)//判断是否有阻碍
for(j=T-1;j>=0;j--)
{if(box[j][i]==1)
if(area[y+j+1][x+i]==1) return false;
else break;
}
return true;
}
private void timeDelay(int times)
{
try{
Thread.sleep(times);
}catch(Exception e){}
}
private void clearArea(int x,int y)
{
int i,j;
for(i=0;i<T;i++)
for(j=0;j<T;j++)
if(box[i][j]==1)
area[y+i][x+j]=0;
}
private void clearP(int x,int y)
{
int px,py;
int i,j;
g.setColor(Color.GREEN);
for(i=0;i<T;i++)
for(j=0;j<T;j++)
if(box[i][j]==1)
{
px=PX+BAR_WIDTH*(x+j);
py=PY+BAR_HEIGHT*(y+i);
g.fillRect(px,py,BAR_WIDTH-jianGe,BAR_HEIGHT-jianGe);
}
}
private void leftMoveArea()
{
int i,j;
for(i=0;i<T;i++)//检查小方块最左边是否越界
{
for(j=0;j<T;j++)
if(box[j][i]==1)break;
if(j!=T&&box[j][i]==1)break;//(j!=T)防止数组越界
}
if(areaX+i<=0) return;
for(i=0;i<T;i++)//检查小方块左边是否有物体挡住
for(j=0;j<T;j++)
if(box[i][j]==1)
{
if(area[areaY+i][areaX+j-1]==1)return;
else break;
}
areaX--;
farea(areaX,areaY);
}
private void rightMoveArea()
{
int i,j;
for(i=T-1;i>=0;i--)//检查小方块最右边是否越界
{
for(j=T-1;j>=0;j--)
if(box[j][i]==1)break;
if((j!=-1)&&box[j][i]==1)break;//(j!=-1)防止数组越界
}
if(areaX+i>=MAXX-1)return;
for(i=T-1;i>=0;i--)//检查小方块最右边是否有阻碍
for(j=T-1;j>=0;j--)
if(box[i][j]==1)
{
if(area[areaY+i][areaX+j+1]==1)return;
else break;
}
areaX++;
farea(areaX,areaY);
}
private void dMoveArea()
{
areaY++;
farea(areaX,areaY);
}
private void addDownMoveArea()
{
dMoveArea();
draw(areaX,areaY);
timeDelay=50;
}
private void downMoveArea()
{
while(noEnd(areaX,areaY))
{
clearArea(areaX,areaY);
clearP(areaX,areaY);
dMoveArea();
draw(areaX,areaY);
}
}
private void rotate_box()
{ int[][] newBox=new int[T][T];
int i,j,jj=T;
boolean flag=true;
for(i=0;i<T;i++)//矩阵转置
{ jj--;
for(j=0;j<T;j++)
newBox[j][jj]=box[i][j];
}
flag=true;
for(i=0;i<T;i++)//判断转置后的小方块最左边是否越界
{for(j=0;j<T;j++)
if(newBox[j][i]==1)break;
if((j!=T)&&(newBox[j][i]==1))break;
}
if(areaX+i<0)flag=false;
for(i=T-1;i>=0;i--)//判断转置后的小方块最右边是否越界
{for(j=T-1;j>=0;j--)
if(newBox[j][i]==1)break;
if((j!=-1)&&(newBox[j][i]==1))break;
}
if(areaX+i>MAXX-1) flag=false;
if(flag)
{
for(i=0;i<T;i++)//在没有越界的前提下判断转置后是否有阻碍
{for(j=0;j<T;j++)
if((newBox[i][j]==1)&&(area[areaY+i][areaX+j]==1))
{flag=false;break;}
if(flag==false) break;
}
}
if(flag) //正确的改变box[][]的值
{for(i=0;i<T;i++)
for(j=0;j<T;j++)
box[i][j]=newBox[i][j];
}
}
private void deleteLine(int x,int y)
{
int i,j;
int lines=0;
boolean bl;
mm:for(i=0;i<T;i++)
{
bl=true;
for(j=0;j<MAXX;j++)
{
if(y+i>=MAXY) break mm;
if(area[y+i][j]!=1)
{
bl=false;
break;
}
}
if(bl)
{
deLineArea(y+i);
lines++;
}
}
if(lines!=0)
{
score+=lines*lines*10;
}
}
private void deLineArea(int lineY)
{
int i,j,min;
boolean bl=false;
ww:for(i=0;i<MAXY;i++)
{
for(j=0;j<MAXX;j++)
if(area[i][j]==1)break ww;
}
min=i;
for(i=lineY;i>=min;i--)
for(j=0;j<MAXX;j++)
{
if(i-1<0)return;
area[i][j]=area[i-1][j];
}
}
private void esc()
{
dlg=new Dialog(this,"退出提示框",true);
Panel p=new Panel();
Label la=new Label("确实要退出游戏吗?");
Button by=new Button(" 是 ");
Button bn=new Button(" 否 ");
by.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
bn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
dlg.setVisible(false);
}
});
p.setLayout(new FlowLayout());
p.add(by);
p.add(bn);
dlg.add(la,"Center");
dlg.add(p,"South");
dlg.setBounds(200,200,200,100);
dlg.setVisible(true);
}
private boolean gameOver()
{
int i;
for(i=0;i<MAXX;i++)
if(area[0][i]==1) return true;
return false;
}
public static void main(String[] args)throws Exception
{
ElosFrame ef=new ElosFrame();
ef.begin();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -