Ajuda com alguns tópicos.

1. Ajuda com alguns tópicos.

Yanko Szuszko Soares
Yanko

(usa Outra)

Enviado em 01/05/2021 - 03:04h

Boa noite povo, este é meu primeiro post, então já peço perdão por qualquer conduta errada que eu possa ter tomado. Muitas das coisas que eu pesquiso sobre Python3 eu acabo aprendendo aqui, entretando me surgiram algumas dúvidas enquanto eu estava programando!

Então vamos lá. Eu estava fazendo um mini-jogo onde você pode digitar um desejo e teoricamente um gênio irônico de uma lampada mágica realizará seu desejo, mas ele nunca o faz. Eu sei, a ideia é estupída e infantil, porém estou aprendendo Python3 a pouquíssimo tempo e achei esse "jogo" uma ótima forma de praticar alguns conceitos... E bom, já que me surgiram algumas dúvidas, então a ideia funcionou. Enfim, chega de enrolação. Primeiramente, na linha 24 tem três "#" uma seguida da outra: era pra ser um comentário porém ficou muito grande, então quando chegarem nessa parte, considerem o seguinte comentário:

### Aqui começa a ficar um pouco confuso, eu quero que: se a "escolha_aleatoria_2" fosse igual a "sete", ou seja, à resposta original do usuário, ele faça uma sequência específica de coisas, entretanto não achei outra forma para fazer isso sem ser usando esse "if" que acaba gerando dois caminhos completamente diferentes por conta de um detalhezinho.

Dito isso, aqui está o código:

# A ideia é fazer um 'gênio' irônico da lâmpada que engana o usuário.

from random import choice # Daqui a pouco essa função será útil.

print(f'''{"Gênio da Lâmpada":_^100}\n\nOlá Usuário(a)! Obrigado por me livrar da lâmpada!
Irei recompensar você realizando somente um de seus mais ambiciosos desejos!''')
resposta_inutil = input('Vamos lá, diga-me, qual o seu desejo mais ambicioso? ')

um = 'ficar sem dinheiro nenhum até o dia de sua morte' # Eu comecei a criar alguns desejos para serem escolhidos de forma aleatória mais pra frente.
dois = 'ter todas as doenças possíveis ao mesmo tempo'
tres = 'ser a pessoa mais burra do mundo'
quatro = 'excluir da face da terra tudo que você gosta'
cinco = 'perder seu órgão sexual'
seis = 'queimar todas as árvores no mundo'
sete = resposta_inutil # Inútil, confesso... Achei que ficaria mais bonito se eu colocasse o "nome" dos desejos dessa forma, então não quis quebrar o padrão :p
oito = 'tornar-se a pessoa menos atraente ja existente no universo'
nove = 'receber 214 tapas na cara'
dez = 'sentir-se a pior coisa do universo que já existiu e ser incapacitado de morrer'

lista = [um, dois, tres, quatro, cinco] # Não sei se existe uma outra forma mais eficiente de fazer o que fiz aqui. Criei duas listas com elementos distintos para evitar que o mesmo desejo se repita. :)
lista2 = [seis, sete, oito, nove, dez] # Daqui a pouco essas listas farão sentido.
escolha_aleatoria_1 = choice(lista) # Aqui eu usei a funçao "choice" para escolher aleatoriamente um elemento da minha lista. O mesmo vale para a lista2 .
escolha_aleatoria_2 = choice(lista2)

if escolha_aleatoria_2 == sete: ### COMENTÁRIO ANEXADO NA PERGUNTA ###
resposta1 = input((f'Okay, então seu desjo é {escolha_aleatoria_1}? '))
resposta1_m = resposta1.lower() # Aqui eu joguei a resposta do usuario tudo para minúsculo e coloquei como condição no "if" a seguir, caso o usuário tenha algum problema e digite "SiM" Ou "nÃO".
if resposta1_m == 'sim':
print('Certo. Então realizarei seu desejo de fechar o programa.')
quit()
elif resposta1_m == 'nao' or 'não':
resposta2 = input(f'Perdão, me confundi. Seu desejo então é {escolha_aleatoria_2}? ') # É o que eu disse, não queria a chance de repetir o memso desejo, então criei outra lista com outros desejos
resposta2_m = resposta2.lower()
if resposta2_m == 'sim':
print(f'Que pena, pois demorou demais para responder. Te vejo na próxima!')
quit()
elif resposta2_m == 'nao' or 'não':
print(f'Mas que coisa, decida-se! Agora perdi a vontade de realizar seu desejo, te vejo na próxima.')
quit()
else:
confirmacao1 = input(f'Okay, então seu desejo é {escolha_aleatoria_1}? ')
confirmacao1_m = confirmacao1.lower()
if confirmacao1_m == 'sim':
print('Certo. Então realizarei seu desejo de fechar o programa.')
quit()
elif confirmacao1_m == 'nao' or 'não':
confirmacao2 = input(f'Perdão, me confundi. Seu desejo então é {escolha_aleatoria_2}? ')
confirmacao2_m = confirmacao2.lower()
if confirmacao2_m == 'sim':
print(f'Ué, achei que seu desejo era {resposta_inutil}. Que pena, perdi a vontade de realizar seu desejo. Passar bem.')
quit()
elif confirmacao2_m == 'nao' or 'não':
print(f'Mas que coisa, decida-se! Agora perdi a vontade de realizar seu desejo, te vejo na próxima.')
quit()



