1

私は、教授がプログラミングクラスの概念の最終プロジェクトに割り当てた 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

私は誰かにそれを修正してもらうつもりはありません。自分で修正する方法のヒントを探しているだけです。与えられた助けを前もって感謝します。

4

2 に答える 2

2

最初の方法でその問題を引き起こすタイプミスがあります。

ブロック内の各セルを 1 つ右にシフトしてチェックする場合、それらがグリッドから外れているかどうかはチェックしません。

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
于 2010-04-22T23:16:44.237 に答える
0

例外が発生したときの違いを見てください。プログラムの状態情報を出力して、ゼロインに役立ててみてください。変数インデックスを使用して配列にアクセスする場所は 1 つしかないため、検索範囲を少し狭めることができます。

別の提案: パラメータによってクリアする方向を決定するジェネリックclearを作成します。

本のデバッグルールを強くお勧めします! 、問題を検索して適切に修正するのに役立ちます。:D

于 2010-04-22T23:13:40.647 に答える