0

リスト「マップ」があり、すべての要素を、初期配列の各位置に作用する関数「counterPosition」のそれぞれの出力値に置き換えたいと思います。

map[0][0] = counterPosition(0,0)
map[0][1] = counterPosition(0,1)
...

そのように一つずつやっていくと答えが出ますが、こういうことをやってみると:

 for x in range (len(map)):
    for y in range (len(map)):
        map[x][y] = counterPosition(x,y)

それは動作しません...私は何か間違ったことをしていますか?

編集:

def counterPosition(x, y):
    bombs = 0
    for i in range(x-1, x+2):
        for j in range(y-1, y+2):
            if i<0 or j<0: continue
            elif map[i][j] == True:
                bombs += 1
    return bombs

map = [[True, False, False, False, False, True],
         [False, False, False, False, False, True],
         [True, True, False, True, False, True],
         [True, False, False, False, False, False],
         [False, False, True, False, False, False],
         [False, False, False, False, False, False]]

エラーは次のとおりです。

IndexError: list index out of range
4

1 に答える 1

3

あなたはもうすぐそこにいました

for x in range (len(map)):
    for y in range(len(map[x])):
        map[x][y] = counterPosition(x,y)

更新:指定した元のコードは、マップが正方形である場合にのみ実行されますが、これ指定したデータの場合です。サンプルデータと更新されたコードを見ると、実際のエラーは関数から発生していますcounterPosition。実際には2つの問題があります。

1.counterPosition関数で、範囲外の要素にアクセスします 。これは、すぐ上のエラーメッセージの一部として印刷されIndexError:...ます。これらのメッセージを注意深く読み、投稿に含めることをお勧めします。パスするx=5,y-5と、関数はにアクセスしようとしますmap[6][6]。「正しい」コードは次のようになります

def counterPosition(x, y):
    bombs = 0
    for i in range(x-1, x+2):
        for j in range(y-1, y+2):
            # check bounds:
            if 0 <= i < len(map) and 0 <= j < len(map[i]):
                if map[i][j] == True:
                    bombs += 1
    return bombs

2. 2番目の問題は、ブール要素を含むことをcounterPosition 期待 mapしていることですが、から整数を返し、counterPositionそれをに割り当てていmap[x][y]ます。したがって、次回のラウンドmapには整数値が含まれます。プロジェクトの残りの部分を見ずに、必要なのは2つの別々の多次元配列だと思います。

于 2013-02-27T22:28:12.417 に答える