2010-04-22 9 views
1

저는 교수님이 프로그래밍 수업 개념의 최종 프로젝트에 배정 한 python tetris 게임을 진행하고 있습니다. 나는이 시점에서 그가 작업하고 싶은 모든 것을 가지고있다. 그러나 나는 그것의 한 부분에 약간의 문제가있다. 좌우로 움직이기 시작할 때마다 "범위를 벗어난 색인 오류"가 계속 발생합니다. 이것은 조각에 맞을 때만 발생합니다. 나를 슬픔에 빠뜨리는 범인이 여기있다.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 

나를 위해 문제를 해결할 사람이 없기 때문에 직접 해결하는 방법에 대한 정보 만 찾고 있습니다. 주어진 도움에 미리 감사드립니다.

+5

힌트가 ...

if (col < num_cols and ...) 
나는 또한 CrazyDrummer에 동의

는, 일반적인 클리어 기능을


스포일러를 확인해야합니다 : 알 수있는 줄을주의 깊게 살펴보면 오류가 발생합니다. 에이스 백. –

답변

0

예외가 발생했을 때 다른 점을 확인하십시오. 프로그래밍 상태 정보를 인쇄 해보십시오. 변수 색인이있는 배열에 액세스하는 곳이 하나 밖에 없으므로 검색 범위를 조금 좁힐 수 있습니다.

별도 제안 : 매개 변수로 지우려는 방향을 결정하는 일반 clear을 만듭니다.

debugging rules!을 적극 권장합니다. 문제를 찾아 적절히 수정하는 데 도움이됩니다. : D

+0

또 다른 팁 : 필요하다면 파이썬의'pdb' 모듈을 사용하여 코드를 단계별로 처리하십시오. – Santa

2

첫 번째 방법에서 문제가되는 오타가 있습니다.

블록에서 각 셀을 오른쪽으로 이동했는지 확인하는 경우 격자에서 꺼져 있는지 확인하지 않습니다.

if (col >= 0 and ...) 

아마

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