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

📄 tetris.java

📁 The game tetris on java with using concurrent lib
💻 JAVA
字号:
package homeTask_14_tetris;



import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

import javax.swing.JButton;
import javax.swing.JFrame;


public class Tetris  {


    static ScheduledFuture<?> firstGameHandler ;
	static ScheduledFuture<?> secondGameHandler ;
	static ScheduledFuture<?> thirdGameHandler ;
	static ScheduledFuture<?> fourthGameHandler ;
	static ScheduledFuture<?> fifthGameHandler ;
	
    public static void main(String[] args) {
		final Model model = new Model();
		model.init(); 

		    

		

		final JFrame frame = new JFrame("Tetris");
		frame.setSize(400, 660);
		frame.addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent e) {
				frame.dispose();
				System.exit(0);
			}
			
		});
		
		
		
		frame.setVisible(true);
		frame.setLayout(new BorderLayout());
		 final JButton  buttonStart = new JButton("StartTetris");
		 final Label labelPoints = new Label("points:");
		 final Label labelLevel = new Label("level:");
		 final Label labelLines = new Label("lines:");
		 
		 final Panel field = new Panel();
		 final Panel secondPanel = new Panel();
		 
	
		labelPoints.setBackground(Color.blue);
		labelLevel.setBackground(Color.blue);
		field.setBackground(Color.black);
	
		secondPanel.setBackground(Color.blue);

		model.addListener(new ModelListener(){

			@Override
			public void update(State state) {
				labelPoints.setText("points : "+state.getPoints());
				
				labelLevel.setText("level : "  +state.getLevel());
				labelLines.setText("lines : "  +state.getWholeRemoveRows());
				
			}
			});

		frame.add(field,BorderLayout.CENTER);
		frame.add(secondPanel,BorderLayout.EAST);
		frame.add(labelPoints, BorderLayout.NORTH);
		frame.add(labelLevel, BorderLayout.SOUTH);

		secondPanel.setLayout(new BorderLayout());
		secondPanel.add(buttonStart,BorderLayout.NORTH);
		secondPanel.add(labelLines,BorderLayout.CENTER);
		
	

		model.addListener(new ModelListener() {

			@Override
			public void update(State state) {

				Graphics gr = field.getGraphics();
				final int widField   = field.getBounds().width;
				final int heigField  = field.getBounds().height;
//				create image for unblinking field
				Image    im = field.createImage(widField, heigField);
	             Graphics g     = im.getGraphics(); 
				
	             final int countCols = State.WIDTH;
				 final int countRows = State.HEIGHT;
				 
				  Graphics2D g2 = (Graphics2D) gr;
                  String message ="Game Over";
//				showing that game was stop
				if (state.getStateOfGame()==1){
				  
					Font  f = new Font("Serif",Font.ITALIC,40);
				   
					g2.setFont(f);
				   
					FontRenderContext context = g2.getFontRenderContext();
				   
					Rectangle2D bounds = f.getStringBounds(message, context);
				   
					double x = (field.getWidth()-bounds.getWidth())/2;
				    double y = (field.getHeight()-bounds.getHeight())/2;
				   
				    double ascent = -bounds.getY();
				    double baseY = y +ascent;
				   
				    g2.setColor(Color.white);
				    g2.drawString(message, (int)x, (int)baseY);
				   
				    return;
				   }
				
				for (int cols = 0; cols < countCols; cols++) 
        	    {
            		for (int rows = 0; rows < countRows; rows++) 
            		{
            		    int figure_part = state.getField()[cols][rows];
            
            		    if (figure_part != 0) 
            		    {
               			   
            		    	g.setColor(model.setFigureColor(figure_part));
               			    g.fillRect((cols*(widField)/countCols) ,  (rows*(heigField)/countRows) ,  ( widField/ countCols)+1 , (heigField / countRows) );
               			    g.setColor(Color.black);
               			    g.drawRect((cols*(widField)/countCols) ,  (rows*(heigField)/countRows) ,  ( widField/ countCols)+1 , (heigField / countRows) );
                			}
            		}
        	    } 
				
				gr.drawImage(im, 0, 0, widField, heigField, null);
				g.dispose();
				gr.dispose();

			}

		});
		

		 final Runnable timerTask = new Runnable() {

			@Override
			public void run() {
				 model.sendNextAndCheck();
				 model.moveDown();
				 
				}

		};

		
		final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

		 ActionListener acListener = (new ActionListener()
		 {
			 public void actionPerformed(ActionEvent e)
			 {
				 model.ClearResults();
				 firstGameHandler = scheduler.scheduleAtFixedRate(timerTask, 800,800 , TimeUnit.MILLISECONDS); 
				 frame.requestFocus();
		         buttonStart.setEnabled(false);
			 }
		 });
		 buttonStart.addActionListener(acListener);
		 

		 
		
		 
		 model.addListener(new ModelListener() {

			@Override
			public void update(State state) {
				int StateOfGame =state.getStateOfGame();
				int level = state.getLevel();
				if ((StateOfGame==1) ){
					switch(level){
					case 0: firstGameHandler.cancel(true);break;
					case 1: secondGameHandler.cancel(true);break;
					case 2: thirdGameHandler.cancel(true);break;
					case 3: fourthGameHandler.cancel(true);break;
					case 4: fifthGameHandler.cancel(true);break;
					}
					
					buttonStart.setEnabled(true);
				}
				
			}
			 
		 });
		
		
		

		

		
		model.addListener(new ModelListener() {

			
			@Override
			public void update(State state) {
				int level = state.getLevel();
				if (level ==1 && !(firstGameHandler.isCancelled())){
					firstGameHandler.cancel(true);
					secondGameHandler = scheduler.scheduleAtFixedRate(timerTask, 600, 600, TimeUnit.MILLISECONDS);
				}
				if (level ==2  && !(secondGameHandler.isCancelled())){
					secondGameHandler.cancel(true);
					thirdGameHandler = scheduler.scheduleAtFixedRate(timerTask, 500, 400, TimeUnit.MILLISECONDS);
					
				}
				if (level ==3  &&!(thirdGameHandler.isCancelled())){
					thirdGameHandler.cancel(true);
					fourthGameHandler = scheduler.scheduleAtFixedRate(timerTask, 500, 250, TimeUnit.MILLISECONDS);
					
				}
				if (level ==4  &&!(fourthGameHandler.isCancelled())){
					fourthGameHandler.cancel(true);
					fifthGameHandler = scheduler.scheduleAtFixedRate(timerTask, 500, 150, TimeUnit.MILLISECONDS);
					
				}
				
				
			}

		});
		
		 
			
			frame.addKeyListener(new KeyListener(){

	@Override
	public void keyPressed(KeyEvent e) {
		switch (e.getKeyCode()) 
    	{
        	case KeyEvent.VK_LEFT  : model.moveLeft();
        	                         break;
        	case KeyEvent.VK_RIGHT : model.moveRight();
        	                         break;
        	case KeyEvent.VK_UP    : model.rotate();
        	                         break;
        	case KeyEvent.VK_DOWN  : model.moveDown();
                                     break;
            case KeyEvent.VK_SHIFT : model.dropDown();
                                     break;
            case KeyEvent.VK_ESCAPE: System.exit(0);
                                     break;
    	}		
	}

	@Override
	public void keyReleased(KeyEvent e) {
		
	}

	@Override
	public void keyTyped(KeyEvent e) {
		
	}
	});
	}

	
    
	}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -