diff --git a/tetrislogic/tetromino.py b/tetrislogic/tetromino.py index 8a57d22..a46411e 100644 --- a/tetrislogic/tetromino.py +++ b/tetrislogic/tetromino.py @@ -10,115 +10,114 @@ class Mino: self.coord = coord +class MetaTetromino(type): + + def __init__(cls, name, bases, dct): + super().__init__(name, bases, dct) + Tetromino.shapes.append(cls) + + class Tetromino: + shapes = [] random_bag = [] - - class MetaTetromino(type): - - def __init__(cls, name, bases, dico): - super().__init__(name, bases, dico) - cls.classes.append(cls) - - - class AbstractTetromino(list): - - # Super rotation system - SRS = { - Rotation.CLOCKWISE: ( - (Coord(0, 0), Coord(-1, 0), Coord(-1, 1), Coord(0, -2), Coord(-1, -2)), - (Coord(0, 0), Coord(1, 0), Coord(1, -1), Coord(0, 2), Coord(1, 2)), - (Coord(0, 0), Coord(1, 0), Coord(1, 1), Coord(0, -2), Coord(1, -2)), - (Coord(0, 0), Coord(-1, 0), Coord(-1, -1), Coord(0, -2), Coord(-1, 2)), - ), - Rotation.COUNTER: ( - (Coord(0, 0), Coord(1, 0), Coord(1, 1), Coord(0, -2), Coord(1, -2)), - (Coord(0, 0), Coord(1, 0), Coord(1, -1), Coord(0, 2), Coord(1, 2)), - (Coord(0, 0), Coord(-1, 0), Coord(-1, 1), Coord(0, -2), Coord(-1, -2)), - (Coord(0, 0), Coord(-1, 0), Coord(-1, -1), Coord(0, 2), Coord(-1, 2)), - ), - } - classes = [] - - def __init__(self): - super().__init__( - Mino(self.MINOES_COLOR, coord) - for coord in self.MINOES_COORDS - ) - self.orientation = 0 - self.last_rotation_point = None - self.hold_enabled = True - self.prelocked = False - - def ghost(self): - return self.__class__() - - class O(AbstractTetromino, metaclass=MetaTetromino): - - SRS = { - Rotation.CLOCKWISE: (tuple(), tuple(), tuple(), tuple()), - Rotation.COUNTER: (tuple(), tuple(), tuple(), tuple()), - } - MINOES_COORDS = (Coord(0, 0), Coord(1, 0), Coord(0, 1), Coord(1, 1)) - MINOES_COLOR = "yellow" - - def rotate(self, direction): - return False - - - class I(AbstractTetromino, metaclass=MetaTetromino): - - SRS = { - Rotation.CLOCKWISE: ( - (Coord(1, 0), Coord(-1, 0), Coord(2, 0), Coord(-1, -1), Coord(2, 2)), - (Coord(0, -1), Coord(-1, -1), Coord(2, -1), Coord(-1, 1), Coord(2, -2)), - (Coord(-1, 0), Coord(1, 0), Coord(-2, 0), Coord(1, 1), Coord(-2, -2)), - (Coord(0, -1), Coord(1, 1), Coord(-2, 1), Coord(1, -1), Coord(-2, 2)), - ), - Rotation.COUNTER: ( - (Coord(0, -1), Coord(-1, -1), Coord(2, -1), Coord(-1, 1), Coord(2, -2)), - (Coord(-1, 0), Coord(1, 0), Coord(-2, 0), Coord(1, 1), Coord(-2, -2)), - (Coord(0, 1), Coord(1, 1), Coord(-2, 1), Coord(1, -1), Coord(-2, 2)), - (Coord(1, 0), Coord(-1, 0), Coord(2, 0), Coord(-1, -1), Coord(2, 2)), - ), - } - MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(1, 0), Coord(2, 0)) - MINOES_COLOR = "cyan" - - - class T(AbstractTetromino, metaclass=MetaTetromino): - - MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(0, 1), Coord(1, 0)) - MINOES_COLOR = "magenta" - - - class L(AbstractTetromino, metaclass=MetaTetromino): - - MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(1, 0), Coord(1, 1)) - MINOES_COLOR = "orange" - - - class J(AbstractTetromino, metaclass=MetaTetromino): - - MINOES_COORDS = (Coord(-1, 1), Coord(-1, 0), Coord(0, 0), Coord(1, 0)) - MINOES_COLOR = "blue" - - - class S(AbstractTetromino, metaclass=MetaTetromino): - - MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(0, 1), Coord(1, 1)) - MINOES_COLOR = "green" - - - class Z(AbstractTetromino, metaclass=MetaTetromino): - - MINOES_COORDS = (Coord(-1, 1), Coord(0, 1), Coord(0, 0), Coord(1, 0)) - MINOES_COLOR = "red" - - def __new__(cls): if not cls.random_bag: - cls.random_bag = list(Tetromino.AbstractTetromino.classes) + cls.random_bag = list(cls.shapes) random.shuffle(cls.random_bag) - return cls.random_bag.pop()() \ No newline at end of file + return cls.random_bag.pop()() + + +class AbstractTetromino(list): + + # Super rotation system + SRS = { + Rotation.CLOCKWISE: ( + (Coord(0, 0), Coord(-1, 0), Coord(-1, 1), Coord(0, -2), Coord(-1, -2)), + (Coord(0, 0), Coord(1, 0), Coord(1, -1), Coord(0, 2), Coord(1, 2)), + (Coord(0, 0), Coord(1, 0), Coord(1, 1), Coord(0, -2), Coord(1, -2)), + (Coord(0, 0), Coord(-1, 0), Coord(-1, -1), Coord(0, -2), Coord(-1, 2)), + ), + Rotation.COUNTER: ( + (Coord(0, 0), Coord(1, 0), Coord(1, 1), Coord(0, -2), Coord(1, -2)), + (Coord(0, 0), Coord(1, 0), Coord(1, -1), Coord(0, 2), Coord(1, 2)), + (Coord(0, 0), Coord(-1, 0), Coord(-1, 1), Coord(0, -2), Coord(-1, -2)), + (Coord(0, 0), Coord(-1, 0), Coord(-1, -1), Coord(0, 2), Coord(-1, 2)), + ), + } + + def __init__(self): + super().__init__( + Mino(self.MINOES_COLOR, coord) + for coord in self.MINOES_COORDS + ) + self.orientation = 0 + self.last_rotation_point = None + self.hold_enabled = True + self.prelocked = False + + def ghost(self): + return self.__class__() + +class O(AbstractTetromino, metaclass=MetaTetromino): + + SRS = { + Rotation.CLOCKWISE: (tuple(), tuple(), tuple(), tuple()), + Rotation.COUNTER: (tuple(), tuple(), tuple(), tuple()), + } + MINOES_COORDS = (Coord(0, 0), Coord(1, 0), Coord(0, 1), Coord(1, 1)) + MINOES_COLOR = "yellow" + + def rotate(self, direction): + return False + + +class I(AbstractTetromino, metaclass=MetaTetromino): + + SRS = { + Rotation.CLOCKWISE: ( + (Coord(1, 0), Coord(-1, 0), Coord(2, 0), Coord(-1, -1), Coord(2, 2)), + (Coord(0, -1), Coord(-1, -1), Coord(2, -1), Coord(-1, 1), Coord(2, -2)), + (Coord(-1, 0), Coord(1, 0), Coord(-2, 0), Coord(1, 1), Coord(-2, -2)), + (Coord(0, -1), Coord(1, 1), Coord(-2, 1), Coord(1, -1), Coord(-2, 2)), + ), + Rotation.COUNTER: ( + (Coord(0, -1), Coord(-1, -1), Coord(2, -1), Coord(-1, 1), Coord(2, -2)), + (Coord(-1, 0), Coord(1, 0), Coord(-2, 0), Coord(1, 1), Coord(-2, -2)), + (Coord(0, 1), Coord(1, 1), Coord(-2, 1), Coord(1, -1), Coord(-2, 2)), + (Coord(1, 0), Coord(-1, 0), Coord(2, 0), Coord(-1, -1), Coord(2, 2)), + ), + } + MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(1, 0), Coord(2, 0)) + MINOES_COLOR = "cyan" + + +class T(AbstractTetromino, metaclass=MetaTetromino): + + MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(0, 1), Coord(1, 0)) + MINOES_COLOR = "magenta" + + +class L(AbstractTetromino, metaclass=MetaTetromino): + + MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(1, 0), Coord(1, 1)) + MINOES_COLOR = "orange" + + +class J(AbstractTetromino, metaclass=MetaTetromino): + + MINOES_COORDS = (Coord(-1, 1), Coord(-1, 0), Coord(0, 0), Coord(1, 0)) + MINOES_COLOR = "blue" + + +class S(AbstractTetromino, metaclass=MetaTetromino): + + MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(0, 1), Coord(1, 1)) + MINOES_COLOR = "green" + + +class Z(AbstractTetromino, metaclass=MetaTetromino): + + MINOES_COORDS = (Coord(-1, 1), Coord(0, 1), Coord(0, 0), Coord(1, 0)) + MINOES_COLOR = "red" \ No newline at end of file