1

我正在开发一个 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

我不想让任何人为我修复它,我只是在寻找有关如何自己修复它的提示。提前感谢您提供的任何帮助。

4

2 回答 2

2

在第一种方法中存在一个会导致该问题的错字。

当您检查块中的每个单元格向右移动时,您不会检查它们是否离开网格。

if (col >= 0 and ...)

可能应该是

if (col < num_cols and ...)

我也同意 CrazyDrummer,做一个通用的 clear 函数


剧透...

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
于 2010-04-22T23:16:44.237 回答
0

当你得到异常时,看看有什么不同。尝试打印出程序状态信息以帮助您归零。只有一个地方可以访问具有可变索引的数组,因此您可以稍微缩小搜索范围。

单独的建议:制作一个泛型clear来确定您想要通过参数清除的方向。

我强烈推荐这本书调试规则!,它将帮助您查找并正确解决问题。:D

于 2010-04-22T23:13:40.647 回答