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

Herói não anda e não acusa erro

Olá, vi que vários alunos tem esse problema porém nenhuma solução se encaixou no meu caso. O Herói estava funcionando normalmente antes de refatorar, porém depois que refatorei não anda e não acusa nenhum erro.

O código da lógica é esse

require_relative 'ui'

def le_mapa(numero)
    arquivo = "mapa#{numero}.txt"
    texto = File.read arquivo
    mapa = texto.split "\n"
end

def encontra_jogador(mapa)
    caractere_do_heroi = "H"
    mapa.each_with_index do |linha_atual, linha|
        coluna_do_heroi = linha_atual.index caractere_do_heroi

        if coluna_do_heroi
            return [linha, coluna_do_heroi]
        end
    end        
end

def calcula_nova_posicao (heroi, direcao)
    heroi = heroi.dup
    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

def posicao_valida? (mapa, posicao)
    linhas = mapa.size
    colunas = mapa[0].size
    estourou_linhas = posicao[0] < 0 || posicao[0] >= linhas
    estourou_colunas = posicao[1] < 0 || posicao[1] >= colunas

    if estourou_linhas || estourou_colunas
        return false
    end
    if mapa[posicao[0]][posicao[1]] == "X"
        return false
    end
    true
end

def joga(nome)
    mapa = le_mapa 1

    while true
        desenha_mapa mapa
        direcao = pede_movimento
        heroi = encontra_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

def inicia_fogefoge
    nome = da_boas_vindas
    joga nome
end

O código de UI é:

def da_boas_vindas
    puts "Bem vindo ao foge-foge"
    puts "Qual é seu nome?"
    nome = gets.strip
    puts "\n\n\n"
    puts "Começaremos o jogo para você, #{nome}"
    nome
end

def desenha_mapa (mapa)
    puts mapa
end

def pede_movimento
    puts "Para onde deseja ir?"
    movimento = gets.strip    
end

E o main para rodar:

require_relative 'fogefoge'

inicia_fogefoge
14 respostas

Oi Mayra, tudo bem? Testei seu código e acho que sei o que foi que aconteceu. Os movimentos utilizam letras maiúsculas e talvez você tenha usado minúsculas para isso. Tenta ver isso por favor? Testa movimentar usando as letras maiúsculas!

Oi Wanderson, eu testei isso e não funciona

Oi Mayra, testei novamente e o heroi se movimenta sim, sem problemas. Você consegue me mostrar prints de como você está fazendo para jogar?

Tipo um print para cada passo. Depois de cada jogada. Você pode usar o pasteboard.co pra fazer upload das imagens e então colar os links para elas aqui.

Poxa Mayra, muito estranho isso. Tipo, não anda em posição alguma? Tipo, você mostrou ir para a esquerda, mas pra direita também não vai? Isso não deveria influenciar, mas qual é a versão do Ruby que você está usando? É Windows 10, certo?

No Windows geralmente o Ruby tem alguns problemas, mas não deveria estar tendo neste caso. Pode ser problema no mapa.txt também. Tenta baixar esse: https://raw.githubusercontent.com/alura-cursos/introducao-a-computacao-da-logica-aos-jogos-com-ruby/master/capitulo19/mapa1.txt

Eu testei todas as direções no meu computador e não tive esse problema. Uso um Linux, mas quero realmente acreditar que esse não seja o problema.

Oi Wanderson! Uso o Windows 10 sim.

Eu baixei o arquivo e não funciona para nenhuma posição também. Antes de fazer a refatoração o H andava e por isso acho que o problema não é no mapa e nem na versão do ruby.

Também já teste em um Windows 7 e também não funcionou.

Eu, no desespero, pensei se o erro poderia ser o prompt lendo a entrada do "Enter", mas não vi nesse curso de Ruby ser falado isso. E como você diz que para você funciona, o problema não pode ser no código, certo?

Enfim, a versão que tenho é ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]

Obrigada por não desistir rs

Pior que eu não tenho um Windows aqui pra mim testar agora Mayra. Sim, no Linux funciona normal. faz o seguinte, reinstala o Ruby por favor? Uma versão mais recente, o RubyInstaller pra Windows já tá na versão 2.5, testa ele.

