Ротация Java тетрис - PullRequest
       22

Ротация Java тетрис

3 голосов
/ 31 марта 2011

Я знаю, что об этом много спрашивали, но я хотел бы знать, как вращать кусок тетриса? Я уже сделал длинное и плохое решение (~ 170 строк кода), но должен быть более простой способ сделать это.

Мои части тетриса состоят из 4 блоков, которые все знают свое местоположение (строка и столбец) в матрице. Сама матрица типизирована символами, поэтому все 4 блока - это буквы. Например, это выглядит так:

......
..T...
.TTT..
......

Я попытался смоделировать свою матрицу как систему координат, посчитав среднюю строку и столбец и использовав ее в качестве оригинала, а затем попытался применить этот простой алгоритм, который я нашел: Поворот на 90 градусов (x, y) = (-y, x)

Похоже, что это работает, только если мой кусок находится в центре матрицы. Я понятия не имею, что мне делать, я думал об этом весь день. Вот мой метод:

public void rotatePiece(ArrayList<Block> random) {
        int distance = 0; // how far is the origo

        for (int i=0; i < 4; ++i)
            board[random.get(i).getRow()][random.get(i).getColumn()] = '.';  // erases the current location of the piece

        for (int i=0; i < 4; ++i) {
            distance = Math.abs(random.get(i).getColumn()-middleColumn);

            if (random.get(i).getColumn() < middleColumn)
                random.get(i).setColumn(random.get(i).getColumn()+(distance*2)); // "throws" the location of the block to the other side of the origo
            else
                random.get(i).setColumn(random.get(i).getColumn()-(distance*2));

            int help = random.get(i).getColumn();
            random.get(i).setColumn(random.get(i).getRow());  // (x, y) = (-y, x)
            random.get(i).setRow(help);
        }

         for (int i=0; i < 4; ++i)
            board[random.get(i).getRow()][random.get(i).getColumn()] = random.get(0).getStyle(); // saves the new location of the piece in the matrix

Ответы [ 4 ]

2 голосов
/ 31 марта 2011

Я бы рекомендовал определить четыре состояния для каждой группы блоков.

enum ROTATION {
    UP, DOWN, LEFT, RIGHT;

    ROTATION rotateLeft() {
        switch(this) {
             case UP: return LEFT;
             case LEFT: return DOWN;
             case DOWN: return RIGHT;
             case RIGHT: return UP;
        }
        return null; // wont happen;
    }

    ROTATION rotateRight() {
        ROTATION r = this;
         // wow I'm lazy, but I've actually seen this in production code!
        return r.rotateLeft().rotateLeft().rotateLeft();
    }
}

abstract class Brick {
    Point centerPos;
    ROTATION rot;
    abstract List<Point> pointsOccupied();
}

class TBrick extends Brick {

    List<Point> pointsOccupied() {
        int x = centerPos.x();
        int y = centerPos.y();
        List<Point> points = new LinkedList<Point>();
        switch(rot) {
            case UP: points.add(new Point(x-1,y);
                     points.add(new Point(x,y);
                     points.add(new Point(x+1,y);
                     points.add(new Point(x, y+1);
                break;
            case Down: points.add(new Point(x-1,y);
                       points.add(new Point(x,y);
                       points.add(new Point(x+1,y);
                       points.add(new Point(x, y-1);
                break;
            // finish the cases
        }

   }

}
1 голос
/ 31 марта 2011

Самый простой и быстрый в вычислительном отношении способ сделать это - использовать их для предварительного вычисления.

Это означает, что кусок тетриса будет выглядеть как

class TetrisBlock {

   String position[4];

   int curPos = 0;

   void rotateLeft() {
      curPos++;
      if (curPos > 3)
        curPos = 0;
   }
....
}

И тогда вы можете определить что-то вроде

class TetrisTBlock extends TetrisBlock { 

...

// in constructor
position={"....\n.T..\nTTT.\n....",
          ".T..\nTT..\n.T..\n.....", 
// I guess you get the idea

...

Вы делаете это для каждого типа блока, а затем вы также можете добавлять участников для добавления / удаления их с доски.

Если вы оптимизируете, вы уйдете от символов ....

1 голос
/ 31 марта 2011

Вы можете использовать матрицу вращения .

Вам нужно будет соответствующим образом установить начало вращения, что может означать перемещение положения фигуры относительно игрового поля (например, так, чтобы начало координат было в центре), применение матрицы вращения и затем переводя его обратно в правильное положение в координатах игрового поля.

0 голосов
/ 21 октября 2014

Я думаю, что лучший способ это жестко закодировать.Примите во внимание, что каждая фигура отличается и каждая фаза вращения фигуры также отличается.И для каждой фазы вращения - определите, какие части сетки вам нужно освободить (избегайте столкновений).Для визуального представления проверьте это

...