Случайная форма тетриса - PullRequest
0 голосов
/ 24 января 2012

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

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 ]

5 голосов
/ 24 января 2012

вы сделали, но переменная 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)
1 голос
/ 24 января 2012

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

0 голосов
/ 26 июля 2014

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

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 .

...