📄 singletetirs.java
字号:
//Filename:SingleTetirs.java
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class SingleTetirs implements Runnable
{
Graphics g;
Component c;
Thread DownThread;
long GAME_SPEED;
long GAME_SCORE;
long GAME_LEVEL;
long GAME_LINE;
boolean GAME_RUNNING;
Draw d;
int MAPX,MAPY;
int MAP_ARRAY[][];
int MAP_SHOW_ARRAY[][];
Color MAP_COLOR_ARRAY[][];
int GRIDX,GRIDY;
int BRICK_WIDTH;
int BRICK_SIDE;
int NEXT_BRICK_NUMBER;
boolean IS_SHOW_NEXT;
int NOW_BRICK;
int NOW_BRICK_DIRECT;
int NOW_BRICK_X,NOW_BRICK_Y;
SuperBrick NowBrick;
Color NOW_BRICK_COLOR;
ArrayList BrickArray;
ArrayList NextBrickArray;
ArrayList NextBrickColorArray;
public SingleTetirs(Graphics g,
int mapx,int mapy,
int gridx,int gridy,
int brick_width,
int brick_side,
int next_brick_number,
boolean is_show_next,
Component c)
{//初始各参数
this.c=c;
this.g=g;
this.MAPX=mapx;
this.MAPY=mapy;
this.GRIDX=gridx;
this.GRIDY=gridy;
this.BRICK_WIDTH=brick_width;
this.BRICK_SIDE=brick_side;
this.NEXT_BRICK_NUMBER=next_brick_number;
this.IS_SHOW_NEXT=is_show_next;
this.MAP_ARRAY=new int[GRIDX][GRIDY];
this.MAP_SHOW_ARRAY=new int[GRIDX][GRIDY];
this.MAP_COLOR_ARRAY=new Color[GRIDX][GRIDY];
this.NOW_BRICK_X=0;
this.NOW_BRICK_Y=0;
this.GAME_SPEED=1000;
this.GAME_SCORE=0;
this.GAME_LEVEL=1;
this.GAME_LINE=0;
//地图数组归零
for(int i=0;i<GRIDX;i++)
for(int j=0;j<GRIDY;j++)
{
this.MAP_ARRAY[i][j]=0;
this.MAP_SHOW_ARRAY[i][j]=0;
}
BrickArray=new ArrayList();
BrickArray.add(new Brick_BB());
BrickArray.add(new Brick_I());
BrickArray.add(new Brick_L());
BrickArray.add(new Brick_UL());
BrickArray.add(new Brick_UT());
BrickArray.add(new Brick_UZ());
BrickArray.add(new Brick_Z());
NextBrickArray=new ArrayList();
NextBrickColorArray=new ArrayList();
for(int i=0;i<(NEXT_BRICK_NUMBER+1);i++)
{
createNextBrick();
}
d=new Draw(this);
d.DrawMapFrame(0,0,GRIDX*BRICK_WIDTH+2*5,GRIDY*BRICK_WIDTH+2*5,5);
d.DrawMapFrame(290,0,200,350,5);
d.DrawMapFrame(290,350,200,140,5);
showNextBrickGroup();
addNextBrick();
showNextBrick();
updateGame(0);
DownThread=new Thread(this);
DownThread.start();
}//End of method:SingleTetirs
public void paint()
{
d.DrawMapFrame(0,0,GRIDX*BRICK_WIDTH+2*5,GRIDY*BRICK_WIDTH+2*5,5);
d.DrawMapFrame(290,0,200,350,5);
d.DrawMapFrame(290,350,200,140,5);
showNextBrickGroup();
updateGame(0);
reLoadMap();
showNextBrick();
}
public void run()
{
try
{
Thread.sleep(GAME_SPEED);
keyPress(KeyEvent.VK_DOWN);
DownThread=new Thread(this);
DownThread.start();
}
catch(Exception e)
{
e.printStackTrace();
}
}
//更新游戏数据
public void updateGame(int line)
{
d.DrawMapFrame(290,350,200,140,5);
GAME_SCORE+=50*line*line*line*(0.5)*GAME_LEVEL;
GAME_LEVEL=GAME_SCORE/5000+1;
GAME_SPEED=800/GAME_LEVEL+200;
GAME_LINE+=line;
d.DrawFont("级数:"+GAME_LEVEL,300,400,16,Color.cyan,"标楷体");
d.DrawFont("分数:"+GAME_SCORE,300,430,16,Color.red,"标楷体");
d.DrawFont("行数:"+GAME_LINE,300,460,16,Color.green,"标楷体");
}
public void createNextBrick()
{
NextBrickArray.add(new Integer((int)(Math.random()*BrickArray.size())));
NextBrickColorArray.add(new Color((int)(Math.random()*128+127),
(int)(Math.random()*128+127),
(int)(Math.random()*128+127)));
}
public boolean isPut(int x,int y,int type,int mode)
{
SuperBrick sb=(SuperBrick)BrickArray.get(type);
for(int i=0;i<=4;i++)
for(int j=0;j<=4;j++)
{
if(sb.BRICK_ARRAY[mode][i][j]==1)
{
if((i+x)<0||(i+x)>(GRIDX-1)||(j+y)<0||(j+y)>(GRIDY-1)||MAP_ARRAY[i+x][j+y]==1)
return false;
}
}
return true;
}
public void addBrickToMap()
{
for(int i=0;i<=4;i++)
for(int j=0;j<=4;j++)
{
if((NOW_BRICK_X+i)>=0&&(NOW_BRICK_X+i)<GRIDX&&
(NOW_BRICK_Y+j)>=0&&(NOW_BRICK_Y+j)<GRIDY&&
NowBrick.BRICK_ARRAY[NOW_BRICK_DIRECT][i][j]==1)
{
MAP_ARRAY[NOW_BRICK_X+i][NOW_BRICK_Y+j]=1;
MAP_COLOR_ARRAY[NOW_BRICK_X+i][NOW_BRICK_Y+j]=NOW_BRICK_COLOR;
}
}
}
public void addNextBrick()
{
NextBrickArray.remove(0);
NextBrickColorArray.remove(0);
NOW_BRICK=((Integer)NextBrickArray.get(0)).intValue();
NOW_BRICK_COLOR=(Color)NextBrickColorArray.get(0);
NOW_BRICK_DIRECT=0;
NOW_BRICK_X=(GRIDX-5)/2;
NOW_BRICK_Y=0;
NowBrick=(SuperBrick)BrickArray.get(NOW_BRICK);
createNextBrick();
}
//显示下一个砖块组
public void showNextBrick()
{
if(this.isPut(NOW_BRICK_X,NOW_BRICK_Y,NOW_BRICK,NOW_BRICK_DIRECT))
{
d.DrawBrickGroup(NOW_BRICK_X,NOW_BRICK_Y,NOW_BRICK,NOW_BRICK_DIRECT,NOW_BRICK_COLOR);
}
else DownThread.stop();
}
//检查满行
public void checkFull()
{
boolean blFull=true;
int delLine=0;
for(int j=NOW_BRICK_Y;j<(NOW_BRICK_Y+5);j++)
{
blFull=true;
for(int i=0;i<GRIDX;i++)
{
if(j>0&&j<GRIDY)
{
if(MAP_ARRAY[i][j]!=1) //!!!!!!?
{
blFull=false;
//break;
}
else blFull=false;
}
}
if(blFull)
{
removeFull(j);
delLine++;
}
}
if(delLine>0)reLoadMap();
updateGame(delLine);
}
//删除满行
public void removeFull(int line)
{
for(int j=line;j>0;j--)
{
for(int i=0;i<GRIDX;i++)
{
MAP_ARRAY[i][j]=MAP_ARRAY[i][j-1];
MAP_COLOR_ARRAY[i][j]=MAP_COLOR_ARRAY[i][j-1];
}
}
for(int i=0;i<GRIDX;i++)
{
MAP_ARRAY[i][0]=0;
MAP_COLOR_ARRAY[i][0]=Color.black;
}
}
//重新加载地图砖块
public void reLoadMap()
{
for(int i=0;i<GRIDX;i++)
for(int j=0;j<GRIDY;j++)
{
if(MAP_ARRAY[i][j]==1)d.DrawBrick(i,j,MAP_COLOR_ARRAY[i][j]);
else d.DrawBrick(i,j,Color.black);
}
}
//显示下一组砖块
public void showNextBrickGroup()
{
new MoveThread(this).start();
}
//按键事件
public synchronized void keyPress(int KEYCODE)
{
int x=NOW_BRICK_X;
int y=NOW_BRICK_Y;
int direct=NOW_BRICK_DIRECT;
switch(KEYCODE)
{
case KeyEvent.VK_UP:
NOW_BRICK_DIRECT++;
if(NOW_BRICK_DIRECT>=4)NOW_BRICK_DIRECT=0;
if(isPut(NOW_BRICK_X,NOW_BRICK_Y,NOW_BRICK,NOW_BRICK_DIRECT))d.DrawBrickGroup(x,y,direct);
else
{
NOW_BRICK_DIRECT--;
if(NOW_BRICK_DIRECT<0)NOW_BRICK_DIRECT=3;
}
break;
case KeyEvent.VK_DOWN:
if(isPut(NOW_BRICK_X,NOW_BRICK_Y+1,NOW_BRICK,NOW_BRICK_DIRECT))
{
NOW_BRICK_Y++;
d.DrawBrickGroup(x,y,direct);
}
else
{
showNextBrickGroup();
addBrickToMap();
checkFull();
addNextBrick();
showNextBrick();
}
break;
case KeyEvent.VK_LEFT:
if(isPut(NOW_BRICK_X-1,NOW_BRICK_Y,NOW_BRICK,NOW_BRICK_DIRECT))
{
NOW_BRICK_X--;
d.DrawBrickGroup(x,y,direct);
}
break;
case KeyEvent.VK_RIGHT:
if(isPut(NOW_BRICK_X+1,NOW_BRICK_Y,NOW_BRICK,NOW_BRICK_DIRECT))
{
NOW_BRICK_X++;
d.DrawBrickGroup(x,y,direct);
}
break;
case KeyEvent.VK_SPACE:
while(isPut(NOW_BRICK_X,NOW_BRICK_Y+1,NOW_BRICK,NOW_BRICK_DIRECT))
{
NOW_BRICK_Y++;
d.DrawBrickGroup(x,y,direct);
x=NOW_BRICK_X;
y=NOW_BRICK_Y;
}
addBrickToMap();
checkFull();
addNextBrick();
showNextBrickGroup();
showNextBrick();
break;
case KeyEvent.VK_ESCAPE:
System.exit(0);
break;
case KeyEvent.VK_PAUSE:
if(DownThread.isAlive())DownThread.stop();
else
{
DownThread=new Thread(this);
DownThread.start();
}
break;
}
}
}
class Draw
{
SingleTetirs st;
//创建子
public Draw(SingleTetirs st)
{
this.st=st;//指定绘图区
}
//画出砖块组动作区地图外框
public void DrawMapFrame(int x,int y,int wid,int hig,int side)
{
//定义多边形坐标
int xx[][]={{x,x+wid,x+wid-side,x+side},//上
{x+wid-side,x+wid,x+wid,x+wid-side},//右
{x+side,x+wid-side,x+wid,x},//下
{x,x+side,x+side,x}};//左
int yy[][]={{y,y,y+side,y+side},//上
{y+side,y,y+hig,y+hig-side},//右
{y+hig-side,y+hig-side,y+hig,y+hig},//下
{y,y+side,y+hig-side,y+hig}};//左
//画出多边形
for(int i=0;i<=3;i++)
{
switch(i)
{
case 0:
case 1:
st.g.setColor(new Color(150,150,150));
break;
case 2:
case 3:
st.g.setColor(new Color(180,180,180));
break;
}
st.g.fillPolygon(xx[i],yy[i],4);
st.g.setColor(Color.black);
st.g.fillRect(x+side-1,y+side-1,wid-side*2+2,hig-side*2+2);
}
}
//画出砖块组
public void DrawBrickGroup(int x,int y,int type,int direct,Color c)
{
SuperBrick sb=(SuperBrick)st.BrickArray.get(type);
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
if(sb.BRICK_ARRAY[direct][i][j]==1)DrawBrick((i+x),(j+y),c);
}
}
//画出砖块组(清除前一个砖块组)
public void DrawBrickGroup(int fx,int fy,int fdirect)
{
//清除前一个砖块组
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
if((i+st.NOW_BRICK_X)>=0&&(i+st.NOW_BRICK_X)<st.GRIDX&&
(j+st.NOW_BRICK_Y)>=0&&(j+st.NOW_BRICK_Y)<st.GRIDY)
{
if(st.NowBrick.BRICK_ARRAY[fdirect][i][j]==1)DrawBrick(i+fx,j+fy,Color.black);
}
}
//画出现在砖块组
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
if((i+st.NOW_BRICK_X)>=0&&(i+st.NOW_BRICK_X)<st.GRIDX&&
(j+st.NOW_BRICK_Y)>=0&&(j+st.NOW_BRICK_Y)<st.GRIDY)
{
if(st.NowBrick.BRICK_ARRAY[st.NOW_BRICK_DIRECT][i][j]==1)
DrawBrick(i+st.NOW_BRICK_X,j+st.NOW_BRICK_Y,st.NOW_BRICK_COLOR);
}
}
}
//画出单一砖块
public void DrawBrick(int x,int y,Color c)
{
st.g.setColor(Color.black);
st.g.drawRect(x*st.BRICK_WIDTH+st.MAPX,y*st.BRICK_WIDTH+st.MAPY,
st.BRICK_WIDTH-1,st.BRICK_WIDTH-1);
st.g.setColor(c);
st.g.fill3DRect(x*st.BRICK_WIDTH+st.MAPX+st.BRICK_SIDE,
y*st.BRICK_WIDTH+st.MAPY+st.BRICK_SIDE,
st.BRICK_WIDTH-st.BRICK_SIDE*2,
st.BRICK_WIDTH-st.BRICK_SIDE*2,true);
}
//画出字型
public void DrawFont(String str,int x,int y,int size,Color c,String fs)
{
Font f=new Font(fs,Font.BOLD,size);
st.g.setColor(c);
st.g.setFont(f);
st.g.drawString(str,x,y);
}
}
class MoveThread extends Thread
{
SingleTetirs s;
Graphics g;
Draw d;
Component c;
Image img;
Graphics sg;
public MoveThread(SingleTetirs s)
{
this.s=s;
this.g=s.g;
this.d=s.d;
this.c=s.c;
img=c.createImage(190,340);
sg=img.getGraphics();
}
public void run()
{
for(int i=0;i<4;i++)
{
try
{
sleep(50);
showNextBrickGroup(i);
g.drawImage(img,295,5,c);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
//显示下一组砖块
public void showNextBrickGroup(int index)
{
sg.setColor(Color.black);
sg.fillRect(0,0,190,340);
for(int j=0;j<s.NextBrickArray.size();j++)
{
int m=((Integer)s.NextBrickArray.get(j)).intValue();
Color c=((Color)s.NextBrickColorArray.get(j));
DrawBrickGroup((2),((j)*4)-index,m,0,c);
}
}
//画出砖块组
public void DrawBrickGroup(int x,int y,int type,int direct,Color c)
{
SuperBrick sb=(SuperBrick)s.BrickArray.get(type);
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
if(sb.BRICK_ARRAY[direct][i][j]==1)DrawBrick((i+x),(j+y),c);
}
}
//画出单一砖块
public void DrawBrick(int x,int y,Color c)
{
sg.setColor(Color.black);
sg.drawRect(x*s.BRICK_WIDTH-9,y*s.BRICK_WIDTH,s.BRICK_WIDTH-1,s.BRICK_WIDTH-1);
sg.setColor(c);
sg.fill3DRect(x*s.BRICK_WIDTH-9,y*s.BRICK_WIDTH,s.BRICK_WIDTH-s.BRICK_SIDE*2,s.BRICK_WIDTH-s.BRICK_SIDE*2,true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -