Generatore di numeri D20 casuali
Su Febbraio 9, 2021 da adminSto insegnando a me stesso codice usando Zed Shaw “s Impara Python The Hard Way , e mi sono annoiato durante una delle lezioni di memorizzazione, quindi ho pensato di creare un generatore di numeri D20 casuale per quando gioco a giochi di ruolo.
Come posso migliorare questo codice? Cè qualcosa di stupido che sto facendo?
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)
Alla fine mi piacerebbe aggiungere funzionalità per farti chiedere che tipo e quanti dadi vuoi giocare , ma per ora una revisione di quello che ho fatto finora sarebbe davvero di aiuto.
Commenti
- Forse incorporare alcune delle cose in questa risposta : gamedev.stackexchange.com/questions/24656/…
Risposta
Ecco la mia opinione:
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)
Modifiche rispetto alle tue versione:
- importa direttamente
randint
perché “è lunica funzione che utilizzi inrandom
; - utilizza il nuovo metodo di formattazione delle stringhe (
str.format
); - prendi il limite superiore dallutente invece dellhard-coding 20;
- prendi il numero di tiri dellutente invece di chiedere ripetutamente se è sufficiente;
- usa un ciclo per fare la ripetizione funziona davvero. Il codice che si ripete automaticamente che chiede allutente se dobbiamo continuare ora non cè più.
Commenti
- Grazie! Questo è fantastico, ci giocherò così che continui a chiederti se vuoi tirare più dadi, alcune cose nuove qui che non ho mai visto prima. badate a chiedermi cosa fa _ in xrange (n)? Posso in qualche modo distinguere il resto.
- @lerugray Qui ‘ è il documento su
xrange
. Lo uso solo per eseguire il corpo del ciclon
volte. - @lerugray, _ in haskell significa un nome vuoto (lo usi quando devi fornire una variabile che è inutile – come in questo ciclo). Suppongo che abbia lo stesso significato in python.
- @Aleksandar Tecnicamente, ‘ è un nome completamente legittimo, quindi può essere utilizzato allinterno del ciclo, ma hai avuto lidea giusta. Non ‘ sapevo che provenisse da Haskell (e non ‘ non conoscevo Haskell), ma ha molto senso.
Risposta
Non ho molto da dire dal punto di vista dello stile, il che è positivo. Penso che il mio unico il vero commento sarebbe che personalmente trovo che luso di caratteri di nuova riga sia più semplice delle virgolette triple per stringhe multilinea, specialmente quando vuoi solo assicurarti della spaziatura tra le righe.
Mi piace che tu stia usando randint
per i rotoli, invece di randrange
o qualche altra struttura: è comprensivo di inizio e fine e corrisponde esattamente al mondo reale funzione che stai “ricreando qui, quindi non cè bisogno di confondere i parametri o i risultati con +1.
Dal punto di vista del design, dividerei le cose di front-end, che prendono linput dal utente e restituisce le informazioni dal lancio dei dadi. Ciò consentirebbe di riutilizzare il rullo dei dadi per altri scopi (fuori dal in cima alla mia testa, un generatore casuale di tesori), estendi la logica dellinterfaccia con ulteriori tipi di funzionalità o rielabora la tua logica senza rompere lintera struttura.
E finché lo fai, pensa più grande – “Devo tirare un d20” è solo un singolo caso di “Devo tirare dei dadi” e quel problema “non è molto più difficile da risolvere. Quindi ecco come lo approccerei:
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)]
Una funzionalità che probabilmente vorresti aggiungere sarebbe la modifica di roll_dice()
per accettare un modificatore (+ o – una certa quantità). E se vuoi davvero essere fantasioso, puoi iniziare a controllare i risultati per evidenziare 1 o 20, o altri risultati del tiro che hanno valori speciali nel tuo gioco.
Lascia un commento