Willekeurige D20-nummergenerator
Geplaatst op februari 9, 2021 door adminIk leer mezelf code met behulp van Zed Shaw “s Python leren The Hard Way , en ik verveelde me tijdens een van de lessen uit het hoofd leren, dus ik dacht dat ik een willekeurige D20-nummergenerator zou maken voor als ik RPGS speel.
Hoe kan ik deze code verbeteren? Is er iets stoms dat ik aan het doen ben?
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)
Uiteindelijk zou ik graag functionaliteit willen toevoegen om je te vragen wat voor soort en hoeveel dobbelstenen je wilt spelen , maar voor nu zou een overzicht van wat ik tot dusver heb gedaan echt helpen.
Opmerkingen
- Misschien kunt u een aantal dingen in dit antwoord opnemen : gamedev.stackexchange.com/questions/24656/…
Antwoord
Hier is mijn mening:
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)
Veranderingen in vergelijking met uw version:
- importeer direct
randint
omdat het de enige functie is die je gebruikt inrandom
; - gebruik de nieuwe opmaakmethode voor tekenreeksen (
str.format
); - neem de bovengrens van de gebruiker in plaats van hardcodering 20;
- neem het aantal worpen van de gebruiker in plaats van herhaaldelijk te vragen of dat genoeg is;
- gebruik een lus om de herhaling te maken echt werken. De zichzelf herhalende code die de gebruiker vraagt of we door moeten gaan, is nu verdwenen.
Reacties
- Bedankt! Dit is cool, ik ga ermee spelen zodat het je blijft vragen of je meer dobbelstenen wilt gooien, wat nieuwe dingen hier heb ik nog niet eerder gezien. let op me te vragen wat de _ in xrange (n) doet? Ik kan de rest een beetje onderscheiden.
- @lerugray Hier ‘ is het document op
xrange
. Ik gebruik het gewoon om de loop bodyn
keer uit te voeren. - @lerugray, _ in haskell betekent een lege naam (je gebruikt het wanneer je een variabele moet opgeven wat nutteloos is – zoals in deze lus). Ik veronderstel dat het dezelfde betekenis heeft in python.
- @Aleksandar Technisch gezien is het ‘ een volledig legitieme naam, dus het kan zijn gebruikt in de lus, maar je hebt het idee goed. Ik wist niet ‘ dat het van Haskell kwam (en ‘ ken Haskell niet), maar het is logisch.
Antwoord
Ik heb niet veel te zeggen over de stijlkant, wat goed is. Ik denk dat mijn enige echte opmerking zou zijn dat ik persoonlijk het gebruik van nieuwe-regel-tekens eenvoudiger vind dan drievoudige aanhalingstekens voor strings met meerdere regels, vooral als je alleen zeker wilt zijn van de afstand tussen regels.
Ik vind het leuk dat je randint
voor de worpen, in plaats van randrange
of een andere structuur: het is inclusief voor start en stop, en dat komt exact overeen met de echte wereld functie die u hier opnieuw aan het maken bent, dus het is niet nodig om de parameters of de resultaten met +1 te fudgen.
Qua ontwerp zou ik het front-end-materiaal splitsen, wat input van de gebruiker en geeft informatie terug, van het feitelijke dobbelstenen rollen. Op die manier kunt u de dobbelsteenrol opnieuw gebruiken voor andere doeleinden (buiten de top van mijn hoofd, een willekeurige schatgenerator), breid de interfacelogica uit met extra soorten functionaliteit, of herwerk je logica zonder de hele structuur uit elkaar te halen.
En zolang je dat doet, denk dan groter – “Ik moet een d20 gooien” is slechts een enkel geval van “Ik moet een paar dobbelstenen gooien”, en dat probleem “is niet veel moeilijker op te lossen. Dus hier is hoe ik het zou benaderen:
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)]
Een functionaliteit die je waarschijnlijk zou willen toevoegen is het wijzigen van roll_dice()
om een modifier te accepteren (+ of – een bepaald bedrag). En als je echt zin wilt krijgen, kun je beginnen met het controleren van de resultaten om 1s of 20s te markeren, of andere worpresultaten met speciale waarden in je spel.
Geef een reactie