Tetris Piece Rotation Algorithm

前端 未结 15 784
傲寒
傲寒 2020-11-30 17:57

What are the best algorithms (and explanations) for representing and rotating the pieces of a tetris game? I always find the piece rotation and representation schemes confu

相关标签:
15条回答
  • 2020-11-30 18:12

    Python:

    pieces = [
        [(0,0),(0,1),(0,2),(0,3)],
        [(0,0),(0,1),(1,0),(1,1)],
        [(1,0),(0,1),(1,1),(1,2)],
        [(0,0),(0,1),(1,0),(2,0)],
        [(0,0),(0,1),(1,1),(2,1)],
        [(0,1),(1,0),(1,1),(2,0)]
    ]
    
    def get_piece_dimensions(piece):
        max_r = max_c = 0
        for point in piece:
            max_r = max(max_r, point[0])
            max_c = max(max_c, point[1])
        return max_r, max_c
    
    def rotate_piece(piece):
        max_r, max_c = get_piece_dimensions(piece)
        new_piece = []
        for r in range(max_r+1):
            for c in range(max_c+1):
                if (r,c) in piece:
                    new_piece.append((c, max_r-r))
        return new_piece
    
    0 讨论(0)
  • 2020-11-30 18:16

    If we assume that the central square of the tetromino has coordinates (x0, y0) which remains unchanged then the rotation of the other 3 squares in Java will look like this:

    private void rotateClockwise()
    {
        if(rotatable > 0)   //We don't rotate tetromino O. It doesn't have central square.
        {
            int i = y1 - y0;
            y1 = (y0 + x1) - x0;
            x1 = x0 - i;
            i = y2 - y0;
            y2 = (y0 + x2) - x0;
            x2 = x0 - i;
            i = y3 - y0;
            y3 = (y0 + x3) - x0;
            x3 = x0 - i;  
        }
    }
    
    private void rotateCounterClockwise()
    {
        if(rotatable > 0)
        {
            int i = y1 - y0;
            y1 = (y0 - x1) + x0;
            x1 = x0 + i;
            i = y2 - y0;
            y2 = (y0 - x2) + x0;
            x2 = x0 + i;
            i = y3 - y0;
            y3 = (y0 - x3) + x0;
            x3 = x0 + i;
        }
    }
    
    0 讨论(0)
  • 2020-11-30 18:17

    I derived a rotation algorithm from matrix rotations here. To sum it up: If you have a list of coordinates for all cells that make up the block, e.g. [(0, 1), (1, 1), (2, 1), (3, 1)] or [(1, 0), (0, 1), (1, 1), (2, 1)]:

     0123       012
    0....      0.#.
    1####  or  1###
    2....      2...
    3....
    

    you can calculate the new coordinates using

    x_new = y_old
    y_new = 1 - (x_old - (me - 2))
    

    for clockwise rotation and

    x_new = 1 - (y_old - (me - 2))
    y_new = x_old
    

    for counter-clockwise rotation. me is the maximum extent of the block, i.e. 4 for I-blocks, 2 for O-blocks and 3 for all other blocks.

    0 讨论(0)
  • 2020-11-30 18:21

    There is a limited amount of shapes, so I would use a fixed table and no calculation. That saves time.

    But there are rotation algorithms.

    Chose a centerpoint and rotate pi/2.

    If a block of a piece starts at (1,2) it moves clockwise to (2,-1) and (-1,-2) and (-1, 2). Apply this for each block and the piece is rotated.

    Each x is the previous y and each y - the previous x. Which gives the following matrix:

    [  0   1 ]
    [ -1   0 ]
    

    For counterclockwise rotation, use:

    [  0  -1 ]
    [  1   0 ]
    
    0 讨论(0)
  • 2020-11-30 18:27

    I have used a shape position and set of four coordinates for the four points in all the shapes. Since it's in 2D space, you can easy apply a 2D rotational matrice to the points.

    The points are divs so their css class is turned from off to on. (this is after clearing the css class of where they were last turn.)

    0 讨论(0)
  • 2020-11-30 18:28

    Representation

    Represent each piece in the minimum matrix where 1's represent spaces occupied by the tetriminoe and 0's represent empty space. Example:

    originalMatrix = 
    [0,   0,   1]
    [1,   1,   1]
    

    Rotation Formula

    clockwise90DegreesRotatedMatrix = reverseTheOrderOfColumns(Transpose(originalMatrix))
    
    anticlockwise90DegreesRotatedMatrix = reverseTheOrderOfRows(Transpose(originalMatrix))
    

    Illustration

    originalMatrix = 
      x    y    z
    a[0,   0,   1]
    b[1,   1,   1]
    

    transposed = transpose(originalMatrix)
      a   b
    x[0,  1]
    y[0,  1]
    z[1,  1]
    

    counterClockwise90DegreesRotated = reverseTheOrderOfRows(transposed)
      a   b
    z[1,  1]
    y[0,  1]
    x[0,  1]
    

    clockwise90DegreesRotated = reverseTheOrderOfColumns(transposed)
      b   a
    x[1,  0]
    y[1,  0]
    z[1,  1]
    

    0 讨论(0)
提交回复
热议问题