Caso não dê certo, dá um feedback aqui que eu dou um jeito de testar no Windows.

Desistir não é com a gente Mayra! Espero que seja paciente e não desista também! Vamos resolver o problema de um jeito ou de outro tá bem?

Oi Wanderson, eu instalei essa versão do Ruby e ainda não deu certo. Testei tanto em um Windows 10 como no Windows 7.

solução!

Poxa Mayra, desculpa a demora em responder. Ainda temos esse problema né?

O problema é que o Ruby não é oficialmente suportado no Windows, as vezes temos probleminhas chatos com isso, mas no geral, sempre tem alguma solução meio maluca.

Neste caso, tenho algumas sugestões.

  1. Você pode esperar um pouco mais enquanto testo no Windows pra verificar mais de perto o que pode ser.

  2. Você instala o Virtualbox, cria uma máquina virtual para instalar o Ubuntu nela, e ai você usa essa máquina virtual pra continuar.

  3. No Windows 10, temos um recurso de Linux Subsystem, onde você "instala" o ubuntu dentro do seu Windows. Neste caso basta ir a Microsoft Store (aquele app que instala programas no windows), pesquisar por "ubuntu" e manda instalar. Neste caso o que muda? Você vai usar um terminal chamado "ubuntu", mas ainda estará usando o Windows.

Acho a terceira alternativa mais fácil de testar agora. Detalhe, no linux subsystem, você vai precisar instalar o Ruby pelo terminal.

Eu não sei exatamente por que está tendo esse problema, não deveria ter. Não estamos usando nenhum recurso avançado ou problemático da linguagem.

Que tal você testar a alternativa 3 enquanto eu testo a 1? A 2 vamos usar como "ultima alternativa". Pode ser?

Wanderson, instalei o app do Ubuntu e o ruby no linux system. Finalmente o código funcionou no terminal do Windows! Era isso mesmo que você esperava? rs

Porque fiquei um tempão tentando entender o Ubuntu e nele não consegui mexer, mas no prompt do Windows finalmente deu certo!

Já to há um tempo tentando entender esse erro e mesmo funcionando não sei qual é haha

Uia! Que excelente notícia Mayra! Mas espera, funcionou dentro do terminal do ubuntu ou no CMD mesmo? Poxa, se funcionou no CMD, é muito estranho, não? Antes você já estava testando nele, certo?

Será que foi alguma atualização do Windows?

Confesso que não esperava nada disso. No mínimo eu estava esperando que o Ubuntu desse certo.

A questão do ubuntu é que ele vai estar dentro do windows e você vai poder acessar ele via terminal, só isso mesmo. Ai você consegue usar algumas coisas do linux no windows. Algumas por que você não tem interface gráfica. O Ruby como tem melhor suporte no Linux, eu esperava que funcionasse tranquilamente.

Mas é como eu disse: não estamos usando nada mirabolante da linguagem para não funcionar no Windows. É tanto que acho que o seu caso foi um caso fora da curva.

Depois lembra de marcar o tópico como resolvido, tá bem? Isso, claro, se tiver certeza que o problema foi resolvido realmente.

Boa pessoal!!!

Wanderson, funcionou no CMD mesmo. Eu nunca mexi com Linux ou com o Ubuntu, então enquanto procurava sobre os comandos que usa no terminal do Ubuntu, testei no CMD e deu certo.

Eu não fiz atualização do Windows, mas tive que procurar como instalar o ruby no Ubuntu e não sei se nisso acabei instalando ou atualizando alguma coisa.

Vou marcar como resolvido porque está funcionando, mas confesso que não faço ideia do que aconteceu hahaha

De qualquer maneira, obrigada pela ajuda e pela atenção! :)

Opa Mayra, as vezes acontece algo inexplicável mesmo, não dizendo que é inexplicável, mas que por acaso funciona e a gente fica meio perdido sem saber o que realmente aconteceu.

Fico feliz em ver que não desistiu! Parabéns e força ai! Precisando, pode contar com a gente sempre, sem medo de ser feliz! Bons estudos Mayra.

Obs: vai ver foi alguma coisa no ruby mesmo, visto que você instalou uma versão mais recente. Sei lá, chute é chute! hahaha