Случайная форма тетриса

Я пытаюсь написать программу на питоне, которая будет рисовать случайную форму тетриса на доске. Вот мой код:

def __init__(self, win):
    self.board = Board(win, self.BOARD_WIDTH, self.BOARD_HEIGHT)
    self.win = win
    self.delay = 1000 

    self.current_shape = self.create_new_shape()

    # Draw the current_shape oan the board 
    self.current_shape = Board.draw_shape(the_shape)

def create_new_shape(self):
    ''' Return value: type: Shape

        Create a random new shape that is centered
         at y = 0 and x = int(self.BOARD_WIDTH/2)
        return the shape
    '''

    y = 0
    x = int(self.BOARD_WIDTH/2)
    self.shapes = [O_shape,
                  T_shape,
                  L_shape,
                  J_shape,
                  Z_shape,
                  S_shape,
                  I_shape]

    the_shape = random.choice(self.shapes)
    return the_shape

Моя проблема в "self.current_shape = Board.draw_shape(the_shape). Он говорит, что the_shape не определен, но я думал, что определил его в create_new_shape.

3 ответа

Вы сделали, но переменная the_shape является локальным для области действия этой функции. когда ты звонишь create_new_shape() Вы сохраняете результат в поле, вы должны использовать его для ссылки на форму:

self.current_shape = self.create_new_shape()

# Draw the current_shape oan the board 
self.current_shape = Board.draw_shape(self.current_shape)

the_shape является локальным для вашего create_new_shape функция, имя выходит из области видимости после выхода из функции.

У вас есть две проблемы. Во-первых, это проблема масштаба, на которую указывали другие. Другая проблема заключается в том, что вы никогда не создаете экземпляр формы, а возвращаете ссылку на класс. Сначала давайте создадим экземпляр формы:

y = 0
x = int(self.BOARD_WIDTH/2)
self.shapes = [O_shape,
              T_shape,
              L_shape,
              J_shape,
              Z_shape,
              S_shape,
              I_shape]

the_shape = random.choice(self.shapes)
return the_shape(Point(x, y))

Теперь создается экземпляр формы с правильной отправной точкой. Далее сфера.

self.current_shape = self.create_new_shape()

# Draw the current_shape oan the board 
self.board.draw_shape(self.current_shape)

Когда вы ссылаетесь на фрагменты данных в одном и том же объекте (здесь на плате), вам нужно получить к ним доступ через себя.вещь Итак, мы хотим получить доступ к доске и указать форму для рисования. Мы делаем это с помощью self.board, затем добавляем метод draw_shape. Наконец, мы должны сказать ему, что рисовать. the_shape находится вне области видимости, он существует только в методе create_new_shape. Этот метод возвращает форму, которую мы присвоили self.current_shape. Поэтому, если вы хотите снова обратиться к этой фигуре в любом месте внутри класса, используйте self.current_shape.

Другие вопросы по тегам