Pygame俄罗斯方块两行Bug修复求助:消行异常与旋转判定错误
问题修复思路
1. 消行函数clear_rows异常修复
问题原因
原代码中ind变量仅记录最后一个被消除行的索引,当存在多组不连续的填满行时,上方网格的下移判断条件y < ind会忽略中间未被消除的行,导致部分行下移逻辑错误。
修复方案
改为收集所有被消除的行索引,对每个锁定的位置,计算其下方被消除的行数总和,以此作为下移的步数:
def clear_rows(grid, locked): # 收集所有被消除的行索引 cleared_rows = [] for i in range(len(grid)-1, -1, -1): row = grid[i] if (0, 0, 0) not in row: cleared_rows.append(i) # 删除该行的锁定位置 for j in range(len(row)): try: del locked[(j, i)] except KeyError: continue inc = len(cleared_rows) if inc > 0: # 从下往上处理锁定位置,避免覆盖 for key in sorted(list(locked), key=lambda x: x[1], reverse=True): x, y = key # 计算当前位置下方被消除的行数,即需要下移的步数 shift = sum(1 for r in cleared_rows if r > y) if shift > 0: new_key = (x, y + shift) locked[new_key] = locked.pop(key) return inc
2. 失败判定函数check_lost逻辑错误修复
问题原因
原代码判断条件y < 1过于严格,旋转方块时,方块可能暂时进入网格顶部的边界区域(如y=0),但此时方块尚未锁定,不应判定为游戏失败。正确的失败条件应该是方块无法继续移动且部分已超出网格顶部(y < 0)。
修复方案
修改判断条件为检测是否有位置的y < 0,同时确保该函数仅在方块无法向下移动(即落地锁定)时调用:
def check_lost(positions): for pos in positions: x, y = pos # 仅当位置超出网格顶部(y < 0)时判定失败 if y < 0: return True return False
内容的提问来源于stack exchange,提问作者Gl0ry365
相关产品推荐
相关产品推荐

