Game.java
上传用户:yaning5200
上传日期:2022-08-04
资源大小:62k
文件大小:12k
源码类别:

游戏

开发平台:

Java

  1. package GameXepGach;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. public class Game
  5.     extends Object {
  6.   //bat su kien Start,Resume,pause,Finish,GameOver,level,score
  7.   private SquareBoard board = null;
  8.   private SquareBoard previewBoard = new SquareBoard(5, 5);
  9.   private Figure[] figures = {
  10.       new Figure(Figure.SQUARE_FIGURE),
  11.       new Figure(Figure.LINE_FIGURE),
  12.       new Figure(Figure.S_FIGURE),
  13.       new Figure(Figure.Z_FIGURE),
  14.       new Figure(Figure.RIGHT_ANGLE_FIGURE),
  15.       new Figure(Figure.LEFT_ANGLE_FIGURE),
  16.       new Figure(Figure.TRIANGLE_FIGURE)
  17.   };
  18.   private GamePanel component = null;
  19.   private GameThread thread = null;
  20.   private int level = 1;
  21.   private int score = 0;
  22.   private Figure figure = null;
  23.   private Figure nextFigure = null;
  24.   private int nextRotation = 0;
  25.   private boolean preview = true;
  26.   private boolean moveLock = false;
  27.   public Game() {
  28.     this(10, 20);
  29.   }
  30.   public Game(int width, int height) {
  31.     board = new SquareBoard(width, height);
  32.     board.setMessage("Press start");
  33.     thread = new GameThread();
  34.   }
  35.   public void quit() {
  36.     thread = null;
  37.   }
  38.   public Component getComponent() {
  39.     if (component == null) {
  40.       component = new GamePanel();
  41.     }
  42.     return component;
  43.   }
  44.   private void handleStart() {
  45.     // Reset score and figures
  46.     level = 1;
  47.     score = 0;
  48.     figure = null;
  49.     nextFigure = randomFigure();
  50.     nextFigure.rotateRandom();
  51.     nextRotation = nextFigure.getRotation();
  52.     // Reset components
  53.     board.setMessage(null);
  54.     board.clear();
  55.     previewBoard.clear();
  56.     handleLevelModification();
  57.     handleScoreModification();
  58.     component.button.setLabel("Pause");
  59.     // Start game thread
  60.     thread.reset();
  61.   }
  62.   //Game over
  63.   private void handleGameOver() {
  64.     // Stop game thred
  65.     thread.setPaused(true);
  66.     // Reset figures
  67.     if (figure != null) {
  68.       figure.detach();
  69.     }
  70.     figure = null;
  71.     if (nextFigure != null) {
  72.       nextFigure.detach();
  73.     }
  74.     nextFigure = null;
  75.     // Handle components
  76.     board.setMessage("Game Over");
  77.     component.button.setLabel("Start");
  78.   }
  79.   //ve dich va bat dau choi lai tu dau
  80.   private void handleFinish() {
  81.     // Stop game thred
  82.     thread.setPaused(true);
  83.     // Reset figures
  84.     if (figure != null) {
  85.       figure.detach();
  86.     }
  87.     figure = null;
  88.     if (nextFigure != null) {
  89.       nextFigure.detach();
  90.     }
  91.     nextFigure = null;
  92.     // Handle components
  93.     board.setMessage("Xuat sac -Finish");
  94.     component.button.setLabel("Start");
  95.   }
  96.   //Khi an button Pause
  97.   private void handlePause() {
  98.     thread.setPaused(true);
  99.     board.setMessage("Paused");
  100.     component.button.setLabel("Resume");
  101.   }
  102.   //khi an button Resume
  103.   private void handleResume() {
  104.     board.setMessage(null);
  105.     component.button.setLabel("Pause");
  106.     thread.setPaused(false);
  107.   }
  108.   //dat level len giao dien
  109.   private void handleLevelModification() {
  110.     component.levelLabel.setText("Level: " + level);
  111.     thread.adjustSpeed();
  112.   }
  113.   //dat score len giao dien
  114.   private void handleScoreModification() {
  115.     component.scoreLabel.setText("Score: " + score);
  116.   }
  117.   //bat dau choi
  118.   private void handleFigureStart() {
  119.     int rotation;
  120.     // Move next figure to current
  121.     figure = nextFigure;
  122.     moveLock = false;
  123.     rotation = nextRotation;
  124.     nextFigure = randomFigure();
  125.     nextFigure.rotateRandom();
  126.     nextRotation = nextFigure.getRotation();
  127.     // Handle figure preview
  128.     if (preview) {
  129.       previewBoard.clear();
  130.       nextFigure.attach(previewBoard, true);
  131.       nextFigure.detach();
  132.     }
  133.     // Attach figure to game board
  134.     figure.setRotation(rotation);
  135.     if (!figure.attach(board, false)) {
  136.       previewBoard.clear();
  137.       figure.attach(previewBoard, true);
  138.       figure.detach();
  139.       handleGameOver();
  140.     }
  141.   }
  142.   //bat su kien tang cua diem,level,finish
  143.   private void handleFigureLanded() {
  144.     // Check and detach figure
  145.     if (figure.isAllVisible()) {
  146.     }
  147.     else {
  148.       handleGameOver();
  149.       return;
  150.     }
  151.     figure.detach();
  152.     figure = null;
  153.     // Check for full lines or create new figure
  154.     if (board.hasFullLines()) {
  155.       int m = board.removeFullLines();
  156.       // System.out.print(m);
  157.       score = m * 100;
  158.       if (score >= level * 500) {
  159.         level = level + 1;
  160.         this.handleLevelModification();
  161.       }
  162.       if (level == 9) {
  163.         thread.setPaused(true);
  164.         handleFinish();
  165.         //component.button.setEnabled(false);
  166.       }
  167.       handleScoreModification();
  168.       if (level < 9 && board.getRemovedLines() / 20 > level) {
  169.         level = board.getRemovedLines() / 20;
  170.         handleLevelModification();
  171.       }
  172.     }
  173.     else {
  174.       handleFigureStart();
  175.     }
  176.   }
  177.   private synchronized void handleTimer() {
  178.     if (figure == null) {
  179.       handleFigureStart();
  180.     }
  181.     else if (figure.hasLanded()) {
  182.       handleFigureLanded();
  183.     }
  184.     else {
  185.       figure.moveDown();
  186.     }
  187.   }
  188.   private synchronized void handleButtonPressed() {
  189.     if (nextFigure == null) {
  190.       handleStart();
  191.     }
  192.     else if (thread.isPaused()) {
  193.       handleResume();
  194.     }
  195.     else {
  196.       handlePause();
  197.     }
  198.   }
  199.   //bat su kien ban phiem cho Button
  200.   private synchronized void handleKeyEvent(KeyEvent e) {
  201.     // Handle start, pause and resume
  202.     if (e.getKeyCode() == KeyEvent.VK_P) {
  203.       handleButtonPressed();
  204.       return;
  205.     }
  206.     // Don't proceed if stopped or paused
  207.     if (figure == null || moveLock || thread.isPaused()) {
  208.       return;
  209.     }
  210.     // Handle remaining key events
  211.     switch (e.getKeyCode()) {
  212.       case KeyEvent.VK_LEFT:
  213.         figure.moveLeft();
  214.         break;
  215.       case KeyEvent.VK_RIGHT:
  216.         figure.moveRight();
  217.         break;
  218.       case KeyEvent.VK_DOWN:
  219.         figure.moveAllWayDown();
  220.         moveLock = true;
  221.         break;
  222.       case KeyEvent.VK_UP:
  223.       case KeyEvent.VK_SPACE:
  224.         if (e.isControlDown()) {
  225.           figure.rotateRandom();
  226.         }
  227.         else if (e.isShiftDown()) {
  228.           figure.rotateClockwise();
  229.         }
  230.         else {
  231.           figure.rotateCounterClockwise();
  232.         }
  233.         break;
  234.       case KeyEvent.VK_S:
  235.         if (level < 9) {
  236.           level++;
  237.           handleLevelModification();
  238.         }
  239.         break;
  240.       case KeyEvent.VK_N:
  241.         preview = !preview;
  242.         if (preview && figure != nextFigure) {
  243.           nextFigure.attach(previewBoard, true);
  244.           nextFigure.detach();
  245.         }
  246.         else {
  247.           previewBoard.clear();
  248.         }
  249.         break;
  250.     }
  251.   }
  252.   private Figure randomFigure() {
  253.     return figures[ (int) (Math.random() * figures.length)];
  254.   }
  255. ////////////////////////////////////////////////////////////////
  256.   private class GameThread
  257.       extends Thread {
  258.     /*cho gach chay theo toc do dinh sang ,hay cho dung ...*/
  259.     private boolean paused = true;
  260.     private int sleepTime = 500;
  261.     public GameThread() {
  262.     }
  263.     public void reset() {
  264.       adjustSpeed();
  265.       setPaused(false);
  266.       if (!isAlive()) {
  267.         this.start();
  268.       }
  269.     }
  270.     public boolean isPaused() {
  271.       return paused;
  272.     }
  273.     public void setPaused(boolean paused) {
  274.       this.paused = paused;
  275.     }
  276.     public void adjustSpeed() {
  277.       sleepTime = 4500 / (level + 5) - 250;
  278.       if (sleepTime < 50) {
  279.         sleepTime = 50;
  280.       }
  281.     }
  282.     public void run() {
  283.       while (thread == this) {
  284.         // Make the time step
  285.         handleTimer();
  286.         // Sleep for some time
  287.         try {
  288.           Thread.sleep(sleepTime);
  289.         }
  290.         catch (InterruptedException ignore) {
  291.           // Do nothing
  292.         }
  293.         // Sleep if paused
  294.         while (paused && thread == this) {
  295.           try {
  296.             Thread.sleep(1000);
  297.           }
  298.           catch (InterruptedException ignore) {
  299.             // Do nothing
  300.           }
  301.         }
  302.       }
  303.     }
  304.   }
  305.   ///////////////////////////////////////////////////////////////
  306.   private class GamePanel
  307.       extends Container {
  308.     //tao giao dien cho Game
  309.     private Dimension size = null;
  310.     private Label scoreLabel = new Label("Score: 0");
  311.     private Label levelLabel = new Label("Level: 1");
  312.     private Button button = new Button("Start");
  313.     public GamePanel() {
  314.       super();
  315.       initComponents();
  316.     }
  317.     public void paint(Graphics g) {
  318.       Rectangle rect = g.getClipBounds();
  319.       if (size == null || !size.equals(getSize())) {
  320.         size = getSize();
  321.         resizeComponents();
  322.       }
  323.       g.setColor(getBackground());
  324.       g.fillRect(rect.x, rect.y, rect.width, rect.height);
  325.       super.paint(g);
  326.     }
  327.     private void initComponents() {
  328.       GridBagConstraints c;
  329.       // Set layout manager and background
  330.       setLayout(new GridBagLayout());
  331.       setBackground(Configuration.getColor("background", "#d4d0c8"));
  332.       // Add game board
  333.       c = new GridBagConstraints();
  334.       c.gridx = 0;
  335.       c.gridy = 0;
  336.       c.gridheight = 4;
  337.       c.weightx = 1.0;
  338.       c.weighty = 1.0;
  339.       c.fill = GridBagConstraints.BOTH;
  340.       this.add(board.getComponent(), c);
  341.       // Add next figure board
  342.       c = new GridBagConstraints();
  343.       c.gridx = 1;
  344.       c.gridy = 0;
  345.       c.weightx = 0.2;
  346.       c.weighty = 0.18;
  347.       c.fill = GridBagConstraints.BOTH;
  348.       c.insets = new Insets(15, 15, 0, 15);
  349.       this.add(previewBoard.getComponent(), c);
  350.       // Add score label
  351.       scoreLabel.setForeground(Configuration.getColor("label",
  352.           "#000000"));
  353.       scoreLabel.setAlignment(Label.CENTER);
  354.       c = new GridBagConstraints();
  355.       c.gridx = 1;
  356.       c.gridy = 1;
  357.       c.weightx = 0.3;
  358.       c.weighty = 0.05;
  359.       c.anchor = GridBagConstraints.CENTER;
  360.       c.fill = GridBagConstraints.BOTH;
  361.       c.insets = new Insets(0, 15, 0, 15);
  362.       this.add(scoreLabel, c);
  363.       // Add level label
  364.       levelLabel.setForeground(Configuration.getColor("label",
  365.           "#000000"));
  366.       levelLabel.setAlignment(Label.CENTER);
  367.       c = new GridBagConstraints();
  368.       c.gridx = 1;
  369.       c.gridy = 2;
  370.       c.weightx = 0.3;
  371.       c.weighty = 0.05;
  372.       c.anchor = GridBagConstraints.CENTER;
  373.       c.fill = GridBagConstraints.BOTH;
  374.       c.insets = new Insets(0, 15, 0, 15);
  375.       this.add(levelLabel, c);
  376.       // Add generic button
  377.       button.setBackground(Configuration.getColor("button", "#d4d0c8"));
  378.       c = new GridBagConstraints();
  379.       c.gridx = 1;
  380.       c.gridy = 3;
  381.       c.weightx = 0.3;
  382.       c.weighty = 1.0;
  383.       c.anchor = GridBagConstraints.NORTH;
  384.       c.fill = GridBagConstraints.HORIZONTAL;
  385.       c.insets = new Insets(15, 15, 15, 15);
  386.       this.add(button, c);
  387.       // Add event handling
  388.       enableEvents(KeyEvent.KEY_EVENT_MASK);
  389.       this.addKeyListener(new KeyAdapter() {
  390.         public void keyPressed(KeyEvent e) {
  391.           handleKeyEvent(e);
  392.         }
  393.       });
  394.       button.addActionListener(new ActionListener() {
  395.         public void actionPerformed(ActionEvent e) {
  396.           handleButtonPressed();
  397.           component.requestFocus();
  398.         }
  399.       });
  400.     }
  401.     /**
  402.      * Resizes all the static components, and invalidates the
  403.      * current layout.
  404.      */
  405.     private void resizeComponents() {
  406.       Dimension size = scoreLabel.getSize();
  407.       Font font;
  408.       int unitSize;
  409.       // Calculate the unit size
  410.       size = board.getComponent().getSize();
  411.       size.width /= board.getBoardWidth();
  412.       size.height /= board.getBoardHeight();
  413.       if (size.width > size.height) {
  414.         unitSize = size.height;
  415.       }
  416.       else {
  417.         unitSize = size.width;
  418.       }
  419.       // Adjust font sizes
  420.       font = new Font("SansSerif",
  421.                       Font.BOLD,
  422.                       3 + (int) (unitSize / 1.8));
  423.       scoreLabel.setFont(font);
  424.       levelLabel.setFont(font);
  425.       font = new Font("SansSerif",
  426.                       Font.PLAIN,
  427.                       2 + unitSize / 2);
  428.       button.setFont(font);
  429.       // Invalidate layout
  430.       scoreLabel.invalidate();
  431.       levelLabel.invalidate();
  432.       button.invalidate();
  433.     }
  434.   }
  435. }