2010-04-22 4 views
1

Я работаю над игрой на основе python tetris, которую мой профессионал назначил для окончательного проекта концепций класса программирования. На данный момент у меня есть все, что он хотел, чтобы работать над этим, но у меня есть небольшая проблема с одной его частью. Всякий раз, когда я начинаю перемещать фигуры влево и вправо, я продолжаю «индексировать ошибку вне диапазона». Это происходит только в том случае, если оно находится против куска. Вот преступники, которые дают мне печаль.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. –

ответ

0

Посмотрите, что изменилось, когда вы получаете исключение. Попробуйте распечатать информацию о состоянии программы, чтобы помочь вам в нуле. Существует только одно место, где вы получаете доступ к массиву с переменными индексами, поэтому вы можете немного сократить радиус поиска.

Отдельное предложение: Сделать общий clear, который определяет, в каком направлении вы хотите очистить параметры.

Я настоятельно рекомендую книгу debugging rules!, она поможет вам в поиске и исправлении проблем. : D

+0

Другой совет: используйте Python 'pdb' модуль, чтобы выполнить код, если это необходимо. – Santa

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