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

Bug ao testar o jogo

Quando vou testar o jogo, o mapa aparece tudo certo, porém quando vou mover o herói, ele não passa do segundo movimento e não apaga o herói da posição anterior mesmo fazendo o código igual ao da vídeo aula. Segue o código:

Arquivo: jogoFogeFoge.rb

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)
    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
        system("cls")
        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

Arquivo: ui.rb

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

def desenha(mapa)
    puts mapa
end

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

Arquivo: main.rb

require_relative 'jogoFogeFoge'

inicia_fogefoge

Arquivo: mapa1.txt

XXXXX
XH  X
  X X
  X X
X   X
XXX X

Veja como o mapa ficou após tentar mover o herói:

XXXXX
XHH X
 HX X
  X X
X   X
XXX X

OBS.: APÓS ISSO O HERÓI NÃO MEXE PARA POSIÇÃO ALGUMA.

2 respostas
solução!

Oi Mauricio,

No método que calcula_nova_posicao faltou duplicar o array heroi pois senão você está sempre mexendo no valor atual e não retornando uma nova posição.

Para duplicar é só fazer: heroi = heroi.dup antes de verificar a direção que o herói deve andar.

Abraço!

Ola joviane, no vídeo quando ele vai criar o método calcula_nova_posicao ele não duplicou o array do herói, por que? ele não fez o "heroi = heroi.dup" tive o mesmo problema que o Mauricio mas já consegui resolver, porem minha duvida é por que ele não duplicou o array do heroi