# Define the pentomino pieces and handle their rotations # Output should be an array/list of 1x2 blocks to be marked in the pentomino grid environment import numpy as np # Piece definitions for 0 rotation # Pieces are P, T, U, W, X, Z # Shift from 5x5 to 3x3 grid P = [ [0, 1, 1], [0, 1, 1], [0, 1, 0]] T = [ [1, 1, 1], [0, 1, 0], [0, 1, 0]] U = [ [1, 0, 1], [1, 1, 1], [0, 0, 0]] W = [ [1, 0, 0], [1, 1, 0], [0, 1, 1]] X = [ [0, 1, 0], [1, 1, 1], [0, 1, 0]] Z = [ [1, 1, 0], [0, 1, 0], [0, 1, 1]] # Create a dictionary item for the pieces pieces_dict = { 'P': P, 'T': T, 'U': U, 'W': W, 'X': X, 'Z': Z } # Define a list of piece names from above dict - to select a piece randomly PIECE_NAMES = ['P', 'T', 'U', 'W', 'X', 'Z'] # Define colours # Define a dict of colours in RGB format- str: tuple COLOURS = { 'red': (255, 0, 0), 'blue': (0, 0, 255), 'green': (0, 255, 0), 'yellow': (255, 255, 0), 'cyan': (0, 0, 255), 'magenta': (255, 0, 255) } # Define a list of colour names from above dict - to select a colour randomly COLOUR_NAMES = ['red', 'blue', 'green', 'yellow', 'cyan', 'magenta'] class PentominoPiece(): ''' Intialize a pentomino piece with a symbol, rotation and position Args: symbol: A single letter string correesponding to the piece shape rotation: An integer r in {0, 1, 2, 3} to define the angle of rotation corresponding to r*pi/2 position: The block in the Pentomino Board Grid coressponding to the center of the Piece Grid ''' def __init__(self, symbol: str, rotation: int, position: np.array): self.symbol = symbol self.rotation = rotation self.position = [position[0]-1, position[1]-1] # Convert to 0-indexing - top-left corner of the piece def get_grid_locations(self) -> np.array: ''' Get the locations of blocks to mark as a piece in the Pentomino Board Grid Returns: grid_marks: An np.array containing multiple vectors of length 2 for a single piece (co-ordinates to be marked in the Pentomino Board Grid) ''' default_piece_grid = pieces_dict[self.symbol] rotated_piece_grid = np.rot90(default_piece_grid, self.rotation) # Get the grid marks for the piece accoding to the Gym coordinate system = Inverted Y - axis grid_marks = [] for i in range(rotated_piece_grid.shape[0]): for j in range(rotated_piece_grid.shape[1]): if rotated_piece_grid[i][j] == 1: grid_marks.append(self.position + np.array([j, i])) grid_marks = np.array(grid_marks) return grid_marks if __name__ == '__main__': piece1 = PentominoPiece('P', 0, np.array([1, 1])) print(piece1.get_grid_locations())