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年?(史上最畅销单机游戏)