Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Erro ao se movimentar pelo primeiro mapa (index 4 out of string (IndexError))

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.

3 respostas
solução!

Oi Diego, quer dizer que o problema é o mapa 1? Você já verificou a questão dos espaços no arquivo do mapa? Acontece que o seguinte, o mapa é baseado em espaços em branco e outros caracteres. Espaço em branco também é um carácter. Se em algum ponto, você não tiver espaço ou outro carácter, vai ter problemas.

Opa Wanderson, era isso mesmo. Olhando o arquivo, a linha onde dava erro era só ' XXX' em vez de ' XXX '. Curioso era que se eu chegasse nessa linha pelo lado esquerdo, e depois fosse para o direito, não dava esse problema.

Att.

Acontece! Que bom que você encontrou o problema rapidinho. Só um pedido, lembra sempre de marcar o post que resolveu seu problema como solução do tópico por favor? Assim fica mais claro que o problema foi de fato resolvido.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software