Gambiarra é um termo amplo, mas eu considero que é qualquer coisa que seja mal feita ou que está longe de ser a solução ideal. É uma daquelas coisas que é meio difícil explicar de forma objetiva, mas vc sabe que é quando vê.
No seu caso, eu não diria que é gambiarra, apenas que dá pra simplificar a lógica e melhorar alguns detalhes.
Por exemplo, vc cria um dicionário com as regras. Mas vc só usa os valores, e em nenhum momento utiliza as chaves. Além disso, elas parecem meio redundantes: toda vez que vc tem chaves do tipo "coisa 1", "coisa 2", etc, é um forte indício de que talvez só precise de uma lista (ou array) dessas "coisas".
Outro detalhe é que input
sempre retorna uma string, então usar str(input())
é redundante e desnecessário.
Quanto aos loops, eu faria diferente, mas aí talvez seja gosto pessoal: eu não gosto muito dessas variáveis de controle ask
e ask1
. E a lógica de pedir pra digitar de novo até que o valor seja "y" ou "n" pode ser movida para uma função, isolando-a do loop principal. Algo assim:
import time
def ask(text):
while True: # enquanto não digitar "y" ou "n", continua o loop
answer = input(text)
if answer in ('y', 'n'):
return answer # return sai da função, devolvendo o valor digitado
rules = [
"You can't talk about Fight Club",
"You can't talk about Fight Club",
"You can't talk about Fight Club",
"Only one fight at a time",
"Only two people fight at a time",
"No shoes or shirts",
"Fights continue until necessary",
"First-time attendees must fight"
]
# só entra no loop se a pessoa quiser saber as regras
if ask('$ Do you want to know the rules?(y/n) ') == 'y':
while True:
for rule in rules:
print(f"* {rule}")
time.sleep(1)
if ask('$ Did you understand the rules?(y/n) ') == 'y':
break # se entendeu as regras, sai do while
print('# Welcome to Fight Club')
Repare na função ask
: eu não preciso colocar a pergunta uma vez antes do while
e outra dentro dele. Basta repeti-lo indefinidamente, até que seja digitado "y" ou "n".
Depois, posso usar essa função para ambas as perguntas (se quer saber as regras, e se entendeu). Note que nem precisa de variáveis auxiliares, posso usar o retorno da função ask
diretamente (eu fiz assim porque o valor não é utilizado mais de uma vez depois disso, mas caso fosse, aí justifica usar uma variável para guardar o valor digitado).
Também mudei a lógica: eu só entro no loop que mostra as regras se a pessoa quiser vê-las. E se a pessoa entendeu as regras, posso interromper o loop.
Já a mensagem "welcome" é sempre mostrada no final, então faz mais sentido deixá-la fora do loop.
Se não quiser mudar para usar while True
e break
, pelo menos mude os nomes das variáveis, pois ask
e ask1
não deixa muito claro o que cada uma é. Poderia ser algo como want_to_know
e understood
, por exemplo.
Outra opção é fazer com que a função ask
retorne True
ou False
, já que a pergunta só admite duas respostas possíveis ("sim" ou "não"). Aí no if
eu nem preciso verificar se é "y" ou "n":
import time
# retorna True se digitar "y" ou False se digitar "n"
# se não for nenhum, pede para digitar de novo
def ask(text):
while True:
answer = input(text)
if answer == 'y':
return True
if answer == 'n':
return False
rules = [
"You can't talk about Fight Club",
"You can't talk about Fight Club",
"You can't talk about Fight Club",
"Only one fight at a time",
"Only two people fight at a time",
"No shoes or shirts",
"Fights continue until necessary",
"First-time attendees must fight"
]
# não precisa mais comparar se é igual a "y"
if ask('$ Do you want to know the rules?(y/n) '):
while True:
for rule in rules:
print(f"* {rule}")
time.sleep(1)
if ask('$ Did you understand the rules?(y/n) '):
break # se entendeu as regras, sai do while
print('# Welcome to Fight Club')