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

游戏

开发平台:

Java

  1. package GameXepGach;
  2. import java.util.*;
  3. import java.awt.*;
  4. public class SquareBoard
  5.     extends Object {
  6.   /*
  7.    * kiem tra thu dong co day hay khong
  8.    * neu day thi remove dong do de tinh diem cho nguoi choi
  9.    * */
  10.   private int width = 0;
  11.   private int height = 0;
  12.   private Color[][] matrix = null;
  13.   private String message = null;
  14.   private int removedLines = 0;
  15.   private SquareBoardComponent component = null;
  16.   public SquareBoard(int width, int height) {
  17.     this.width = width;
  18.     this.height = height;
  19.     this.matrix = new Color[height][width];
  20.     clear();
  21.   }
  22.   public boolean isSquareEmpty(int x, int y) {
  23.     if (x < 0 || x >= width || y < 0 || y >= height) {
  24.       return x >= 0 && x < width && y < 0;
  25.     }
  26.     else {
  27.       return matrix[y][x] == null;
  28.     }
  29.   }
  30.   public boolean isLineEmpty(int y) {
  31.     if (y < 0 || y >= height) {
  32.       return false;
  33.     }
  34.     for (int x = 0; x < width; x++) {
  35.       if (matrix[y][x] != null) {
  36.         return false;
  37.       }
  38.     }
  39.     return true;
  40.   }
  41.   public boolean isLineFull(int y) {
  42.     if (y < 0 || y >= height) {
  43.       return true;
  44.     }
  45.     for (int x = 0; x < width; x++) {
  46.       if (matrix[y][x] == null) {
  47.         return false;
  48.       }
  49.     }
  50.     return true;
  51.   }
  52.   public boolean hasFullLines() {
  53.     for (int y = height - 1; y >= 0; y--) {
  54.       if (isLineFull(y)) {
  55.         return true;
  56.       }
  57.     }
  58.     return false;
  59.   }
  60.   public Component getComponent() {
  61.     if (component == null) {
  62.       component = new SquareBoardComponent();
  63.     }
  64.     return component;
  65.   }
  66.   public int getBoardHeight() {
  67.     return height;
  68.   }
  69.   public int getBoardWidth() {
  70.     return width;
  71.   }
  72.   public int getRemovedLines() {
  73.     return removedLines;
  74.   }
  75.   public Color getSquareColor(int x, int y) {
  76.     if (x < 0 || x >= width || y < 0 || y >= height) {
  77.       return null;
  78.     }
  79.     else {
  80.       return matrix[y][x];
  81.     }
  82.   }
  83.   public void setSquareColor(int x, int y, Color color) {
  84.     if (x < 0 || x >= width || y < 0 || y >= height) {
  85.       return;
  86.     }
  87.     matrix[y][x] = color;
  88.     if (component != null) {
  89.       component.invalidateSquare(x, y);
  90.     }
  91.   }
  92.   public void setMessage(String message) {
  93.     this.message = message;
  94.     if (component != null) {
  95.       component.redrawAll();
  96.     }
  97.   }
  98.   public void clear() {
  99.     removedLines = 0;
  100.     for (int y = 0; y < height; y++) {
  101.       for (int x = 0; x < width; x++) {
  102.         this.matrix[y][x] = null;
  103.       }
  104.     }
  105.     if (component != null) {
  106.       component.redrawAll();
  107.     }
  108.   }
  109.   public int removeFullLines() {
  110.     boolean repaint = false;
  111.     // Remove full lines
  112.     for (int y = height - 1; y >= 0; y--) {
  113.       if (isLineFull(y)) {
  114.         removeLine(y);
  115.         removedLines++;
  116.         repaint = true;
  117.         y++;
  118.       }
  119.     }
  120.     // Repaint if necessary
  121.     if (repaint && component != null) {
  122.       component.redrawAll();
  123.     }
  124.     return removedLines;
  125.   }
  126.   private void removeLine(int y) {
  127.     if (y < 0 || y >= height) {
  128.       return;
  129.     }
  130.     for (; y > 0; y--) {
  131.       for (int x = 0; x < width; x++) {
  132.         matrix[y][x] = matrix[y - 1][x];
  133.       }
  134.     }
  135.     for (int x = 0; x < width; x++) {
  136.       matrix[0][x] = null;
  137.     }
  138.   }
  139.   public void update() {
  140.     component.redraw();
  141.   }
  142.   private class SquareBoardComponent
  143.       extends Component {
  144.     /*
  145.      * Ve cac vien gach theo tung o vuong nho
  146.      * Cap nhat lai hinh dang cua no
  147.      *  The hien do sang toi ve mau sac va anh sanh cua vien gach
  148.      * Viet ra tin nhan tren man hinh
  149.      *  Tao bo dem ve hinh anh cac vien gach ,phuc vu cho
  150.      *chuc nang Hien Thi Gach
  151.      * */
  152.     private Dimension size = null;
  153.     private Insets insets = new Insets(0, 0, 0, 0);
  154.     private Dimension squareSize = new Dimension(0, 0);
  155.     private Image bufferImage = null;
  156.     private Rectangle bufferRect = new Rectangle();
  157.     private Color messageColor = Color.white;
  158.     private Hashtable lighterColors = new Hashtable();
  159.     private Hashtable darkerColors = new Hashtable();
  160.     private boolean updated = true;
  161.     private Rectangle updateRect = new Rectangle();
  162.     public SquareBoardComponent() {
  163.       setBackground(Configuration.getColor("board.background",
  164.                                            "#000000"));
  165.       messageColor = Configuration.getColor("board.message",
  166.                                             "#ffffff");
  167.     }
  168.     public void invalidateSquare(int x, int y) {
  169.       if (updated) {
  170.         updated = false;
  171.         updateRect.x = x;
  172.         updateRect.y = y;
  173.         updateRect.width = 0;
  174.         updateRect.height = 0;
  175.       }
  176.       else {
  177.         if (x < updateRect.x) {
  178.           updateRect.width += updateRect.x - x;
  179.           updateRect.x = x;
  180.         }
  181.         else if (x > updateRect.x + updateRect.width) {
  182.           updateRect.width = x - updateRect.x;
  183.         }
  184.         if (y < updateRect.y) {
  185.           updateRect.height += updateRect.y - y;
  186.           updateRect.y = y;
  187.         }
  188.         else if (y > updateRect.y + updateRect.height) {
  189.           updateRect.height = y - updateRect.y;
  190.         }
  191.       }
  192.     }
  193.     public void redraw() {
  194.       Graphics g;
  195.       if (!updated) {
  196.         updated = true;
  197.         g = getGraphics();
  198.         g.setClip(insets.left + updateRect.x * squareSize.width,
  199.                   insets.top + updateRect.y * squareSize.height,
  200.                   (updateRect.width + 1) * squareSize.width,
  201.                   (updateRect.height + 1) * squareSize.height);
  202.         paint(g);
  203.       }
  204.     }
  205.     public void redrawAll() {
  206.       Graphics g;
  207.       updated = true;
  208.       g = getGraphics();
  209.       g.setClip(insets.left,
  210.                 insets.top,
  211.                 width * squareSize.width,
  212.                 height * squareSize.height);
  213.       paint(g);
  214.     }
  215.     public boolean isDoubleBuffered() {
  216.       return true;
  217.     }
  218.     public Dimension getPreferredSize() {
  219.       return new Dimension(width * 20, height * 20);
  220.     }
  221.     public Dimension getMinimumSize() {
  222.       return getPreferredSize();
  223.     }
  224.     public Dimension getMaximumSize() {
  225.       return getPreferredSize();
  226.     }
  227.     private Color getLighterColor(Color c) {
  228.       Color lighter;
  229.       lighter = (Color) lighterColors.get(c);
  230.       if (lighter == null) {
  231.         lighter = c.brighter().brighter();
  232.         lighterColors.put(c, lighter);
  233.       }
  234.       return lighter;
  235.     }
  236.     private Color getDarkerColor(Color c) {
  237.       Color darker;
  238.       darker = (Color) darkerColors.get(c);
  239.       if (darker == null) {
  240.         darker = c.darker().darker();
  241.         darkerColors.put(c, darker);
  242.       }
  243.       return darker;
  244.     }
  245.     public synchronized void paint(Graphics g) {
  246.       Graphics bufferGraphics;
  247.       Rectangle rect;
  248.       // Handle component size change
  249.       if (size == null || !size.equals(getSize())) {
  250.         size = getSize();
  251.         squareSize.width = size.width / width;
  252.         squareSize.height = size.height / height;
  253.         if (squareSize.width <= squareSize.height) {
  254.           squareSize.height = squareSize.width;
  255.         }
  256.         else {
  257.           squareSize.width = squareSize.height;
  258.         }
  259.         insets.left = (size.width - width * squareSize.width) / 2;
  260.         insets.right = insets.left;
  261.         insets.top = 0;
  262.         insets.bottom = size.height - height * squareSize.height;
  263.         bufferImage = createImage(width * squareSize.width,
  264.                                   height * squareSize.height);
  265.       }
  266.       // Paint component in buffer image
  267.       rect = g.getClipBounds();
  268.       bufferGraphics = bufferImage.getGraphics();
  269.       bufferGraphics.setClip(rect.x - insets.left,
  270.                              rect.y - insets.top,
  271.                              rect.width,
  272.                              rect.height);
  273.       paintComponent(bufferGraphics);
  274.       // Paint image buffer
  275.       g.drawImage(bufferImage,
  276.                   insets.left,
  277.                   insets.top,
  278.                   getBackground(),
  279.                   null);
  280.     }
  281.     private void paintComponent(Graphics g) {
  282.       // Paint background
  283.       g.setColor(getBackground());
  284.       g.fillRect(0,
  285.                  0,
  286.                  width * squareSize.width,
  287.                  height * squareSize.height);
  288.       // Paint squares
  289.       for (int y = 0; y < height; y++) {
  290.         for (int x = 0; x < width; x++) {
  291.           if (matrix[y][x] != null) {
  292.             paintSquare(g, x, y);
  293.           }
  294.         }
  295.       }
  296.       // Paint message
  297.       if (message != null) {
  298.         paintMessage(g, message);
  299.       }
  300.     }
  301.     private void paintSquare(Graphics g, int x, int y) {
  302.       Color color = matrix[y][x];
  303.       int xMin = x * squareSize.width;
  304.       int yMin = y * squareSize.height;
  305.       int xMax = xMin + squareSize.width - 1;
  306.       int yMax = yMin + squareSize.height - 1;
  307.       int i;
  308.       // Skip drawing if not visible
  309.       bufferRect.x = xMin;
  310.       bufferRect.y = yMin;
  311.       bufferRect.width = squareSize.width;
  312.       bufferRect.height = squareSize.height;
  313.       if (!bufferRect.intersects(g.getClipBounds())) {
  314.         return;
  315.       }
  316.       // Fill with base color
  317.       g.setColor(color);
  318.       g.fillRect(xMin, yMin, squareSize.width, squareSize.height);
  319.       // Draw brighter lines
  320.       g.setColor(getLighterColor(color));
  321.       for (i = 0; i < squareSize.width / 10; i++) {
  322.         g.drawLine(xMin + i, yMin + i, xMax - i, yMin + i);
  323.         g.drawLine(xMin + i, yMin + i, xMin + i, yMax - i);
  324.       }
  325.       // Draw darker lines
  326.       g.setColor(getDarkerColor(color));
  327.       for (i = 0; i < squareSize.width / 10; i++) {
  328.         g.drawLine(xMax - i, yMin + i, xMax - i, yMax - i);
  329.         g.drawLine(xMin + i, yMax - i, xMax - i, yMax - i);
  330.       }
  331.     }
  332.     private void paintMessage(Graphics g, String msg) {
  333.       int fontWidth;
  334.       int offset;
  335.       int x;
  336.       int y;
  337.       // Find string font width
  338.       g.setFont(new Font("SansSerif", Font.BOLD, squareSize.width + 4));
  339.       fontWidth = g.getFontMetrics().stringWidth(msg);
  340.       // Find centered position
  341.       x = (width * squareSize.width - fontWidth) / 2;
  342.       y = height * squareSize.height / 2;
  343.       // Draw black version of the string
  344.       offset = squareSize.width / 10;
  345.       g.setColor(Color.black);
  346.       g.drawString(msg, x - offset, y - offset);
  347.       g.drawString(msg, x - offset, y);
  348.       g.drawString(msg, x - offset, y - offset);
  349.       g.drawString(msg, x, y - offset);
  350.       g.drawString(msg, x, y + offset);
  351.       g.drawString(msg, x + offset, y - offset);
  352.       g.drawString(msg, x + offset, y);
  353.       g.drawString(msg, x + offset, y + offset);
  354.       // Draw white version of the string
  355.       g.setColor(messageColor);
  356.       g.drawString(msg, x, y);
  357.     }
  358.   }
  359. }