Generador de números aleatorios D20
On febrero 9, 2021 by adminEstoy aprendiendo a programar por mí mismo usando el de Zed Shaw «Aprender Python The Hard Way , y me aburrí durante una de las lecciones de memorización, así que pensé en hacer un generador de números D20 aleatorios para cuando juego RPGS.
¿Cómo puedo mejorar este código? ¿Hay algo estúpido que «estoy haciendo?
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)
Con el tiempo, me encantaría agregar funcionalidad para que te pregunte qué tipo y cuántos dados quieres colocar. , pero por ahora una revisión de lo que he hecho hasta ahora realmente ayudaría.
Comentarios
- Tal vez incorpore algunas de las cosas en esta respuesta : gamedev.stackexchange.com/questions/24656/…
Respuesta
Aquí está mi opinión:
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)
Cambios en comparación con su versión:
- importar directamente
randint
porque es la única función que usa enrandom
; - use el nuevo método de formato de cadena (
str.format
); - tome el límite superior del usuario en lugar de codificar 20;
- tomar el número de rollos del usuario en lugar de preguntar repetidamente si eso es suficiente;
- usar un bucle para hacer la repetición realmente funciona. El código que se repite automáticamente preguntando al usuario si debemos continuar ya no está.
Comentarios
- ¡Gracias! Esto es genial, voy a jugar con él para que continúe preguntándote si quieres tirar más dados, algunas cosas nuevas aquí que no he visto antes. ¿Me importa preguntar qué hace el _ en xrange (n)? Puedo discernir el resto.
- @lerugray Aquí ‘ s el documento sobre
xrange
. Solo lo uso para ejecutar el cuerpo del buclen
veces. - @lerugray, _ en haskell significa un nombre vacío (lo usa cuando debe proporcionar una variable que es inútil, como en este bucle). Supongo que tiene el mismo significado en Python.
- @Aleksandar Técnicamente, es ‘ un nombre completamente legítimo, por lo que puede ser utilizado dentro del bucle, pero entendiste bien la idea. No ‘ sabía que venía de Haskell (y no ‘ no conocía a Haskell), pero tiene mucho sentido.
Respuesta
No tengo mucho que decir sobre el estilo, lo cual es bueno. Creo que mi único El comentario real sería que personalmente encuentro el uso de caracteres de nueva línea más simple que las comillas triples para cadenas de varias líneas, especialmente cuando solo quieres asegurarte del espaciado entre líneas.
Me gusta que estés usando randint
para los rollos, en lugar de randrange
o alguna otra estructura: es inclusivo para inicio y parada, y eso coincide exactamente con el mundo real función que está recreando aquí, por lo que no es necesario modificar los parámetros o los resultados con +1.
En cuanto al diseño, dividiría las cosas del front-end, que toman la entrada de usuario y devuelve información, a partir de la tirada de dados real. Eso le permitiría reutilizar el rodillo de dados para otros fines (fuera del en la parte superior de mi cabeza, un generador de tesoros aleatorios), amplíe la lógica de la interfaz con tipos adicionales de funcionalidad, o reelabore su lógica sin destrozar toda la estructura.
Y mientras esté haciendo eso, piense más grande: «Necesito tirar un d20» es solo un caso de «Necesito lanzar algunos dados», y ese problema no es mucho más difícil de resolver. Así que aquí es cómo lo abordaría:
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)]
Una funcionalidad que probablemente querría agregar sería modificar roll_dice()
para aceptar un modificador (+ o – alguna cantidad). Y si realmente quieres ponerte elegante, puedes comenzar a verificar los resultados para resaltar 1 o 20, u otros resultados de tirada que tengan valores especiales en tu juego.
Deja una respuesta