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

游戏

开发平台:

Java

  1. package GameXepGach;
  2. import java.awt.*;
  3. public class Figure
  4.     extends Object {
  5.   /* khoi tao co ban ve hinh dang,mau sac  cua vien gach
  6.    * cac chuc nang di chuyen qua trai ,phai,xuong,dao vien gach
  7.    * */
  8.   public static final int SQUARE_FIGURE = 1;
  9.   public static final int LINE_FIGURE = 2;
  10.   public static final int S_FIGURE = 3;
  11.   public static final int Z_FIGURE = 4;
  12.   public static final int RIGHT_ANGLE_FIGURE = 5;
  13.   public static final int LEFT_ANGLE_FIGURE = 6;
  14.   public static final int TRIANGLE_FIGURE = 7;
  15.   private SquareBoard board = null;
  16.   private int xPos = 0;
  17.   private int yPos = 0;
  18.   private int orientation = 0;
  19.   private int maxOrientation = 4;
  20.   private int[] shapeX = new int[4];
  21.   private int[] shapeY = new int[4];
  22.   private Color color = Color.white;
  23.   public Figure(int type) throws IllegalArgumentException {
  24.     initialize(type);
  25.   }
  26.   private void initialize(int type) throws IllegalArgumentException {
  27.     // Initialize default variables
  28.     board = null;
  29.     xPos = 0;
  30.     yPos = 0;
  31.     orientation = 0;
  32.     // Initialize figure type variables
  33.     switch (type) {
  34.       case SQUARE_FIGURE:
  35.         maxOrientation = 1;
  36.         color = Configuration.getColor("figure.square", "#ffd8b1");
  37.         shapeX[0] = -1;
  38.         shapeY[0] = 0;
  39.         shapeX[1] = 0;
  40.         shapeY[1] = 0;
  41.         shapeX[2] = -1;
  42.         shapeY[2] = 1;
  43.         shapeX[3] = 0;
  44.         shapeY[3] = 1;
  45.         break;
  46.       case LINE_FIGURE:
  47.         maxOrientation = 2;
  48.         color = Configuration.getColor("figure.line", "#ffb4b4");
  49.         shapeX[0] = -2;
  50.         shapeY[0] = 0;
  51.         shapeX[1] = -1;
  52.         shapeY[1] = 0;
  53.         shapeX[2] = 0;
  54.         shapeY[2] = 0;
  55.         shapeX[3] = 1;
  56.         shapeY[3] = 0;
  57.         break;
  58.       case S_FIGURE:
  59.         maxOrientation = 2;
  60.         color = Configuration.getColor("figure.s", "#a3d5ee");
  61.         shapeX[0] = 0;
  62.         shapeY[0] = 0;
  63.         shapeX[1] = 1;
  64.         shapeY[1] = 0;
  65.         shapeX[2] = -1;
  66.         shapeY[2] = 1;
  67.         shapeX[3] = 0;
  68.         shapeY[3] = 1;
  69.         break;
  70.       case Z_FIGURE:
  71.         maxOrientation = 2;
  72.         color = Configuration.getColor("figure.z", "#f4adff");
  73.         shapeX[0] = -1;
  74.         shapeY[0] = 0;
  75.         shapeX[1] = 0;
  76.         shapeY[1] = 0;
  77.         shapeX[2] = 0;
  78.         shapeY[2] = 1;
  79.         shapeX[3] = 1;
  80.         shapeY[3] = 1;
  81.         break;
  82.       case RIGHT_ANGLE_FIGURE:
  83.         maxOrientation = 4;
  84.         color = Configuration.getColor("figure.right", "#c0b6fa");
  85.         shapeX[0] = -1;
  86.         shapeY[0] = 0;
  87.         shapeX[1] = 0;
  88.         shapeY[1] = 0;
  89.         shapeX[2] = 1;
  90.         shapeY[2] = 0;
  91.         shapeX[3] = 1;
  92.         shapeY[3] = 1;
  93.         break;
  94.       case LEFT_ANGLE_FIGURE:
  95.         maxOrientation = 4;
  96.         color = Configuration.getColor("figure.left", "#f5f4a7");
  97.         shapeX[0] = -1;
  98.         shapeY[0] = 0;
  99.         shapeX[1] = 0;
  100.         shapeY[1] = 0;
  101.         shapeX[2] = 1;
  102.         shapeY[2] = 0;
  103.         shapeX[3] = -1;
  104.         shapeY[3] = 1;
  105.         break;
  106.       case TRIANGLE_FIGURE:
  107.         maxOrientation = 4;
  108.         color = Configuration.getColor("figure.triangle", "#a4d9b6");
  109.         shapeX[0] = -1;
  110.         shapeY[0] = 0;
  111.         shapeX[1] = 0;
  112.         shapeY[1] = 0;
  113.         shapeX[2] = 1;
  114.         shapeY[2] = 0;
  115.         shapeX[3] = 0;
  116.         shapeY[3] = 1;
  117.         break;
  118.       default:
  119.         throw new IllegalArgumentException("No figure constant: " +
  120.                                            type);
  121.     }
  122.   }
  123.   public boolean isAttached() {
  124.     return board != null;
  125.   }
  126.   public boolean attach(SquareBoard board, boolean center) {
  127.     int newX;
  128.     int newY;
  129.     int i;
  130.     // Check for previous attachment
  131.     if (isAttached()) {
  132.       detach();
  133.     }
  134.     // Reset position (for correct controls)
  135.     xPos = 0;
  136.     yPos = 0;
  137.     // Calculate position
  138.     newX = board.getBoardWidth() / 2;
  139.     if (center) {
  140.       newY = board.getBoardHeight() / 2;
  141.     }
  142.     else {
  143.       newY = 0;
  144.       for (i = 0; i < shapeX.length; i++) {
  145.         if (getRelativeY(i, orientation) - newY > 0) {
  146.           newY = -getRelativeY(i, orientation);
  147.         }
  148.       }
  149.     }
  150.     // Check position
  151.     this.board = board;
  152.     if (!canMoveTo(newX, newY, orientation)) {
  153.       this.board = null;
  154.       return false;
  155.     }
  156.     // Draw figure
  157.     xPos = newX;
  158.     yPos = newY;
  159.     paint(color);
  160.     board.update();
  161.     return true;
  162.   }
  163.   public void detach() {
  164.     board = null;
  165.   }
  166.   public boolean isAllVisible() {
  167.     if (!isAttached()) {
  168.       return false;
  169.     }
  170.     for (int i = 0; i < shapeX.length; i++) {
  171.       if (yPos + getRelativeY(i, orientation) < 0) {
  172.         return false;
  173.       }
  174.     }
  175.     return true;
  176.   }
  177.   public boolean hasLanded() {
  178.     return!isAttached() || !canMoveTo(xPos, yPos + 1, orientation);
  179.   }
  180.   public void moveLeft() {
  181.     if (isAttached() && canMoveTo(xPos - 1, yPos, orientation)) {
  182.       paint(null);
  183.       xPos--;
  184.       paint(color);
  185.       board.update();
  186.     }
  187.   }
  188.   public void moveRight() {
  189.     if (isAttached() && canMoveTo(xPos + 1, yPos, orientation)) {
  190.       paint(null);
  191.       xPos++;
  192.       paint(color);
  193.       board.update();
  194.     }
  195.   }
  196.   public void moveDown() {
  197.     if (isAttached() && canMoveTo(xPos, yPos + 1, orientation)) {
  198.       paint(null);
  199.       yPos++;
  200.       paint(color);
  201.       board.update();
  202.     }
  203.   }
  204.   public void moveAllWayDown() {
  205.     int y = yPos;
  206.     // Check for board
  207.     if (!isAttached()) {
  208.       return;
  209.     }
  210.     // Find lowest position
  211.     while (canMoveTo(xPos, y + 1, orientation)) {
  212.       y++;
  213.     }
  214.     // Update
  215.     if (y != yPos) {
  216.       paint(null);
  217.       yPos = y;
  218.       paint(color);
  219.       board.update();
  220.     }
  221.   }
  222.   public int getRotation() {
  223.     return orientation;
  224.   }
  225.   public void setRotation(int rotation) {
  226.     int newOrientation;
  227.     // Set new orientation
  228.     newOrientation = rotation % maxOrientation;
  229.     // Check new position
  230.     if (!isAttached()) {
  231.       orientation = newOrientation;
  232.     }
  233.     else if (canMoveTo(xPos, yPos, newOrientation)) {
  234.       paint(null);
  235.       orientation = newOrientation;
  236.       paint(color);
  237.       board.update();
  238.     }
  239.   }
  240.   public void rotateRandom() {
  241.     setRotation( (int) (Math.random() * 4.0) % maxOrientation);
  242.   }
  243.   public void rotateClockwise() {
  244.     if (maxOrientation == 1) {
  245.       return;
  246.     }
  247.     else {
  248.       setRotation( (orientation + 1) % maxOrientation);
  249.     }
  250.   }
  251.   public void rotateCounterClockwise() {
  252.     if (maxOrientation == 1) {
  253.       return;
  254.     }
  255.     else {
  256.       setRotation( (orientation + 3) % 4);
  257.     }
  258.   }
  259.   private boolean isInside(int x, int y) {
  260.     for (int i = 0; i < shapeX.length; i++) {
  261.       if (x == xPos + getRelativeX(i, orientation)
  262.           && y == yPos + getRelativeY(i, orientation)) {
  263.         return true;
  264.       }
  265.     }
  266.     return false;
  267.   }
  268.   private boolean canMoveTo(int newX, int newY, int newOrientation) {
  269.     int x;
  270.     int y;
  271.     for (int i = 0; i < 4; i++) {
  272.       x = newX + getRelativeX(i, newOrientation);
  273.       y = newY + getRelativeY(i, newOrientation);
  274.       if (!isInside(x, y) && !board.isSquareEmpty(x, y)) {
  275.         return false;
  276.       }
  277.     }
  278.     return true;
  279.   }
  280.   private int getRelativeX(int square, int orientation) {
  281.     switch (orientation % 4) {
  282.       case 0:
  283.         return shapeX[square];
  284.       case 1:
  285.         return -shapeY[square];
  286.       case 2:
  287.         return -shapeX[square];
  288.       case 3:
  289.         return shapeY[square];
  290.       default:
  291.         return 0; // Should never occur
  292.     }
  293.   }
  294.   private int getRelativeY(int square, int orientation) {
  295.     switch (orientation % 4) {
  296.       case 0:
  297.         return shapeY[square];
  298.       case 1:
  299.         return shapeX[square];
  300.       case 2:
  301.         return -shapeY[square];
  302.       case 3:
  303.         return -shapeX[square];
  304.       default:
  305.         return 0; // Should never occur
  306.     }
  307.   }
  308.   private void paint(Color color) {
  309.     int x, y;
  310.     for (int i = 0; i < shapeX.length; i++) {
  311.       x = xPos + getRelativeX(i, orientation);
  312.       y = yPos + getRelativeY(i, orientation);
  313.       board.setSquareColor(x, y, color);
  314.     }
  315.   }
  316. }