1
resposta

Correção do Erro com NilClass

Pessoal, na função executa_remocao está faltando verificar se a posição não está fora do mapa ou não. Quando a posição está fora do mapa, não há como usar o array mapa. E é isto que causa um erro de nilClass (como relatado em outros posts).

def executa_remocao mapa, posicao, quantidade
    if mapa[posicao.linha][posicao.coluna] == "X"
        return
    end
    mapa[posicao.linha][posicao.coluna] = " "
    remove mapa, posicao, quantidade - 1
end

def remove mapa, posicao, quantidade
    if quantidade == 0
        return
    end
    executa_remocao mapa, posicao.direita, quantidade
    executa_remocao mapa, posicao.esquerda, quantidade
    executa_remocao mapa, posicao.cima, quantidade
    executa_remocao mapa, posicao.baixo, quantidade
end

Para resolver isto, criei a função dentro_do_mapa?

def dentro_do_mapa? (mapa, posicao)
    linhas = mapa.size
    colunas = mapa[0].size

    estourou_linhas = posicao.linha < 0 || posicao.linha >= mapa.size
    estourou_colunas = posicao.coluna < 0 || posicao.coluna >= mapa[0].size

    if estourou_linhas || estourou_colunas
        return false
    end 
    true
end

Essa função é uma cópia mais simples de posicao_valida?, verificando apenas as dimensões do Mapa. Em seguida, chamei a função dentro da executa_remocao:

def executa_remocao mapa, posicao, quantidade
    if dentro_do_mapa?(mapa, posicao)
        if mapa[posicao.linha][posicao.coluna] == "X"
            return
        end

        mapa[posicao.linha][posicao.coluna] = " "
        remove mapa, posicao, quantidade -1
    end
end

É isto!

1 resposta

Oi Flávio, estranho, a função posicao_valida? deveria verificar se a posição está dentro dos limites do mapa, por que se não está dentro dos limites, se trata de uma posição inválida. Neste sentido, seria preciso apenas usar a função posicao_valida? antes de fazer remoção.

De qualquer forma, obrigado por compartilhar sua solução aqui, tenho certeza que ajudará mais pessoas.