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

Break fora do loop?

Pessoal, bom dia!

Mais uma vez estou tentando misturar alguns conceitos. Para diminuir o código (e testar as funções) eu escrevi duas funções:

def numero_correto_acertou():
  if numero == numero_secreto_1:
    print(f'Parabéns! Você acertou!')

def numero_correto_errou():
  if numero > numero_secreto_1:
    print(f'O seu número é maior do que o nosso!')
  else:
    numero < numero_secreto_1
    print(f'O seu número é menor do que o nosso!')

Eu poderia colocar toda a lógica dentro de um mesmo def, mas minha intenção aqui é testar e compreender melhor o conceito.

O código até o momento ficaria assim:

#Apresentação do jogo

print(f'*'*5)
print(f'Bem vindo ao Jogo da Adivinhação!')
print(f'*'*5)

#Variáveis utilizadas no jogo

numero_secreto_1 = 5
tentativas_restantes = 3
rodadas = 1

while (rodadas <= tentativas_restantes):
  print("Tentativa {} de {} tentativas restantes".format(rodadas, tentativas_restantes))
  numero = int(input(f'Digite um número de 0 até 10: '))
  numero_correto_acertou
  numero_correto_errou
  rodadas = rodadas + 1

Minhas dúvidas são:

a. Vocês que tem mais experiência, poderiam avaliar o código? b. Quero usar os conceitos de break e continue que, pelo que eu li, só podem ser usados dentro de um loop. Ele funcionaria nessa estrutura? c. O código está parando na tentativa 2. Quando eu acerto o número, ele também não fornece o print afirmando que o jogador acertou.

Agradeço a ajuda de todos!

1 resposta
solução!

Olá,

Vamos por partes: a. Vocês que tem mais experiência, poderiam avaliar o código? R: Se você quiser chamar suas funções "numero_correto_acertou" e "numero_correto_errou", teria que fazer uma adaptação no seu código:

#Apresentação do jogo

print(f'*'*5)
print(f'Bem vindo ao Jogo da Adivinhação!')
print(f'*'*5)

#Variáveis utilizadas no jogo

numero_secreto_1 = 5
tentativas_restantes = 3
rodadas = 1

while (rodadas <= tentativas_restantes):
  print("Tentativa {} de {} tentativas restantes".format(rodadas, tentativas_restantes))
  numero = int(input(f'Digite um número de 0 até 10: '))
  numero_correto_acertou() # se não usar o () no final, não chama a função
  numero_correto_errou() # se não usar o () no final, não chama a função
  rodadas = rodadas + 1

O código acima não está dos mais eficientes e não segue "boas práticas", mas depois explico.

b. Quero usar os conceitos de break e continue que, pelo que eu li, só podem ser usados dentro de um loop. Ele funcionaria nessa estrutura? R: Sim, porém para isso seria necessário mudar sua função de validação, pq atualmente ela não retorna nada para você, poderia ser algo do tipo:

def numero_correto_acertou():
  return numero == numero_secreto_1 # sua função agora retorn "True" quando você acerta o número e "False" quando você erra

def numero_correto_errou():
  if numero > numero_secreto_1:
    print(f'O seu número é maior do que o nosso!')
  else:
    numero < numero_secreto_1
    print(f'O seu número é menor do que o nosso!')

#Apresentação do jogo

print(f'*'*5)
print(f'Bem vindo ao Jogo da Adivinhação!')
print(f'*'*5)

#Variáveis utilizadas no jogo

numero_secreto_1 = 5
tentativas_restantes = 3
rodadas = 1

while (rodadas <= tentativas_restantes):
  print("Tentativa {} de {} tentativas restantes".format(rodadas, tentativas_restantes))
  numero = int(input(f'Digite um número de 0 até 10: '))
  if numero_correto_acertou(): # se você acertar, a função retorna True e entra no if
    print(f'Parabéns! Você acertou!')
    break # como você acertou, o break sai do while
  else: # se você errou, a função abaixo é chamada
    numero_correto_errou()
  rodadas = rodadas + 1

c. O código está parando na tentativa 2. Quando eu acerto o número, ele também não fornece o print afirmando que o jogador acertou R: O print não funciona pelo que comentei acima, você não está chamado a função da forma correta, pois não colocou () no final.

Em todo caso, você não passa parâmetros para a sua função, e isso faz com que sua variável tenha que ser declarada antes, uma opção que deixa seu código mais "clean" e próximo das boas práticas seria o abaixo:

# parece que é a mesma coisa, mas sua função atual utiliza variáveis dentro dela que precisam ser declaradas em outro lugar, ou seja, 
# se você executar o código fora de ordem ela não funcionaria. Da forma abaio sua função sempre vai funcionar, pois as variáveis sempre serão passadas
def valida_numero(numero, numero_secreto): 
  return numero == numero_secreto # retorna True se você acertar o número

# aqui eu só ajustei o nome para "recebe_dica", pense que daqui alguns anos você vai ler esse código e é bom que o nome da função
# te dê clareza sobre o que a função faz. Passar as variáveis como parâmetro é pelo mesmo motivo anterior
def recebe_dica(numero, numero_secreto): 
  if numero > numero_secreto:
    print(f'O seu número é maior do que o nosso!')
  else:
    numero < numero_secreto
    print(f'O seu número é menor do que o nosso!')

#Apresentação do jogo

print(f'*'*5)
print(f'Bem vindo ao Jogo da Adivinhação!')
print(f'*'*5)

#Variáveis utilizadas no jogo

numero_secreto = 5
total_de_tentativas = 3 # na verdade esse é o total de tentativas, sempre é bom deixar o nome da variável muito próximo do que ele significa
rodadas = 1

while (rodadas <= total_de_tentativas):
  print("Tentativa {} de total de {} tentativas".format(rodadas, total_de_tentativas))
  numero = int(input(f'Digite um número de 0 até 10: ')) # apesar de pedir para ser entre 0 e 10, você não valida, poderia implementar um validador
  if valida_numero(numero, numero_secreto):
    print(f'Parabéns! Você acertou!')
    break # como você acertou, o break sai do while
  else:
    recebe_dica(numero, numero_secreto)
  rodadas = rodadas + 1

O código sempre pode ser melhorado, e com o tempo você vai começar a perceber mais rápido as melhores práticas.

Abs!