Pento-LLaVA / grip_env /pieces.py
Koshti10's picture
Upload 11 files
9aed787 verified
raw
history blame contribute delete
2.91 kB
# 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())