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

Melhorando o Código da Adivinhação

Comecei a criar funções para melhorar a leitura do código no game de adivinhação, e queria implementar a seguinte função:

    def print_msg_perdedor(numero_secreto):
    print("Você perdeu!!!")
    print(f"O número que eu havia pensado era {numero_secreto}")

Para isso, pensei em adicionar uma variável "perdeu" dentro do loop da função "verifica_chute", só que não faria sentido, pois o loop não irá continuar se rodada for maior que tentativas_totais. Pensei também em fazer: perdeu = rodada == tentativas_totais porém nesse caso acima, na rodada 5 da tentativa 5, já chamaria a função print_msg_perdedor() Em todo caso, de ambos os modos não funcionou.

Enfim, gostaria de ajuda para implementar a função print no final do loop abaixo:

   def verifica_chute(tentativas_totais, numero_secreto, pontos):
    """ função que verifica se o chute dado pelo usuário é igual
    ao número_secreto dentro de x rodadas
    """
    # for parametros - range(start, stop, [step])
    for rodada in range(1, tentativas_totais + 1):
        chute = int(input('Digite seu palpite de sorte: '))

        if (chute < 1 or chute > 100):
            print('O palpite deve estar entre 1 e 100! Tente novamente.')
            continue  # reinicia o laço

        acertou = chute == numero_secreto
        maior = chute > numero_secreto
        menor = chute < numero_secreto
        perdeu = rodada > tentativas_totais

        print('Processando...')
        time.sleep(1)

        print(f'Tentativa {rodada} de {tentativas_totais}')
        if (acertou):
            print_msg_acertou()
            break  # interrompe o laço se acertou
        if (maior):
            print('Você errou! O seu chute foi maior do que o número secreto.')
        if (menor):
            print('Você errou! O seu chute foi menor do que o número secreto.')
        if (perdeu):
            print_msg_perdedor(numero_secreto)

        pontos_perdidos = abs(numero_secreto - chute)
        pontos -= pontos_perdidos
3 respostas

Basta colocar sua unçãp print_msg_perdedor fora do loop :)

def print_msg_perdedor(numero_secreto):
    print("Você perdeu!!!")
    print(f"O número que eu havia pensado era {numero_secreto}")


def verifica_chute(tentativas_totais, numero_secreto, pontos):
    """ função que verifica se o chute dado pelo usuário é igual
    ao número_secreto dentro de x rodadas
    """
    # for parametros - range(start, stop, [step])
    for rodada in range(1, tentativas_totais + 1):
        chute = int(input('Digite seu palpite de sorte: '))

        if (chute < 1 or chute > 100):
            print('O palpite deve estar entre 1 e 100! Tente novamente.')
            continue  # reinicia o laço

        acertou = chute == numero_secreto
        maior = chute > numero_secreto
        menor = chute < numero_secreto
        perdeu = rodada > tentativas_totais

        print('Processando...')
        time.sleep(1)

        print(f'Tentativa {rodada} de {tentativas_totais}')
        if (acertou):
            return print_msg_acertou()  # interrompe o laço e a execução do resto da função
        if (maior):
            print('Você errou! O seu chute foi maior do que o número secreto.')
        if (menor):
            print('Você errou! O seu chute foi menor do que o número secreto.')

        pontos_perdidos = abs(numero_secreto - chute)
        pontos -= pontos_perdidos
    print_msg_perdedor(numero_secreto)

Muito obrigado por tentar me ajudar, Luiz Eduardo!

Mas talvez eu não tenha me expressado bem.

Sua solução não é assertiva pois a função "print_msg_perdedor" seria inicializada com o player perdendo ou não.

A função só deve ser inicializada se o loop se encerrar sem que a condição "acertou = chute == numero_secreto" tenha ocorrido.

o código completo está no meu gitHub https://github.com/jonsabino/LearningPythonFromScratch

solução!

Não seria executada caso ele vencesse. Só seria executada quando saisse do for, ou seja, quando as tentativas_totais acabassem. O return ali no return print_msg_acertou() # interrompe o laço e a execução do resto da função é justamente pra impedir o resto da execução. O return interrompe a função, retornando None, todo o resto do código não é executado, logo print_msg_perdedor(numero_secreto) nunca é chamado.