Boa tarde, estou com um problema ao movimentar o herói no primeiro mapa. É um problema que só acontece se o herói se movimentar uma maneira específica. Começando o jogo, no mapa1, se eu fizer o percurso : D > S > S > S > S > D > S > S , o jogo dá erro '[]=' : index 4 out of string (IndexError). Essa posição seria a Linha = 7, Coluna = 4. Porém, se eu fizer o caminho pelo lado esquerdo e chegar nessa mesma posição com o herói, não dá erro. Já quebrei a cabeça e ainda não identifiquei o problema. Segue o código (não botei as partes irrelevantes, como chamar a função de boas vindas etc)
def movimenta_heroi mapa
direcao = pede_direcao
heroi = posicao_atual_do_heroi mapa
nova_posicao = calcula_nova_posicao heroi, direcao
if pode_movimentar? mapa, nova_posicao
puts "Linha = #{nova_posicao[0]}, Coluna = #{nova_posicao[1]}"
mapa[nova_posicao[0]][nova_posicao[1]] = "H"
mapa[heroi[0]][heroi[1]] = " "
end
end
def posicao_atual_do_heroi mapa
caracter_do_heroi = "H"
mapa.each_with_index do |linha, linha_do_heroi|
coluna_do_heroi = linha.index caracter_do_heroi
if coluna_do_heroi
return [linha_do_heroi, coluna_do_heroi]
end
end
end
def calcula_nova_posicao heroi, direcao
heroi = heroi.dup
movimentos = {
"W" => [-1,0],
"S" => [+1,0],
"A" => [0,-1],
"D" => [0,+1]
}
movimento = movimentos[direcao]
heroi[0] += movimento[0]
heroi[1] += movimento[1]
heroi
end
def pode_movimentar? mapa, nova_posicao
explodiu_linha = nova_posicao[0] < 0 || nova_posicao[0] > mapa.size-1
explodiu_coluna = nova_posicao[1] < 0 || nova_posicao[1] > mapa[0].size-1
if explodiu_linha || explodiu_coluna
return false
end
if mapa[nova_posicao[0]][nova_posicao[1]] == "X"
return false
end
true
end
O compilador indica que o erro ocorre na linha 25, que seria esta linha :
mapa[nova_posicao[0]][nova_posicao[1]] = "H"
No mapa2 já testei várias vezes e não achei alguma posição que desse um erro parecido.
Att.