Уведомления

Группа в Telegram: присоединиться

#1 Сен. 16, 2018 16:42:25

lopatuxin
Зарегистрирован: 2018-09-16
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает метод

Пишу тетрис, и столкнулся с проблемой поворота фигуры, а точнее метод поворота, почему то не работает. Подскажите в чем ошибка. Если я убираю метод 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()

Офлайн

#2 Сен. 17, 2018 09:23:42

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Не работает метод

lopatuxin
shape.shape_form.rotate
А это точно вызов метода? Где скобки то?

Офлайн

#3 Сен. 17, 2018 10:08:48

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3007
Репутация: +  210  -
Профиль   Отправить e-mail  

Не работает метод

Во первых скобки, а во вторых как это у Вас вообще может работать если там инициализация объектов Shape уходит в глубокую рекурсию? Происходит инициирование объекта Shape который внутри себя инициализирует Shape_T, который в своем инициализаторе ссылкается на инициализатор родительского класса: который инициализирует Shape_T и так в бесконечно цикле пока не падает ошибка глубины рекурсии



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version