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

escolhe_palavra_secreta_sem_consumir_muita_memoria não funcionou!

Olá Guilherme, ocorreu o seguinte erro e não consigo enxergar onde possa ser:

C:/Ruby23-x64/Ruby/jogo_forca.rb:33:in `palavra_mascarada': undefined method `chars' for nil:NilClass (NoMethodError)

O código seria esse:

def escolhe_palavra_secreta_sem_consumir_muita_memoria
    avisa_escolhendo_palavra
    arquivo = File.new "dicionario.txt"
    quantidade_de_palavras = arquivo.gets.to_i
    numero_escolhido = rand(quantidade_de_palavras)
    for linha in 1..(numero_escolhido-1)
        arquivo.gets
    end
    palavra_secreta = arquivo.gets.strip.downcase
    arquivo.close
    avisa_palavra_escolhida(palavra_secreta)
end

Não enxerguei onde possa estar o erro de sintaxe. Na função jogo chamei essa nova função escolhe_palavra_secreta_sem_consumir_muita_memoria no copia e cola, não sei o que está ocorrendo. No primeiro método (que le todo o arquivo) funcionou corretamente

4 respostas

Oi Mario,

Você pode postar o código inteiro aqui? Parece que o erro está em outro lugar.

solução!

Olá Gabriel, Esse seria o código completo. mas o problema está dando na variação da função escolhe_palavra_secreta (função que foi mencionada acima) Esse código abaixo rodou perfeitamente.

require_relative 'ui'
require_relative 'rank'

def escolhe_palavra_secreta
    avisa_escolhendo_palavra 
    texto = File.read "dicionario.txt"
    todas_as_palavras = texto.split "\n"
    numero_escolhido = rand(todas_as_palavras.size)
    palavra_secreta = todas_as_palavras[numero_escolhido].downcase
    avisa_palavra_escolhida(palavra_secreta)
    palavra_secreta
end

def palavra_mascarada (chutes, palavra_secreta)
    mascara= ""
    for letra in palavra_secreta.chars
        if chutes.include? letra
            mascara << letra
        else
            mascara << "-"
        end
    end
    mascara
end

def pede_um_chute_valido(chutes, erros, mascara)
    cabecalho_de_tentativa(chutes, erros, mascara)
    loop do
        chute = pede_um_chute
        if chutes.include? chute
            avisa_chute_efetuado(chute)
        else
            return chute
        end
    end
end

def joga(nome)
    palavra_secreta = escolhe_palavra_secreta

    erros = 0
    chutes = []
    pontos_ate_agora = 0

    while erros < 5
        mascara = palavra_mascarada(chutes, palavra_secreta)
        chute = pede_um_chute_valido(chutes, erros, mascara)

        chutes << chute

        chutou_uma_letra = chute.size == 1
        if chutou_uma_letra
            letra_procurada = chute[0]
            total_encontrado = palavra_secreta.count(letra_procurada)
            if total_encontrado == 0
                avisa_letra_nao_encontrada
                erros += 1
            else
                avisa_letra_encontrada(total_encontrado)
            end
        else
            acertou = chute == palavra_secreta
            if acertou
              avisa_acertou_palavra
              pontos_ate_agora += 100
              break
            else
              avisa_errou_palavra
              pontos_ate_agora -=30
              erros += 1
            end
        end
    end
    avisa_pontos(pontos_ate_agora)
    pontos_ate_agora
end


def jogo_da_forca
    nome = da_boas_vindas
    pontos_totais = 0

    avisa_campeao_atual le_rank

    loop do
        pontos_totais += joga(nome)
        avisa_pontos_totais(pontos_totais)

        if le_rank[1].to_i < pontos_totais
            salva_rank(nome, pontos_totais)
        end

        salva_rank(nome, pontos_totais)
        if nao_quer_jogar?
          break
        end
    end
end

Achei interessante o fato de possuir uma forma (que é a função variante citada) de se reduzir a memoria na execução do código. Se precisar envio os arquivos main.rb e o ui.rb Valeu

Oi Mario,

Acredito que faltou devolver palavra_secreta na função escolhe_palavra_secreta_sem_consumir_muita_memoria. Experimente dessa forma:

def escolhe_palavra_secreta_sem_consumir_muita_memoria
    avisa_escolhendo_palavra
    arquivo = File.new "dicionario.txt"
    quantidade_de_palavras = arquivo.gets.to_i
    numero_escolhido = rand(quantidade_de_palavras)
    for linha in 1..(numero_escolhido-1)
        arquivo.gets
    end
    palavra_secreta = arquivo.gets.strip.downcase
    arquivo.close
    avisa_palavra_escolhida(palavra_secreta)
    palavra_secreta
end

O código do instrutor funciona pois a função avisa_palavra_escolhida(palavra_secreta) devolve a palavra secreta. Muito provavelmente você esqueceu de devolver esse valor na função dentro de ui.rb. Repare que na sua versão que funciona, você está devolvendo a palavra secreta na última linha.

Putz Gabriel,

Era isso mesmo!

Esqueci de devolver o valor da função.

Valeu