Tilfældig D20-talgenerator
On februar 9, 2021 by adminJeg lærer mig selv kode ved hjælp af Zed Shaw “s Lær Python Den hårde vej , og jeg keder mig under en af huskelektionerne, så jeg troede, jeg ville lave en tilfældig D20-talgenerator, når jeg spiller RPGS.
Hvordan kan jeg gøre denne kode bedre? Er der noget dumt, jeg laver?
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)
Til sidst vil jeg meget gerne tilføje funktionalitet for at få det til at spørge dig, hvilken slags og hvor mange terninger du vil spille , men indtil videre vil en gennemgang af, hvad jeg har gjort indtil videre, virkelig hjælpe.
Kommentarer
- Måske indarbejde nogle af tingene i dette svar : gamedev.stackexchange.com/questions/24656/…
Svar
Her er min optagelse:
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)
Ændringer i forhold til din version:
- importerer direkte
randint
fordi det er den eneste funktion, du bruger irandom
; - brug den nye strengformateringsmetode (
str.format
); - tag den øvre grænse fra brugeren i stedet for hårdkodende 20;
- tag antallet af ruller fra brugeren i stedet for gentagne gange at spørge, om det er nok;
- brug en løkke til at foretage gentagelsen faktisk fungerer. Den selv gentagende kode, der spørger brugeren, om vi skal fortsætte, er nu væk.
Kommentarer
- Tak! Dette er sejt, jeg vil lege med det, så det fortsætter med at spørge dig, om du vil kaste flere terninger, nogle nye ting her har jeg ikke set før. husk mig at spørge hvad _ i xrange (n) gør? Jeg kan slags skelne resten.
- @lerugray Her er ‘ dokumentet på
xrange
. Jeg bruger det bare til at køre sløjfekroppenn
gange. - @lerugray, _ i haskell betyder et tomt navn (du bruger det, når du skal levere en variabel hvilket er ubrugeligt – som i denne løkke). Jeg antager, at det har den samme betydning i python.
- @Aleksandar Teknisk set er det ‘ et fuldt legit navn, så det kan være brugt inde i sløjfen, men du fik ideen rigtig. Jeg vidste ikke ‘ at det kom fra Haskell (og ikke ‘ kendte ikke Haskell), men det giver meget mening.
Svar
Jeg har ikke meget at sige på stil-siden, hvilket er godt. Jeg tror min eneste rigtig kommentar ville være, at jeg personligt finder det lettere at bruge nye linjetegn end tredobbelte citater til flerlinjede strenge, især når du bare vil være sikker på afstanden mellem linjer.
Jeg kan godt lide, at du bruger randint
til ruller i stedet for randrange
eller en anden struktur: det er inkluderet til start og stop, og det matcher nøjagtigt den virkelige verden funktion, som du genskaber her, så der er ikke behov for at fudge parametrene eller resultaterne med +1.
Designmæssigt vil jeg opdele frontend-tingene, som tager input fra bruger og giver tilbage information fra den egentlige terningkast. Det giver dig mulighed for at genbruge terningrullen til andre formål (uden for øverst på mit hoved, en tilfældig skattegenerator), udvid interface-logikken med yderligere former for funktionalitet, eller omarbejd din logik uden at rive hele strukturen fra hinanden.
Og så længe du gør det, tænk større – “Jeg har brug for at rulle en d20” er kun et enkelt tilfælde af “Jeg har brug for at kaste nogle terninger”, og det problem er ikke meget sværere at løse. Så her er hvordan jeg ville nærme mig det:
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)]
En funktion, som du sandsynligvis vil tilføje, ville være at ændre roll_dice()
for at acceptere en modifikator (+ eller – et beløb). Og hvis du virkelig vil have lyst, kan du begynde at kontrollere resultaterne for at fremhæve 1ere eller 20ere eller andre rulleresultater, der har specielle værdier i dit spil.
Skriv et svar