Générateur de nombres aléatoires D20
On février 9, 2021 by adminJe « m apprends le code en utilisant Zed Shaw » s Apprenez Python The Hard Way , et je me suis ennuyé pendant lune des leçons de mémorisation, alors jai pensé que je ferais un générateur de nombres D20 aléatoires lorsque je jouerais au RPGS.
Comment puis-je améliorer ce code? Y a-t-il quelque chose de stupide que je « fais?
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)
Finalement, jaimerais ajouter des fonctionnalités pour quil vous demande quel type et combien de dés vous voulez jouer , mais pour linstant, un examen de ce que jai fait jusquà présent serait vraiment utile.
Commentaires
- Peut-être incorporer certains éléments dans cette réponse : gamedev.stackexchange.com/questions/24656/…
Réponse
Voici ma prise:
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)
Modifications par rapport à votre version:
- importer directement
randint
car cest la seule fonction que vous utilisez dansrandom
; - utilise la nouvelle méthode de formatage de chaîne (
str.format
); - prend la limite supérieure de lutilisateur au lieu du codage en dur 20;
- prenez le nombre de lancers de lutilisateur au lieu de demander à plusieurs reprises si cela « suffit;
- utilisez une boucle pour faire la répétition fonctionne réellement. Le code auto-répété demandant à lutilisateur si nous devons continuer a maintenant disparu.
Commentaires
- Merci! Cest cool, je vais jouer avec pour quil continue à vous demander si vous voulez lancer plus de dés, des nouveautés ici que je nai jamais vues auparavant. me demande ce que fait le _ dans xrange (n)? Je peux en quelque sorte discerner le reste.
- @lerugray Ici ‘ est la doc sur
xrange
. Je lutilise juste pour exécuter le corps de la bouclen
fois. - @lerugray, _ dans haskell signifie un nom vide (vous lutilisez lorsque vous devez fournir une variable ce qui est inutile – comme dans cette boucle). Je suppose quil a la même signification en python.
- @Aleksandar Techniquement, ‘ est un nom entièrement légitime, donc il peut être utilisé à lintérieur de la boucle, mais vous avez bien compris. Je ne savais ‘ que cela venait de Haskell (et je ne ‘ pas Haskell), mais cela a beaucoup de sens.
Réponse
Je nai pas grand chose à dire sur le style, ce qui est bien. Je pense que mon seul Le vrai commentaire serait que personnellement, je trouve que lutilisation de caractères de retour à la ligne est plus simple que les guillemets triples pour les chaînes multilignes, en particulier lorsque vous voulez simplement vous assurer de lespacement entre les lignes.
Jaime que vous utilisiez randint
pour les rouleaux, au lieu de randrange
ou dune autre structure: cest inclus pour le démarrage et larrêt, et cela correspond exactement au monde réel fonction que vous « recréez ici », il nest donc pas nécessaire de truquer les paramètres ou les résultats avec +1.
Du point de vue de la conception, je diviserais les éléments frontaux, ce qui prend les entrées du lutilisateur et donne des informations, à partir du lancer de dés. Cela vous permettrait de réutiliser le lanceur de dés à en haut de ma tête, un générateur de trésors aléatoires), étendez la logique de l’interface avec d’autres types de fonctionnalités, ou retravaillez votre logique sans déchirer toute la structure.
Et tant que vous le faites, pensez plus gros – « Jai besoin de lancer un d20 » est juste un cas unique de « Jai besoin de lancer des dés », et ce problème « nest pas beaucoup plus difficile à résoudre. Voici donc comment je laborderais:
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)]
Une fonctionnalité que vous voudriez probablement ajouter serait de modifier roll_dice()
pour accepter un modificateur (+ ou – un certain montant). Et si vous voulez vraiment avoir de la fantaisie, vous pouvez commencer à vérifier les résultats pour mettre en évidence 1s ou 20s, ou dautres résultats de jet qui ont des valeurs spéciales dans votre jeu.
Laisser un commentaire