Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

O programa ainda não está completo!

O programa ainda possui dois erros que eu gostaria de corrigir.

01) Quando ele me pergunta qual o nível de dificuldade, gostaria que, se fosse digitado algo diferente das opções, o programa fizesse a pergunta novamente. Esse acredito que dê pra corrigir com um if inclusive tenho uma ideia de como fazer mas esse erro me leva pro próximo

02) Quando o programa pede para chutar um número, se for digitado algo diferente de um número, por exemplo a letra "a", ele vai para a próxima tentativa, atribuindo a esse "a" o valor zero (que aparece nos números chutados até agora).

Minha dúvida é:

Como corrigir esse segundo erro de forma que, se o usuário digitar algo diferente de um número no intervalo pedido, o programa retorne a mensagem: "Ei, isso aí não é um número entre 1 e #{máximo} ". Além disso, não atribua 0 ao vetor e não vá para o próximo passo até que seja digitado um número entre 1 e o máximo do nível.

1 resposta
solução!

Eu consegui resolver os problemas usando um loop com um if (nas funções pede_dificuldade e pede_um_numero) e separando a função sorteia_numero_secreto em duas funções maximo_escolhido e sorteia_numero_secreto, daí funcionou.

O código ficou assim:

def da_boas_vindas
    puts
    puts "        P  /_\\  P                              "
    puts "       /_\\_|_|_/_\\                             "
    puts "   n_n | ||. .|| | n_n         Bem vindo ao    "
    puts "   |_|_|nnnn nnnn|_|_|     Jogo de Adivinhação!"
    puts "  |' '  |  |_|  |'  ' |                        "
    puts "  |_____| ' _ ' |_____|                        " 
    puts "        \\__|_|__/                              "
    puts
    puts "Qual é o seu nome?"
    nome = gets.strip
    puts "\n"
    puts "Começaremos o jogo para você, #{nome}"
    nome
end

def pede_dificuldade
    loop do    
        puts "Qual o nível de dificuldade que deseja de 1 a 5?"
        puts "(1) Muito fácil   (2) Fácil   (3) Normal   (4) Difícil   (5) Impossível"
        dificuldade = gets.to_i
        if dificuldade == (1 or 2 or 3 or 4 or 5)
        return dificuldade
        else
            puts "\n"
            puts "Ei, você não escolheu um nível corretamente."
            puts "\n"
        end
    end
end

def maximo_escolhido(dificuldade)
    case dificuldade
    when 1
        maximo = 30
    when 2
        maximo = 60
    when 3
        maximo = 100
    when 4
        maximo = 150
    when 5
        maximo = 200
    end
    maximo
end

def sorteia_numero_secreto(maximo)
    puts "Escolhendo um número entre 1 e #{maximo}..."
    sorteado = rand(maximo) + 1
    puts "Escolhido... Que tal adivinhar nosso número secreto?"
    puts "\n\n"
    sorteado
end

def pede_um_numero(maximo, chutes, tentativa, limite_de_tentativas)
    loop do
        puts "Tentativa #{tentativa} de #{limite_de_tentativas}"
        puts "Números chutados até agora: #{chutes}"
        puts "Entre com o número"
        chute = gets.to_i
        if (chute >= 1) and (chute <= maximo)
            puts "Será que você acertou? Você chutou #{chute}"
        return chute.to_i
        else
            puts "\n"
            puts "Você não chutou um número entre 1 e #{maximo}, tente novamente!"
            puts "\n"
        end
    end
end

def verifica_se_acertou(numero_secreto, chute)
    acertou = numero_secreto == chute

    if acertou
        ganhou
        return true
    end

    maior = numero_secreto > chute
    if maior
        puts "O número secreto é maior!"
    else
        puts "O número secreto é menor!"
    end
    false
end

def ganhou
    puts
    puts "             OOOOOOOOOOO               "
    puts "         OOOOOOOOOOOOOOOOOOO           "
    puts "      OOOOOO  OOOOOOOOO  OOOOOO        "
    puts "    OOOOOO      OOOOO      OOOOOO      "
    puts "   OOOOOOO      OOOOO      OOOOOOO     "
    puts "  OOOOOOOOO    OOOOOOO    OOOOOOOOO    "
    puts " OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO   "
    puts " OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO   "
    puts " OOO    OOOOOOOOOOOOOOOOOOOOO    OOO   "
    puts " OOOO   OOOOOOOOOOOOOOOOOOOOO   OOOO   "
    puts "  OOOO   OOOOOOOOOOOOOOOOOOO   OOOO    "
    puts "    OOOO    OOOOOOOOOOOOO     OOOO     "
    puts "     OOOOO                 OOOOO       "
    puts "        OOOOOO         OOOOOO          "
    puts "           OOOOOOOOOOOOOOO             "
    puts
    puts "               Acertou!                "
    puts
end

def joga(nome, dificuldade)

    maximo = maximo_escolhido(dificuldade)
    numero_secreto = sorteia_numero_secreto(maximo)

    pontos_ate_agora = 1000
    limite_de_tentativas = 5
    chutes = []

    for tentativa in 1..limite_de_tentativas
        chute = pede_um_numero(maximo, chutes, tentativa, limite_de_tentativas)
        chutes << chute

        if nome == "Douglas"
            ganhou
            break
        end

        pontos_a_perder = (chute - numero_secreto).abs / 2.0
        pontos_ate_agora -= pontos_a_perder

        if verifica_se_acertou(numero_secreto, chute)
            break
        end
    puts "\n\n"
    end

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

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

nome = da_boas_vindas
dificuldade = pede_dificuldade

loop do
    joga(nome, dificuldade)
    if !quer_jogar?
        break
    end
end