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

`<': comparison of String with 0 failed (ArgumentError)

Não estou entendendo, extraímos a função mas agora ao comparar pra ver se não extrapola a linha ele diz que não consegue comparar ?

Sendo que está igual ao exemplo. Não sei o que fazer.

def posicao_valida?(mapa, nova_posicao)
    linhas = mapa.size
    colunas = mapa[0].size
    estourou_linhas = nova_posicao[0] < 0 || nova_posicao[0] >= linhas
    estourou_colunas = nova_posicao[1] < 0 || nova_posicao[1] >= colunas
    if estourou_linhas || estourou_colunas
      return false
    end
    if mapa[nova_posicao[0]][nova_posicao[1]] == "X"
      return false
    end
    true
end

def joga(nome)
    mapa = le_mapa(1)
    while true
        desenha_mapa(mapa)
        direcao = pede_movimento
        heroi = encontrar_jogador(mapa)
        nova_posicao = calcula_nova_posicao(heroi, direcao)
        if !posicao_valida?(mapa, nova_posicao)
            next
        end
        mapa[heroi[0]][heroi[1]] = " "
        mapa[nova_posicao[0]][nova_posicao[1]] = "H"
    end
end
6 respostas

Ele diz que o erro tá aqui

   estourou_linhas = nova_posicao[0] < 0 || nova_posicao[0] >= linhas

Bruno, compartilha o código da sua função pede_movimento com a gente? Ela está guardando os dados no mapa direcao como texto e não número, então teremos que alterá-la para converter o texto em números!

Chamar o método .to_i no texto lido deve resolver, mas compartilhe o código para que eu possa mostrar todos os pontos do código onde isso deve ser feito.

Meu pede movimento tá assim:

def pede_movimento
    puts "para onde deseja ir?"
    movimento = gets.strip.upcase
    puts "\n\n"
    movimento
end

Mas olha só, ele pega a direção apenas pra saber como acrescentar na posição do herói:

def calcula_nova_posicao(direcao, heroi)
  case direcao
      when "W"
        heroi[0] -= 1
      when "S"
        heroi[0] += 1
      when "A"
        heroi[1] -= 1
      when "D"
        heroi[1] += 1
  end
  heroi
end

Pra não ter dúvida, aqui como ele encontra o herói no mapa:

def encontrar_jogador(mapa)
    caracter_do_heroi = "H"
    mapa.each_with_index do |linha_atual, linha|
      coluna_do_heroi = linha_atual.index(caracter_do_heroi)
        if coluna_do_heroi
            return [linha, coluna_do_heroi]
        end
    end
end
solução!

Bruno, estava revisitando tópicos abertos e encontrei o seu, aí fui dar uma olhada. Achei um problema aqui no seu código que pode estar causando problemas:

# definicao do metodo:
def calcula_nova_posicao(direcao, heroi)
#...
# chamada do método:
nova_posicao = calcula_nova_posicao(heroi, direcao)
#...

Provavelmente o método calcula_nova_posicao, por estar sendo chamado com os parâmetros invertidos, está comparando uma direção (AWSD) com um inteiro e isso está causando o problema do seu código.

Agora, por quê não está dando pau antes, dentro do método de calcular?

def calcula_nova_posicao(direcao, heroi)
  case direcao
      when "W"
        heroi[0] -= 1
      when "S"
        heroi[0] += 1
      when "A"
        heroi[1] -= 1
      when "D"
        heroi[1] += 1
  end
  heroi
end

Direcao está sendo passado como heroi e vice versa, então direcao é um array de ints

Como direcao nunca vai ser igual a W, A, S ou D, o código pula direto pro retorno, sem chegar a rodar o código heroi[0] ou heroi[1] dentro do switch/case

Só então é retornado o valor que heroi, que é alguma das letras WASD, que então é usada na linha do erro.

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