Python列表索引超出范围错误

1 投票
2 回答
1396 浏览
提问于 2025-04-15 21:55

我正在做一个Python的俄罗斯方块游戏,这是我教授布置的编程概念课的期末项目。到目前为止,我已经完成了他想让我做的几乎所有内容,但在某个部分遇到了一点小问题。每当我开始左右移动方块时,总是出现“索引超出范围”的错误。这种情况只在方块碰到其他方块时发生。以下是让我头疼的代码部分。

def clearRight(block=None):
    global board, activeBlock, stackedBlocks
    isClear = True
    if(block == None):
        block = activeBlock
    if(block != None):

        for square in block['squares']:
            row = square[1]
            col = square[0]+1
            if(col >= 0 and stackedBlocks[row][col] !=None):
                isClear=False
    return isClear


def clearLeft(block=None):
    global board, activeBlock, stackedBlocks
    isClear = True
    if(block == None):
        block = activeBlock
    if(block != None):

        for square in block['squares']:
            row = square[1]
            col = square[0]-1
            if(col >= 0 and stackedBlocks[row][col] !=None):
                isClear=False
    return isClear

我并不是想让别人帮我解决这个问题,我只是想要一些自己解决的建议。提前感谢任何提供的帮助。

2 个回答

0

看看在出现异常时有什么不同的地方。试着打印出程序的状态信息,这样可以帮助你更快找到问题。你只有一个地方是用变量索引来访问数组的,所以可以稍微缩小一下搜索范围。

另外一个建议是:做一个通用的 clear 函数,根据参数来决定你想要清除的方向。

我强烈推荐一本书 《调试规则》!,它会帮助你找到并正确解决问题。:D

2

在第一种方法中,有一个拼写错误会导致这个问题。

当你检查向右移动一个格子的每个单元格时,你没有检查它们是否超出了边界。

if (col >= 0 and ...)

可能应该是

if (col < num_cols and ...)

我也同意CrazyDrummer的看法,应该做一个通用的清除函数。


剧透...

def clear(x_offset, block=None):
    if not block: 
        block = activeBlock
        if not block: return True
    for x,y in block:
        x += x_offset
        if not (0 <= x < num_cols) or stackedBlocks[x, y]:
            return False
    return True

撰写回答