You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:41:19