2010-04-22 193 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