⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 singletetirs.java

📁 原创的俄罗斯方块java小游戏
💻 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 + -