Pygame俄罗斯方块填充整列

Posted

技术标签:

【中文标题】Pygame俄罗斯方块填充整列【英文标题】:Pygame Tetris Filling Entire Column 【发布时间】:2022-01-24 04:22:27 【问题描述】:

好的,所以我正在使用 Pygame 制作俄罗斯方块,我的问题是,当块到达底部时,程序将块绘制到整列而不是只绘制它打算的行。我正在使用带有二维块对象列表的板对象。

class Block:
    def __init__(self, exists, color):
        self.exists = exists
        self.color = color

class Board:
    def __init__(self, state, bottom, points, level, alive):
        self.state = state
        self.alive = alive
        self.bottom = bottom
        self.points = points
        self.level = level

# Different Script
board = Board.Board([[Board.Block(False, (0, 0, 0))] * 10] * 20, [670, 670, 670, 670, 670, 670, 670, 670, 670, 670], 0, 1, True)

我认为问题应该在这里。似乎该程序正在用存在 = True 的块填充整个列,但我不知道为什么。我的逻辑是否/何时触底:

    bottom = [None] * len(piece.shape)
    for col in range(len(piece.bottom())):
        index = int(((piece.position[0] - 10) / 30) - 8 + col)
        bottom[col] = board.bottom[index]

    for col in range(len(bottom)):
        if(piece.bottom()[col] == bottom[col]):
            new_piece = True
            break

    if(new_piece):
        for row in range(len(piece.shape)):
            for col in range(len(piece.shape[row])):
                if(piece.shape[row][col] == 1):
                    block = Board.Block(True, piece.color)
                    index_col = int(((piece.position[0] - 10) / 30) - 8 + col)
                    index_row = int(((piece.position[1] - 10) / 30) - 3 + row)
                    board.state[index_row][index_col] = block
        piece = PieceSelector.selector()

我对 index_row/index_col 有这种奇怪的数学的原因是因为棋盘是一个尺寸为(250、100、300、600)的 pygame.rect 对象。所以这只是将像素值转换为列表索引的算法。了解 Piece 类可能会有所帮助:

class Piece:
    def __init__(self, position, shape, index, color):
        self.shape = shape
        self.color = color
        self.index = index
        self.position = position

# Example Piece
long_piece = Piece([250, 100], [[1, 1, 1, 1], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], 0, [255, 128, 0])

这也是实际绘制块的函数。我认为这不是问题,但我可能仍应将其包括在内。

    def draw_blocks(self, screen):
        for row in range(len(self.state)):
            for col in range(len(self.state[row])):
                if(self.state[row][col].exists):
                    row_pxl = row * 30 + 100
                    col_pxl = col * 30 + 250
                    py.draw.rect(screen, self.state[row][col].color, (col_pxl, row_pxl, 29, 29))

Example of problem

【问题讨论】:

【参考方案1】:

我还没有检查你所有的代码,但明显的问题是当你在做bottom = [None] * len(piece.shape) 时,这基本上会创建对同一个对象的多个引用,因此当一个对象发生变化时 - 全部变化。

尝试将其更改为:bottom = [None for _ in range(len(piece.shape))]

【讨论】:

不完全是,底部列表只是一个 y 值列表,用于检测棋子何时触及棋盘底部。问题是board = Board.Board([[Board.Block(False, (0, 0, 0))] * 10] * 20, [670, 670, 670, 670, 670, 670, 670, 670, 670, 670], 0, 1, True) 行,我对块对象做了同样的事情,所以一般原则是一样的。谢谢 哦,错过了那一行!很高兴它起作用了。 如何使用 Y 值列表?俄罗斯方块有悬垂。

以上是关于Pygame俄罗斯方块填充整列的主要内容,如果未能解决你的问题,请参考以下文章

Pygame实战俄罗斯方块 | 太好玩了~停不下来,这种版本(Turtle彩版)你肯定没玩过……(经典怀旧:无人不知的俄罗斯方块)

Pygame小游戏之俄罗斯方块凭什么火了30年?(史上最畅销单机游戏)

Python游戏开发,pygame模块,Python实现俄罗斯方块小游戏

pygame小游戏开发

俄罗斯方块-1

俄罗斯方块游戏