Gerador aleatório de números D20
On Fevereiro 9, 2021 by adminEstou aprendendo código sozinho usando Zed Shaw “s Aprenda Python O jeito difícil , e fiquei entediado durante uma das aulas de memorização, então pensei em fazer um gerador aleatório de números D20 para quando eu jogar RPGS.
Como posso tornar este código melhor? Há algo estúpido que estou fazendo?
import random name = raw_input("Please Type in your name > ") print "\nHello %s & welcome to the Random D20 Number Generator by Ray Weiss.\n" % (name) first_number = random.randint(1, 20) print first_number prompt = (""" Do you need another number? Please type yes or no. """) answer = raw_input(prompt) while answer == "yes": print random.randint(1, 20) answer = raw_input(prompt) if answer == "no": print "\nThank you %s for using the D20 RNG by Ray Weiss! Goodbye!\n" % (name)
Eventualmente, eu adoraria adicionar funcionalidade para que ele perguntasse que tipo e quantos dados você deseja jogar , mas por enquanto uma revisão do que eu fiz até agora realmente ajudaria.
Comentários
- Talvez inclua algumas das coisas nesta resposta : gamedev.stackexchange.com/questions/24656/…
Resposta
Aqui está minha opinião:
from random import randint name = raw_input("Please Type in your name > ") print """ Hello {} & welcome to the Random Number Generator by Ray Weiss. """.format(name) upper = int(raw_input("Enter the upper limit > ")) n = int(raw_input("How many D{} you"d like to roll? ".format(upper))) for _ in xrange(n): print randint(1, upper) print """ Thank you {} for using the D{} RNG by Ray Weiss! Goodbye! """.format(name, upper)
Alterações em comparação com seu versão:
- importe diretamente
randint
porque é a única função que você usa emrandom
; - use o novo método de formatação de string (
str.format
); - pegue o limite superior do usuário em vez de codificar 20;
- pegue o número de jogadas do usuário em vez de perguntar repetidamente se isso “é suficiente;
- use um loop para fazer a repetição realmente funciona. O código que se auto-repete perguntando ao usuário se devemos continuar agora se foi.
Comentários
- Obrigado! Isso é legal, vou brincar com isso para que continue perguntando se você quer lançar mais dados, algumas coisas novas aqui que eu não tinha visto antes. se importa se eu perguntar o que _ in xrange (n) faz? Posso discernir o resto.
- @lerugray Aqui ‘ s o documento em
xrange
. Eu apenas o uso para executar o corpo do loopn
vezes. - @lerugray, _ em haskell significa um nome vazio (você o usa quando deve fornecer uma variável que é inútil – como neste loop). Suponho que tenha o mesmo significado em python.
- @Aleksandar Tecnicamente, é ‘ um nome totalmente legítimo, então pode ser usado dentro do loop, mas você entendeu bem. Eu não ‘ sabia que veio de Haskell (e não ‘ não conhecia Haskell), mas faz muito sentido.
Resposta
Não tenho muito a dizer sobre estilo, o que é bom. Acho que é o único O comentário real seria que eu pessoalmente acho o uso de caracteres de nova linha mais simples do que aspas triplas para strings de várias linhas, especialmente quando você quer apenas ter certeza do espaçamento entre as linhas.
Eu gosto que você esteja usando randint
para as jogadas, em vez de randrange
ou alguma outra estrutura: é inclusiva para iniciar e parar, e que corresponde exatamente ao mundo real função que você está recriando aqui, então não há necessidade de alterar os parâmetros ou os resultados com +1.
Em termos de design, eu dividiria o material do front-end, que leva a entrada do usuário e devolve informações, do lançamento de dados real. Isso permitiria que você reutilizasse o lançamento de dados para outros fins (fora do no topo da minha cabeça, um gerador de tesouro aleatório), estenda a lógica da interface com tipos adicionais de funcionalidade ou retrabalhe sua lógica sem destruir toda a estrutura.
E, enquanto você estiver fazendo isso, pense maior – “Eu preciso lançar um d20” é apenas um único caso de “Eu preciso lançar alguns dados” e esse problema “não é muito mais difícil de resolver. Então, aqui está como eu faria isso:
def play(): """ This function is just the user interface. It handles the input and output, and does not return anything. """ name = raw_input("Please Type in your name > ") print "\nHello {}, & welcome to the Random D20 Number Generator by Ray Weiss.\n".format(name) print "Please type your rolls as "NdX" (N=number of dice, X=size of dice), or "Q" to quit.\n" while True: dice = raw_input("What dice do you want to roll? ").lower() if dice == "q": break else: try: number, size = dice.split("d") results = roll_dice(int(number), int(size)) except ValueError: # This will catch errors from dice.split() or roll_dice(), # but either case means there"s a problem with the user"s input. print "I don"t understand that roll.\n" else: print "You rolled {!s}: {!s}\n".format(sum(results), results) print "\nThank you {} for using the D20 RNG by Ray Weiss! Goodbye!\n".format(name) def roll_dice(number, size): """ number: any int; < 1 is allowed, but returns an empty list. size: any int > 1 Returns: a list with `number` elements, of dice rolls from 1 to `size` """ from random import randint return [randint(1, size) for n in range(number)]
Uma funcionalidade que você provavelmente gostaria de adicionar seria a modificação de roll_dice()
para aceitar um modificador (+ ou – alguma quantia). E se você realmente quiser ser sofisticado, pode começar a verificar os resultados para destacar 1s ou 20s, ou outros resultados de rolagem que tenham valores especiais em seu jogo.
Deixe uma resposta