2012-01-24 148 views
-1

我想寫一個蟒蛇程序,將隨機俄羅斯方塊的形狀繪製到板上。 這裏是我的代碼:隨機俄羅斯方塊形狀

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定義它

回答

1

the_shape。是您的本地create_new_shape功能,這個名字超出範圍,一旦函數退出。

5

你沒有,但變量the_shape是局部的功能範圍。當你調用create_new_shape()你把結果保存在一個領域,你應該用它來引用sha pe:

self.current_shape = self.create_new_shape() 

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

您有兩個問題。首先是其他人指出的範圍問題。另一個問題是你永遠不會實例化形狀,你返回一個對類的引用。首先,讓我們來實例化的形狀:

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