Slumpmässig D20-talgenerator
On februari 9, 2021 by adminJag lär mig kod med Zed Shaw ”s Lär dig Python The Hard Way , och jag blev uttråkad under en av memoreringslektionerna så jag trodde att jag skulle göra en slumpmässig D20-talgenerator för när jag spelar RPGS.
Hur kan jag göra den här koden bättre? Finns det något dumt jag gö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)
Så småningom skulle jag gärna vilja lägga till funktionalitet för att få den att fråga dig vilken typ och hur många tärningar du vill spela , men för tillfället skulle en recension av vad jag har gjort hittills verkligen hjälpa.
Kommentarer
- Kanske införliva några av grejerna i det här svaret : gamedev.stackexchange.com/questions/24656/…
Svar
Här är mitt tag:
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)
Ändringar jämfört med din version:
- importerar direkt
randint
eftersom det är den enda funktionen du använder irandom
; - använd den nya strängformateringsmetoden (
str.format
); - ta den övre gränsen från användaren istället för hårdkodande 20;
- ta antalet rullar från användaren istället för att upprepade gånger fråga om det räcker;
- använd en slinga för att göra repetitionen faktiskt fungerar. Den självupprepande koden som frågar användaren om vi ska fortsätta är nu borta.
Kommentarer
- Tack! Det här är coolt, jag kommer att leka med det så att det fortsätter att fråga dig om du vill kasta fler tärningar, några nya saker här har jag inte sett tidigare. tänk på att jag frågar vad _ i xrange (n) gör? Jag kan på något sätt urskilja resten.
- @lerugray Här ’ är dokumentet på
xrange
. Jag använder den bara för att köra loopkroppenn
gånger. - @lerugray, _ i haskell betyder ett tomt namn (du använder det när du måste ange en variabel vilket är värdelöst – som i den här slingan). Jag antar att det har samma betydelse i python.
- @Aleksandar Tekniskt sett är det ’ ett helt legitimt namn, så det kan vara används inuti slingan, men du fick idén rätt. Jag visste inte ’ att den kom från Haskell (och inte ’ visste inte Haskell), men det är mycket vettigt.
Svar
Jag har inte mycket att säga på stil-sidan, vilket är bra. Jag tror att min enda verklig kommentar skulle vara att jag personligen tycker att det är enklare att använda newline-tecken än trippelcitat för flerlinjiga strängar, speciellt när du bara vill se till att det finns ett avstånd mellan raderna.
Jag gillar att du använder randint
för rullarna, istället för randrange
eller någon annan struktur: det är inkluderat för start och stopp, och det matchar exakt den verkliga världen funktion som du återskapar här, så det finns ingen anledning att fudga parametrarna eller resultaten med +1.
Designmässigt delar jag frontend-grejerna, som tar inmatning från användaren och ger tillbaka information från den faktiska tärningen. Då kan du återanvända tärningsrullen för andra ändamål (utanför högst upp i mitt huvud, en slumpmässig skattgenerator), förläng gränssnittslogiken med ytterligare funktioner, eller bearbeta din logik utan att riva ihop hela strukturen.
Och så länge du gör det, tänk större – ”Jag behöver rulla en d20” är bara ett enda fall av ”Jag behöver kasta tärningar”, och det problemet är inte mycket svårare att lösa. Så här är hur jag skulle närma 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 förmodligen skulle vilja lägga till skulle vara att ändra roll_dice()
för att acceptera en modifierare (+ eller – något belopp). Och om du verkligen vill bli snäll kan du börja kontrollera resultaten för att markera 1 eller 20, eller andra rullresultat som har speciella värden i ditt spel.
Lämna ett svar