views:

195

answers:

2

I am working on a python tetris game that my proffessor assigned for the final project of a concepts of programming class. I have got just about everything he wanted to work on it at this point but I am having a slight problem with one part of it. Whenever I start moving pieces left and right I keep getting "index out of range error". This only happens when it is up against a piece. Here are the culprits that are giving me grief.

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

I am not looking to get anyone to fix it for me, I'm only looking for tips on how to fix it myself. Thanks in advance for any help that is given.

A: 

Look at what's different when you're getting the exception. Try printing out program state information to help you zero in. There's only one place where you access an array with variable indexes, so you can narrow your search radius a bit.

Separate suggestion: Make a generic clear that takes determines what direction you want to clear from by the parameters.

I highly recommend the book debugging rules!, it will aid you in searching out and properly fixing problems. :D

CrazyJugglerDrummer
Another tip: use Python's `pdb` module to step through the code if necessary.
Santa
+2  A: 

There a typo that would cause that problem in the first method.

When you're checking each cell in the block shifted one right, you don't check if they are off the grid.

if (col >= 0 and ...)

probably should be

if (col < num_cols and ...)

I also agree with CrazyDrummer, make a generic clear function


Spoilers ...

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
Ian