2010-04-22 149 views
1

我正在研究一个python俄罗斯方块游戏,我的proffessor分配给编程类的概念的最终项目。在这一点上,我已经掌握了他想要处理的所有事情,但其中的一部分我遇到了一些小问题。每当我开始左右移动棋子时,我总是得到“索引超出范围错误”。这只发生在对一件作品时。这是让我悲伤的罪魁祸首。python list索引超出范围错误

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 

我不想让任何人为我解决它,我只是寻找如何自己修复它的提示。预先感谢您提供的任何帮助。

+5

提示:找出哪些行通过仔细观察tr来引起错误aceback。 – 2010-04-22 23:11:50

回答

0

看看发生异常时有什么不同。尝试打印出程序状态信息以帮助您完成工作。只有一个地方可以访问具有可变索引的数组,因此您可以稍微缩小搜索半径。

单独的建议:制定一个通用的clear,该参数决定了您想要从参数中清除的方向。

我强烈推荐本书debugging rules!,它将帮助您搜索并正确解决问题。 :D

+0

另一个提示:如果需要,可以使用Python的'pdb'模块遍历代码。 – Santa 2010-04-23 01:29:45

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