Матрица тральщика Python выходит за границы цикла и последняя строка не заполняется - PullRequest
0 голосов
/ 05 октября 2019

Я создаю игру тральщика на python, до сих пор не использую какой-либо интерфейс, только в ascii, пытаясь реализовать код вручную, так как у меня нет большого опыта в py, я получаю немного отлаженную отладкумой код, у меня проблема в том, что, когда «бомба (X)» находится в последней строке или первом столбце, он переходит на другую сторону, и если он находится в последнем столбце, или в первом столбце и последней строке, код не работаетall

Пример цикла матрицы

 ['1' 'X' '1' '0' 'X']
 ['1' '1' '1' '0' '0']
 ['0' '0' '0' '0' '0']
 ['0' '0' '0' '0' '0']
 ['1' '1' '1' '0' '0']

Ошибка последнего столбца матрицы

 ['0' '0' '0' '0' '0']
 ['0' '0' '1' '1' '1']
 ['0' '0' '1' 'X' '1']
 ['0' '0' '1' '1' '1']
 ['0' '0' '0' 'X' '0']

Соответствующий код

Алгоритм заполнения чисел

def popularNumeros(column,row,matrix):
    column -=1
    row -=1
    for col in range(column):
        for ro in range(row):
            if matrix[col][ro] == 'X':
                try:
                    matrix[col+1][ro+1] = checker(matrix[col+1][ro+1])#diagonal inferior direita
                    matrix[col+1][ro-1] = checker(matrix[col+1][ro-1])#diagonal inferior esquerda
                    matrix[col-1][ro-1] = checker(matrix[col-1][ro-1])#diagonal superior esquerda
                    matrix[col-1][ro+1] = checker(matrix[col-1][ro+1])#diagonal superior direita
                    matrix[col-1][ro] = checker(matrix[col-1][ro])#cima
                    matrix[col+1][ro] = checker(matrix[col+1][ro])#baixo
                    matrix[col][ro-1] = checker(matrix[col][ro-1])#esquerda
                    matrix[col][ro+1] = checker(matrix[col][ro+1])#direita
                except:
                    ro+=1

Bomb Checker

def checker(matrixItem):
    if matrixItem == 'X':
        return matrixItem

    else:
        return str(int(matrixItem)+1)

1 Ответ

0 голосов
/ 05 октября 2019

Индексирование отрицательно в список (например, когда col равно 0, поэтому col-1 = -1) переносится в конец списка, возвращая последний элемент в списке.

Индексирование послепоследний элемент списка вызывает исключение IndexError - IndexError: list index out of range. Когда это происходит, Python немедленно переходит к блоку except, и после его завершения он не возвращается к тому месту, где он был, когда впервые возникло исключение.

Вам необходимо убедиться, что вы не 't отрицательно индексировать в ваш список matrix или индекс после конца.

Вы можете использовать множество операторов if вокруг каждой строки в блоке try, или вы можете использовать for цикл для проверки окружающих ячеек, например:

def popularNumeros(column, row, matrix):
    for col in range(column):
        for ro in range(row):
            if matrix[col][ro] == 'X':
                for offset_column in range(col-1, col+2):
                    if offset_column < 0 or offset_column >= column:
                        continue # Outside of the safe boundary - skip

                    for offset_row in range(ro-1, row+2):
                        if offset_row < 0 or offset_row >= row:
                            continue # Outside of the safe boundary - skip

                        matrix[offset_column][offset_row] = checker(matrix[offset_column][offset_row])

Кроме того, для чего бы вы ни стояли, у вас есть колонка и строка назад вперед. Я так и оставил.

...