Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Até aula 9 o posicionamento do Heroi funcionava

A partir da aula 9 o posicionamento do Heroi esta incorreto, e estou com dificuldades pra resolver, o H fica duplicado e depois não é mais posicionado, entrei na parte escrita do codigo e copiei e mesmo assim não esta funcionando.

abaixo esta o codigo completo.

require_relative 'ui'

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

end

def encontra_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

# não achei!

end

def calcula_nova_posicao(heroi, direcao)

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_linha = posicao[0] < 0 || posicao[0] >= linhas
estourou_coluna = posicao[1] < 0 || posicao[1] >= colunas

if estourou_linha || estourou_coluna
    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 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

6 respostas

De qualquer maneira eu segui com o conteudo do curso e nas refatorações o problema não ocorre. Mas depois verifiquei que já existe uma ocorrencia com relação a esse problema, fiz uma copia do codigo que e apresentado e mesmo assim não funcionou.

Outro ponto que notei é que o comando heroi = heroi.dup não foi apresentado em video, acredito que entre uma edição e outra passou despercebido.

Olá Éder,

Testando o seu código realmente é o heroi = heroi.dup que está faltando e causando problemas, como você percebeu.

Pode dizer qual é a aula e atividade em que começou esse problema, a aula que está faltando o heroi = heroi.dup. Você mencionou a aula 09 acima, seria essa: https://cursos.alura.com.br/course/introducao-a-programacao-com-ruby-e-jogos-3/task/8234 ?

A aula seria o video 9 colisão... do modulo lidando com arrays

Uma coisa que achei estranha... Verifiquei no forum os codigos e os que criei e fiz uma comparação e não encontrei diferenças apenas no espaçamento entre eles um funcionou e outro não

def move_fantasmas(mapa) caracter_do_fantasma = "F" novo_mapa = copia_mapa mapa mapa.each_with_index do |linha_atual, linha| linha_atual.chars.each_with_index do |caractere_atual, coluna| eh_fantasma = caractere_atual == caracter_do_fantasma if eh_fantasma move_fantasma mapa, novo_mapa, linha, coluna end end end novo_mapa end

def move_fantasmas(mapa) caracter_do_fantasma = "F" novo_mapa = copia_mapa mapa

mapa.each_with_index do |linha_atual, linha|
    linha_atual.chars.each_with_index do |caractere_atual, coluna|
        eh_fantasma = caractere_atual == caracter_do_fantasma

        if eh_fantasma
            move_fantasma mapa, novo_mapa, linha, coluna

        end

    end

end

novo_mapa

end

Não sei se entendi muito bem essa segunda parte, ficou um pouco bagunçado o código acima.

Mas dependendo dos espaçamentos, se for indentação realmente vai causar diferenças no resultado, pois o ruby se baseia na indentação para separar blocos de código.

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