Форум сайта python.su
Пишу тетрис, и столкнулся с проблемой поворота фигуры, а точнее метод поворота, почему то не работает. Подскажите в чем ошибка. Если я убираю метод rotate() из метода control_game(), и запускаю его в цикле, то все прекрасно работает. Но меня интересует более правильная реализация.
import pygame import random from pygame.locals import * import sys class Control: def __init__(self): self.play = True #Переменная для остановки основного цикла игры def control_game(self,shape): """Все управление игрой""" for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == KEYDOWN: if event.key == K_ESCAPE: self.play = False elif event.key == K_DOWN: shape.shape_form.rotate class Shape: def __init__(self): self.shape_form = Shape_T() self.color_red = pygame.image.load("images/redbrick.png") self.x = 250 self.y = 25 self.shape_list = ["Shape_T", "Shape_L"] def get_shape(self): name = random.choice(self.shape_list) if name == "Shape_T": shape = Shape_T() elif name == "Shape_L": shape = Shape_L() return shape class Shape_T(Shape): def __init__(self): super().__init__() self.list_coordinate = [[self.x, self.y], [self.x - 25, self.y - 25], [self.x, self.y - 50], [self.x, self.y - 25]] self.position = "Left" def rotate(self): """Переворачивает фигуру на 90 градусов""" if self.position == "Left": self.list_coordinate[0] = [self.list_coordinate[0][0] + 25,self.list_coordinate[0][1] - 25] self.position = "Up" elif self.position == "Up": self.list_coordinate[1] = [self.list_coordinate[1][0] + 25,self.list_coordinate[1][0] +25] self.position = "Right" elif self.position == "Right": self.list_coordinate[2] = [self.list_coordinate[2][0] - 25,self.list_coordinate[2][1] + 25] self.position = "Down" elif self.position == "Down": self.list_coordinate[0] = list(self.list_coordinate[1]) self.list_coordinate[1] = list(self.list_coordinate[2]) self.list_coordinate[2] = [self.list_coordinate[2][0] - 25,self.list_coordinate[2][1] - 25] self.position = "Left" class Shape_L(Shape): def __init__(self): super().__init__() self.list_coordinate = [[self.x + 25,self.y],[self.x,self.y],[self.x,self.y - 25],[self.x,self.y - 50]] self.position = "Right" def rotate(self): """Переворачивает фигуру на 90 градусов""" if self.position == "Right": self.list_coordinate[3] = [self.list_coordinate[3][0] + 25,self.list_coordinate[3][1] - 25] self.list_coordinate[0][0] += 50 self.list_coordinate[1] = [self.list_coordinate[1][0] + 25,self.list_coordinate[1][1] - 25] self.position = "Down" elif self.position == "Down": self.list_coordinate[3] = [self.list_coordinate[0][0] - 25,self.list_coordinate[0][1] + 25] self.list_coordinate[0][1] -= 50 self.list_coordinate[1] = [self.list_coordinate[2][0] + 25,self.list_coordinate[2][1] - 25] self.position = "Left" elif self.position == "Left": self.list_coordinate[0][0] += 50 self.list_coordinate[1] = [self.list_coordinate[1][0] + 25,self.list_coordinate[1][1] + 25] self.list_coordinate[3] = [self.list_coordinate[3][0] - 25,self.list_coordinate[3][1] - 25] self.position = "Up" elif self.position == "Up": self.list_coordinate[0][1] += 50 self.list_coordinate[1] = [self.list_coordinate[1][0] - 25,self.list_coordinate[1][1] + 25] self.list_coordinate[3] = [self.list_coordinate[3][0] + 25,self.list_coordinate[3][1] - 25] self.position = "Right" pygame.init() shape = Shape() shape.shape_form = shape.get_shape() control = Control() sc = pygame.display.set_mode((400, 800)) sc.fill((100, 150, 200)) flag = None var = 0 while control.play: control.control_game(shape) sc.fill((100, 150, 200)) for brick in shape.shape_form.list_coordinate: sc.blit(shape.color_red, (brick[0], brick[1])) if var % 20 == 0: shape.shape_form.list_coordinate[0][1] += 1 shape.shape_form.list_coordinate[1][1] += 1 shape.shape_form.list_coordinate[2][1] += 1 shape.shape_form.list_coordinate[3][1] += 1 var += 1 pygame.display.flip()
Офлайн
lopatuxinА это точно вызов метода? Где скобки то?
shape.shape_form.rotate
Офлайн
Во первых скобки, а во вторых как это у Вас вообще может работать если там инициализация объектов Shape уходит в глубокую рекурсию? Происходит инициирование объекта Shape который внутри себя инициализирует Shape_T, который в своем инициализаторе ссылкается на инициализатор родительского класса: который инициализирует Shape_T и так в бесконечно цикле пока не падает ошибка глубины рекурсии
Офлайн