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

Dúvida no Ex. 1 da Aula 1 - Começando o jogo com boas práticas de programação

O programa sempre pára após pedir o nome, com o seguinte erro: block in : undefined method 'joga' for main

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

def sorteia_palavra_secreta
    puts "Escolhendo uma palavra..."
    palavra_secreta = "programador"
    puts "Escolhida uma palavra com #{palavra_secreta.size} letras... boa sorte!"
    palavra_secreta
end

def nao_quer_jogar?
    puts "Deseja jogar novamente? (S/N)"
    quero_jogar = gets.strip
    nao_quero_jogar = quero_jogar.upcase == "N"
end    

nome = da_boas_vindas
loop do
    joga nome
    break if nao_quer_jogar?
end

def joga(nome)
    palavra_secreta = sorteia_palavra_secreta
    erros = 0
    chutes = []
    pontos_ate_agora = 0
    # laco principal a escrever
    puts "Você ganhou #{pontos_ate_agora} pontos."
end
4 respostas
solução!

Oi Felipe, tudo bem?

Acredito que isso se deve a ordem da declaração dos métodos, já que ruby é interpretada. Tenta por o método joga antes do loop?

# restante do código

def joga(nome)
    palavra_secreta = sorteia_palavra_secreta
    erros = 0
    chutes = []
    pontos_ate_agora = 0
    # laco principal a escrever
    puts "Você ganhou #{pontos_ate_agora} pontos."
end

nome = da_boas_vindas
loop do
    joga nome
    break if nao_quer_jogar?
end

Vê se funciona e nos avisa?

Abraço!

Muito obrigado! Era esse o problema.

Um abraço e ótima semana para você!

Oi Felipe, que bom que funcionou.

Nesse caso estou encerrando esse tópico. Qualquer dúvida ou problema você pode abrir um novo! :)

Ótima semana e bons estudos!

Boa tarde a todos,

Apenas complementando a resposta do Lucas, esse erro tipo de erro acontece em tempo de execução, pois o seu programa tenta acessar uma função que ainda não foi instanciado (alocada) em memoria, ocorrendo exatamente pela ordem que o código foi executado!

ex.1 - O programa tenta executar de cara a função teste, mas como ela ainda não foi instanciada, irá acusar erro em tempo de execução:

nome teste

def teste
    meu_nome = "Daniel"
    meu nome
end

Como ainda não é utilizado POO (programação orientada a objetos), é uma boa prática em linguagens estruturadas deixar toda a execução do programa no final, pois o computador irá interpretar todo o código para apenas no fim, executar!

ex.2:

# BLOCO DE FUNÇÕES
def a
...
end

def b
...
end

...

def z
...
end
# FIM DO BLOCO DE FUNÇÕES

# BLOCO DE EXECUÇÃO
nome = a
sobrenome= b
...
idade = z

# FIM DO BLOCO DE EXECUÇÃO

Espero poder ter esclarecido mais!

Abraço e bons estudos!

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