2
respostas

Meu When S não funciona

Boa noite,

Sempre que tento o comando S, da um erro. Segue abaixo o erro:

C:/Users/Juliano/Desktop/Curso Alura/Ruby and Rails/Foge Foge/fogefoge.rb:43:in `joga': undefined method `[]=' for nil:NilClass (NoMethodError)
        from C:/Users/Juliano/Desktop/Curso Alura/Ruby and Rails/Foge Foge/fogefoge.rb:49:in `inicia_fogefoge'
        from main.rb:3:in `<main>'
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 joga(nome)
    mapa = le_mapa(1)
    while true
        desenha mapa
        direcao = pede_movimento
        heroi = encontra_jogador mapa
        mapa[heroi[0]][heroi[1]] = " "
        nova_posicao = calcula_nova_posicao heroi, direcao
        mapa[nova_posicao[0]][nova_posicao[1]] = "H"
    end
end

def inicia_fogefoge
    nome = boas_vindas
    joga nome
end
2 respostas

Oi Juliano, boa tarde!

O erro só acontece quando aperta o comando S?

Pelo que vi no código, o erro provavelmente aconteceu na hora de reposicionar o heroi (a letra H). Provavelmente você tentou mover ele pra uma posição fora do mapa, aí o valor pra nova_posicao[0] ou pra nova_posicao[1] foi nil.

Pede pra imprimir as posições antigas e novas (usando o comando puts) pra ver pra onde está movendo o heroi.

Se não for isso que aconteceu, manda o mapa e a sequência de comandos que fez pra podermos simular melhor seu código. :)

Olá boa noite,

Então com relação aos comandos do D e o A estão funcionando, mais o único que não estou conseguindo executar é o S. Depois que inseri o heroi = heroi.dup parou de acontecer o erro, porém o meu herói não está movimentando para baixo.

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)
    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
    excedeu_linhas = posicao[0] < 0 || posicao[0] >= linhas
    excedeu_colunas = posicao[1] < 0 || posicao[1] >= colunas

    if excedeu_linhas || excedeu_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
        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 = boas_vindas
    joga nome
end



MAPA

XXXXX
X H X
X X X
X X X
X   X
  X  
 XXX
  X  
X F X
XXXXX