Generator de numere aleatorii D20
On februarie 9, 2021 by adminÎmi învăț cod folosind Zed Shaw „s Learn Python The Hard Way și m-am plictisit în timpul uneia dintre lecțiile de memorare, așa că m-am gândit să fac un generator de numere D20 aleatoriu pentru când joc RPGS.
Cum pot îmbunătăți acest cod? Există ceva stupid pe care îl fac?
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)
În cele din urmă mi-ar plăcea să adaug funcționalități pentru a vă întreba ce fel și câte zaruri doriți să jucați , dar, deocamdată, o revizuire a ceea ce am făcut până acum ar fi cu adevărat de ajutor.
Comentarii
- Poate încorpora unele lucruri în acest răspuns : gamedev.stackexchange.com/questions/24656/…
Răspuns
Aici este ideea mea:
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)
Modificări în comparație cu versiune:
- importați direct
randint
deoarece este singura funcție pe care o utilizați înrandom
; - utilizați noua metodă de formatare a șirurilor (
str.format
); - luați limita superioară de la utilizator în loc de codul dur 20;
- luați numărul de rulouri de la utilizator în loc să întrebați în mod repetat dacă este suficient;
- folosiți o buclă pentru a face repetarea de fapt funcționează. Codul care se repetă automat, care îi cere utilizatorului dacă ar trebui să continuăm, a dispărut.
Comentarii
- Vă mulțumim! Este grozav, mă voi juca cu el, astfel încât să te întrebe în continuare dacă vrei să arunci mai multe zaruri, unele lucruri noi aici nu le-am mai văzut până acum. să mă întreb ce face _ în xrange (n)? Pot discerne restul.
- @lerugray Aici ‘ este documentul de pe . Îl folosesc doar pentru a rula corpul buclei
n
ori. - @lerugray, _ în haskell înseamnă un nume gol (îl folosiți atunci când trebuie să furnizați o variabilă care este inutil – ca în această buclă). Presupun că are același sens în python.
- @Aleksandar Din punct de vedere tehnic, este ‘ un nume pe deplin legitim, deci poate folosit în buclă, dar ai reușit ideea. Nu ‘ nu știam că provine de la Haskell (și nu ‘ nu știam Haskell), dar are mult sens.
Răspuns
Nu am multe de spus în ceea ce privește stilul, ceea ce este bine. Cred că singurul meu comentariul real ar fi că, personal, consider că utilizarea caracterelor newline este mai simplă decât ghilimelele triple pentru șirurile cu mai multe linii, mai ales când doriți doar să vă asigurați de spațiul dintre linii.
Îmi place că folosiți randint
pentru rulouri, în loc de randrange
sau altă structură: este inclus pentru pornire și oprire și care se potrivește exact cu lumea reală funcție pe care o recreezi aici, deci nu este nevoie să fudgeți parametrii sau rezultatele cu +1.
Din punct de vedere al proiectării, aș împărți elementele front-end, care iau de la intrare Utilizatorului și redă informații, de la lansarea efectivă a zarurilor. Acest lucru vă va permite să refolosiți rolul de zaruri în alte scopuri (în afara partea de sus a capului meu, un generator de comori aleatorii), extindeți logica interfeței cu tipuri suplimentare de funcționalități sau refaceți logica fără a rupe întreaga structură.
Și atâta timp cât faceți asta, gândiți-vă mai mare – „I need to roll a d20” este doar un singur caz de „I need to roll some dice”, iar acea problemă nu este mult mai greu de rezolvat. Deci, iată cum aș aborda-o:
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)]
O funcționalitate pe care probabil ați dori să o adăugați ar fi modificarea roll_dice()
să accepți un modificator (+ sau – o anumită sumă). Și dacă vrei cu adevărat să devii fantezist, poți începe să verifici rezultatele pentru a evidenția 1s sau 20s, sau alte rezultate de rulare care au valori speciale în jocul tău.
Lasă un răspuns