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

Problemas com a movimentação do personagem (H)

Olá pessoal,

Me desculpem se for repetido, mas procurei pelo fórum e não achei nada...

estou com problemas ao movimentar meu personagem, ele só anda uma "casa" e clona o personagem, ficam vários H's espalhados pelo mapa.

Segundo o prompt de comando o erro está na linha 46, mas já mexi nela tentei de varias formas, mas infelizmente não consegui, se alguém puder me ajudar ficarei muito grato.

O Erro no Prompt...

C:/Users/Usuario/Documents/fogefoge/fogefoge.rb:46:in `posicao_valida?': undefined local variable or method `nova_posicao' for main:Object (NameError)
        from C:/Users/Usuario/Documents/fogefoge/fogefoge.rb:63:in `joga'
        from C:/Users/Usuario/Documents/fogefoge/fogefoge.rb:74:in `inicia_fogefoge'
        from main.rb:3:in `<main>'

fogefoge.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)
    caracter_heroi = "H"
    mapa.each_with_index do |linha_atual, linha|
        coluna_do_heroi = linha_atual.index caracter_heroi
        if coluna_do_heroi != nil
            return [linha, coluna_do_heroi]
        end
    end
    #nao achei
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_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[nova_posicao[0]] [nova_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[0]] = " "
        mapa[nova_posicao[0]] [nova_posicao[1]] = "H"
    end
end

def inicia_fogefoge
    nome = da_boas_vindas
    joga nome
end

ui.rb

def da_boas_vindas
    puts "Bem vindo..."
    puts "Qual é o seu nome?"
    nome = gets.strip
    puts "Vamos começar #{nome}..."
    puts "\n\n\n\n"
    nome
end

def desenha (mapa)
    puts mapa 
end

def pede_movimento
    puts "Para onde deseja ir?"
    movimento = gets.strip
end
2 respostas
solução!

O problema é que você esta usando o novaposicao no metodo posicao_valida? mas ele não existe ali neste escopo, pelo que entendi você passa o nova_posicao dentro do joga quando chama o metodo posicao_valida mas olhe o nome do parametro na definicao do metodo, não é nova_posicao e sim "posicao" talvez seja esse o nome a ser utilizado.

espero ter ajudado.

Cara valeu, troquei o nome do parâmetro e ta funcionando. Valeu pela ajuda!!