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!