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

📄 elosframe.java

📁 一个用java写的俄罗斯方块小游戏
💻 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 + -