2
respostas

Problema ao sortear uma palavra

Boa noite. Quando vou executar o meu código ele sempre escolhe a segunda palavra do "dicionario.txt". O código não está aleatorizando uma palavra, sempre a mesma.

Segue os códigos:

main.rb

require_relative 'forca'

jogo_da_forca

forca.rb

require_relative 'ui'
require_relative 'rank'

def sorteia_palavra_secreta_sem_consumir_muita_memoria
    puts "\n\n\n"
    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

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 = sorteia_palavra_secreta_sem_consumir_muita_memoria

    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
        if nao_quer_jogar?
            break
        end
    end
end

ui.rb

def avisa_campeao_atual dados
    puts "Nosso campeão atual é #{dados[0]} com #{dados[1]} pontos."
end

def avisa_chute_efetuado chute
    puts "Você já chutou #{chute}."
end

def avisa_letra_nao_encontrada
    puts "Letra não encontrada."
end

def avisa_letra_encontrada total_encontrado
    puts "Letra encontrada #{total_encontrado} vezes."
end

def avisa_acertou_palavra
    puts
    puts "\nParabéns, você ganhou!"
    puts
    puts "       ___________      "
    puts "      '._==_==_=_.'     "
    puts "      .-\\:      /-.    "
    puts "     | (|:.     |) |    "
    puts "      '-|:.     |-'     "
    puts "        \\::.    /      "
    puts "         '::. .'        "
    puts "           ) (          "
    puts "         _.' '._        "
    puts "        '-------'       "
    puts
end

def avisa_errou_palavra
    puts "Que pena... errou."
end

def avisa_pontos pontos_ate_agora
    puts "Você ganhou #{pontos_ate_agora} pontos."    
end

def da_boas_vindas
    puts
    puts "/****************/"
    puts "/ Jogo de Forca */"
    puts "/****************/"
    puts
    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 desenha_forca (erros)
    cabeca = "   "
    corpo = " "
    pernas = "   "
    bracos = "   "
    if erros >= 1
        cabeca = "(_)"
    end
    if erros >= 2
        bracos = " | "
        corpo = "|"
    end
    if erros >= 3
        bracos = "\\|/"
    end
    if erros >= 4
        pernas = "/ \\"
    end

    puts "  _______       "
    puts " |/      |      "
    puts " |      #{cabeca}  "
    puts " |      #{bracos}  "
    puts " |       #{corpo}     "
    puts " |      #{pernas}   "
    puts " |              "
    puts "_|___           "
    puts 
end

def cabecalho_de_tentativa(chutes, erros, mascara)
    puts "\n\n\n\n"
    desenha_forca erros
    puts "Palavra secreta: #{mascara}"
    puts "Erros até agora: #{erros}"
    puts "Chutes até agora: #{chutes}"
end

def pede_um_chute
    puts "Entre com a letra ou palavra"
    chute = gets.strip.downcase
    puts
    puts "Será que acertou? Você chutou #{chute}"
    chute
end

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

def avisa_escolhendo_palavra
    puts "Escolhendo uma palavra secreta..."
end

def avisa_palavra_escolhida palavra_secreta
    puts "Escolhida uma palavra com #{palavra_secreta.size} letras... boa sorte!"
    palavra_secreta
end

def avisa_pontos_totais pontos_totais
    puts "Você possui #{pontos_totais} pontos."
end

rank.rb

def salva_rank nome, pontos_totais
    conteudo = "#{nome}\n#{pontos_totais}"
    File.write "rank.txt", conteudo
end

def le_rank
    conteudo = File.read("rank.txt")
    conteudo.split "\n"
end

dicionario.txt

alura
casa do codigo
caelum
desenvolvedor
programador
software
refatorar
code smell

rank.txt

Maurilio
200

Agradeço desde já!

2 respostas

Oi Maurilio,

Faltou colocar a quantidade de palavras como primeira linha do arquivo dicionario.txt.

Tenta colocar e rodar novamente.

Abraço!

Olá Joviane. O arquivo é pra ficar assim, certo?

8
alura
casa do codigo
caelum
desenvolvedor
programador
software
refatorar
code smell

Mas feito isso agora só a primeira palavra está sendo sorteada.