2012-01-24 42 views
0

我想写一个代码,将显示从板上的俄罗斯方块的形状。我不断收到这个错误,不知道如何解决它:Python:显示从俄罗斯方块游戏的形状

TypeError: unbound method can_move() must be called with O_shape instance as first argument (got Board instance instead)

这里是我的代码:

class Board(): 

    def __init__(self, win, width, height): 
     self.width = width 
     self.height = height 

     # create a canvas to draw the tetris shapes on 
     self.canvas = CanvasFrame(win, self.width * Block.BLOCK_SIZE + Block.OUTLINE_WIDTH, 
             self.height * Block.BLOCK_SIZE + Block.OUTLINE_WIDTH) 
     self.canvas.setBackground('light gray') 

     # create an empty dictionary 
     # currently we have no shapes on the board 
     self.grid = {} 

    def draw_shape(self, shape): 
     ''' Parameters: shape - type: Shape 
      Return value: type: bool 

      draws the shape on the board if there is space for it 
      and returns True, otherwise it returns False 
     ''' 
     if shape.can_move(self, 0, 0): 
      shape.draw(self.canvas) 
      return True 
     return False 

class Tetris(): 

    SHAPES = [I_shape, J_shape, L_shape, O_shape, S_shape, T_shape, Z_shape] 
    DIRECTION = {'Left':(-1, 0), 'Right':(1, 0), 'Down':(0, 1)} 
    BOARD_WIDTH = 10 
    BOARD_HEIGHT = 20 

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

     # sets up the keyboard events 
     # when a key is called the method key_pressed will be called 
     self.win.bind_all('<Key>', self.key_pressed) 

     # set the current shape to a random new shape 
     self.current_shape = self.create_new_shape() 

     # Draw the current_shape oan the board 
     self.board.draw_shape(self.current_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 
     ''' 

     # YOUR CODE HERE 
     y = 0 
     x = int(self.BOARD_WIDTH/2) 
     the_shape = random.choice(self.SHAPES) 
     return the_shape 
+0

我相信我的问题存在于self.board.draw_shape(self.current_shape)行的某处。我和一位朋友一起去了解了这个问题,他们暗示我在那里或者在create_new_shape函数中查找了我的问题,但我无法弄清楚如何使其工作。 – user1162643

回答

1

你忘了实例化形状类。

SHAPES = [I_shape(), J_shape(), L_shape(), O_shape(), S_shape(), T_shape(), Z_shape()] 

但是你应该只有一个Shape类,它的参数将它们变成各种形状。

+0

他可以为每个形状创建一个类(“draw”方法可能会为每个形状进行硬编码)。但是,该类应该在'the_shape = random.choice(self.SHAPES)'行中实例化。 – jsbueno

+0

这是不正确的,SHAPES列表提供了对不同形状类(每个tetromino一个)的引用的方便列表。然后通过SHAPES []()实例化形状类。 – Keen

3

您没有发布相关方法的代码(can_move())。
此外,错误消息是不言自明的,它需要一个类型为O_shape的参数,但是您调用该方法并将其传递给Board。绑定到一个类

def draw_shape(self, shape): 
''' Parameters: shape - type: Shape 
    Return value: type: bool 

    draws the shape on the board if there is space for it 
    and returns True, otherwise it returns False 
''' 
    if shape.can_move(self, 0, 0): # <-- you probably meant to call shape.can_move(0,0) 
    shape.draw(self.canvas) 
    return True 
    return False 

方法有隐式第一个参数传递的实例。