Tilfeldig D20-talgenerator
On februar 9, 2021 by adminJeg lærer meg selv kode ved hjelp av Zed Shaw «s Lær Python The Hard Way , og jeg kjedet meg under en av memoriseringstimene, så jeg trodde jeg skulle lage en tilfeldig D20-tallgenerator for når jeg spiller RPGS.
Hvordan kan jeg gjøre denne koden bedre? Er det noe dumt jeg gjør?
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 slutt vil jeg gjerne legge til funksjonalitet for å få det til å spørre deg om hva slags og hvor mange terninger du vil spille , men foreløpig vil en gjennomgang av hva jeg har gjort så langt virkelig hjelpe.
Kommentarer
- Kanskje innlemme noen av tingene i dette svaret : gamedev.stackexchange.com/questions/24656/…
Svar
Her tar jeg:
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)
Endringer i forhold til versjon:
- importerer direkte
randint
fordi det er den eneste funksjonen du bruker irandom
; - bruk den nye strengformateringsmetoden (
str.format
); - ta den øvre grensen fra brukeren i stedet for hardkodende 20;
- ta antall ruller fra bruker i stedet for gjentatte ganger å spørre om det er nok;
- bruk en løkke for å gjøre repetisjonen faktisk fungerer. Den selv-repeterende koden som spør brukeren om vi skal fortsette, er nå borte.
Kommentarer
- Takk! Dette er kult, jeg skal leke med det slik at det fortsetter å spørre deg om du vil kaste flere terninger, noen nye ting her har jeg ikke sett før. tenk at jeg spør hva _ i xrange (n) gjør? Jeg kan liksom skille resten.
- @lerugray Her er ‘ dokumentet på
xrange
. Jeg bruker den bare til å kjøre sløyfekroppenn
ganger. - @lerugray, _ i haskell betyr et tomt navn (du bruker det når du må oppgi en variabel som er ubrukelig – som i denne sløyfen). Jeg antar at den har samme betydning i python.
- @Aleksandar Teknisk sett er det ‘ et helt legitimt navn, så det kan være brukt inne i løkken, men du fikk ideen riktig. Jeg visste ikke ‘ at det kom fra Haskell (og ikke ‘ t kjente Haskell), men det gir mye mening.
Svar
Jeg har ikke mye å si på stil-siden, noe som er bra. Jeg tror min eneste ekte kommentar ville være at jeg personlig synes det er enklere å bruke newline-tegn enn trippel-anførselstegn for flerlinjede strenger, spesielt når du bare vil være sikker på avstanden mellom linjene.
Jeg liker at du bruker randint
for rullene, i stedet for randrange
eller annen struktur: den er inkludert for start og stopp, og det samsvarer nøyaktig med den virkelige verden funksjon som du gjenskaper her, så det er ikke nødvendig å fudge parametrene eller resultatene med +1.
Designmessig deler jeg frontend-tingene, som tar innspill fra brukeren og gir tilbake informasjon fra selve terningkastet. Dermed kan du bruke terningvalsen til andre formål (utenfor øverst på hodet mitt, en tilfeldig skattegenerator), utvid grensesnittlogikken med ekstra funksjonalitet, eller bearbeid logikken din uten å rive hele strukturen fra hverandre.
Og så lenge du gjør det, tenk større – «Jeg trenger å kaste en d20» er bare et enkelt tilfelle av «Jeg trenger å kaste noen terninger», og det problemet er ikke mye vanskeligere å løse. Så her vil jeg nærme meg 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 funksjonalitet du sannsynligvis vil legge til, er å endre roll_dice()
for å godta en modifikator (+ eller – noe beløp). Og hvis du virkelig vil bli fancy, kan du begynne å sjekke resultatene for å markere 1s eller 20s, eller andre rulleresultater som har spesielle verdier i spillet ditt.
Legg igjen en kommentar