O jogo funciona da forma que é planejado, entretando há algumas funcionalidades que eu queria adicionar.
As minhas dúvidas são o seguinte:

1 - Como posso fazer para o programa reiniciar automaticamente após ser finalizado? Digo, para ele fazer a mesma pergunta que foi feita no início, no caso. Eu vi vários tópicos aqui no site falando sobre usar "when", porém não consegui aplicar neste meu código. Então me surgiu este questionamento.

2 - Eu definitivamente não me orgulho de ter usado tantos "if", "elif" e "else" . Gostaria muito de saber se há outra forma mais simples ou até mesmo mais complexa de fazer a mesma coisa, pois acho que dessa forma o código fica visualmente poluído.

3 - Por fim, quero saber como implementar a seguinte funcionalidade: Se o(a) usuário(a) digitar qualquer coisa além de "sim", "não" ou "nao" (independente das letras serem maiúsculas ou minúsculas, pois isso ja é corrigido pelo próprio programa), quero que apareça uma mensagem dizendo para ele(a) tentar novamente, informando-o(a) de escrever apenas com "sim" ou "não". Caso a pessoa digite qualquer coisa, o código da procedência ao jogo e bom... Isso é um erro. Tentei concertar isso jogando um "elif" ali no meio de várias formas possíveis, mas não deu certo :(

Obrigado pela paciência de todos que leram até aqui. Eu decidi postar minha pergunta no vivaolinux pois quando vi outras perguntas, 99% das respostas eram de pessoas super gente boa, apenas querendo ajudar, então me senti atraído pela comunidade. :)


  


2. Re: Ajuda com alguns tópicos.

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 01/05/2021 - 03:26h

Tive pouco contato com python, mas sei de outras linguagens, vu tentar ajudar no que eu souber:
1 - Como posso fazer para o programa reiniciar automaticamente após ser finalizado? Digo, para ele fazer a mesma pergunta que foi feita no início, no caso. Eu vi vários tópicos aqui no site falando sobre usar "when", porém não consegui aplicar neste meu código. Então me surgiu este questionamento.

Acredito que pra esse caso, você vá precisar do comando while ou for.
https://cafeinacodificada.com.br/for-while-python-estruturas-repeticao/
Basicamente, estes dois comandos fazem a repetição de partes de código que você percebeu como que precisa executar de novo.
A grande maioria dos programas tipo aplicativos com GUI, usam um loop (while ou for) para continuar executando a aplicação. Sem isso, aconteceria do programa chegar no final e então, terminar. Mas como está em loop, ele constuma reexecutar diversas vezes. Esse é um caso de programas como jogos, seja de console como no seu caso, ou seja com janelas/GUI.


2 - Eu definitivamente não me orgulho de ter usado tantos "if", "elif" e "else" . Gostaria muito de saber se há outra forma mais simples ou até mesmo mais complexa de fazer a mesma coisa, pois acho que dessa forma o código fica visualmente poluído.

Tem sim, mas acho que é um pouco acima do seu nível atual, ou melhor, é muito diferente pro seu caso, porém, seria interessante você procurar saber sobre máquinas de estads finitos, vulgo autômatos deterministicos. Isso é um assunto deixado de lado por muitos alunos de computação porque pensam de que nada serve. Mas acredite, pouparia muito código feioso caso algum deles resolvessem aprender como implementar máquinas de estados. Não conheço um bom tutorial sobre máquina de estado mas sei que tem livro com teoria (sem aplicação prática) que é bom, chamado de Linguagens FOrmais e Autômatos, do fulano Blauth Menezes que esqueci o primeiro nome. FOi por ele que aprendi sobre esse assunto, mas tive que inventar código na mão mesmo.

3 - Por fim, quero saber como implementar a seguinte funcionalidade: Se o(a) usuário(a) digitar qualquer coisa além de "sim", "não" ou "nao" (independente das letras serem maiúsculas ou minúsculas, pois isso ja é corrigido pelo próprio programa), quero que apareça uma mensagem dizendo para ele(a) tentar novamente, informando-o(a) de escrever apenas com "sim" ou "não". Caso a pessoa digite qualquer coisa, o código da procedência ao jogo e bom... Isso é um erro. Tentei concertar isso jogando um "elif" ali no meio de várias formas possíveis, mas não deu certo :(

Isso atmbém se resolve com um while. Você deve pegar um while comum e enquanto a opção lida for diferente de 'sim' OU 'não' deve continuar lendo a entrada do teclado. Mas caso seja um 'sim' ou um 'não', pode quebrar o while com um break. Pode ser que você consiga dispensar o uso do break, porque há vários modos de se conseguir tal efeito, mas nem todos são de igual eficiência.

____________________________________________
https://nerdki.blogspot.com/ acessa aí vai lá, é grátis!
Capeta (demo) do meu trabalho:
https://github.com/cpusam
“uma nova verdade científica não triunfa pelo convencimento dos seus oponentes e nem se fazendo com que eles vejam a luz, mas sim porque esses oponentes eventualmente morrem e uma nova geração cresce já familiarizada com a nova teoria.” Max Planck







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts