Python:从俄罗斯方块游戏中显示形状

时间:2012-01-24 23:13:42

标签: python

我正在尝试编写一个代码,该代码将在电路板上显示俄罗斯方块的形状。我一直收到这个错误,不知道如何修复它:

  

TypeError:unbound方法can_move()必须使用O_shape实例作为第一个参数调用(改为获取Board实例)

这是我的代码:

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

2 个答案:

答案 0 :(得分: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

绑定到类的方法将实例隐式地作为第一个参数传递。

答案 1 :(得分:1)

你忘了实例化你的形状类。

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

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