Generátor náhodných čísel D20
On 9 února, 2021 by adminUčím se kód pomocí Zed Shaw Learn Python The Hard Way a během jedné z lekcí zapamatování jsem se nudil, takže jsem si myslel, že pro hraní RPGS vytvořím náhodný generátor čísel D20.
Jak mohu tento kód vylepšit? Dělám něco hloupého?
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)
Nakonec bych rád přidal funkcionalitu, abych se vás zeptal, jaký druh a kolik kostek chcete hrát , ale prozatím by mi opravdu pomohla recenze toho, co jsem zatím udělal.
Komentáře
- Možná do této odpovědi zahrnout některé věci. : gamedev.stackexchange.com/questions/24656/…
Odpověď
Tady je můj názor:
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)
Změny oproti vašim verze:
- přímo importuje
randint
, protože je to jediná funkce, kterou používáte vrandom
; - použít novou metodu formátování řetězce (
str.format
); - převezme od uživatele horní mez namísto pevného kódování 20;
- namísto opakovaného dotazování, zda to stačí, vezměte od uživatele počet rolí;
- opakujte opakováním skutečně fungovat. Samoobslužný kód, který uživatele žádá, zda bychom měli pokračovat, je nyní pryč.
Komentáře
- Děkujeme! To je skvělé, budu si s tím hrát, takže se vás bude i nadále ptát, jestli chcete házet více kostkami, nějaké nové věci, které jsem zde předtím neviděl. vadí mi, že se ptám, co dělá _ v xrange (n)? Zbytek dokážu trochu rozeznat.
- @lerugray Zde ‚ s dokumentem o
xrange
. Jen ho používám ke spuštění těla smyčkyn
krát. - @lerugray, _ in haskell znamená prázdné jméno (použijete ho, když musíte zadat proměnnou což je zbytečné – jako v této smyčce). Předpokládám, že má stejný význam v pythonu.
- @Aleksandar Technicky je ‚ plně legitimní, takže může být použitý uvnitř smyčky, ale máte nápad správně. Nevěděl jsem ‚, že to pochází od Haskella (a neznal jsem ‚ Haskella), ale dává to velký smysl.
Odpověď
Po stránce stylu nemám moc co říci, což je dobré. Myslím, že moje jediná skutečným komentářem by bylo, že osobně považuji použití znaků nového řádku za jednodušší než trojité uvozovky pro víceřádkové řetězce, zvláště když se chcete jen ujistit o mezerách mezi řádky.
Líbí se mi, že používáte randint
pro role, místo randrange
nebo jiné struktury: zahrnuje začátek a konec a přesně odpovídá skutečnému světu funkce, kterou zde znovu vytváříte, takže není třeba fušovat parametry ani výsledky pomocí +1.
Pokud jde o design, rozdělil bych front-end věci, které přebírají vstup z uživatele a dává zpět informace ze skutečného házení kostkami. To by vám umožnilo znovu použít kostkový válec pro jiné účely (mimo horní část mé hlavy, generátor náhodných pokladů), rozšířit logiku rozhraní o další druhy funkcí nebo přepracovat svoji logiku bez roztržení celé struktury.
A pokud to děláte, přemýšlejte větší – „Potřebuji hodit d20“ je jen jeden případ „Potřebuji hodit kostkou“ a ten problém není o moc těžší vyřešit. Tady je, jak bych k tomu přistoupil:
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)]
Jedna funkce, kterou byste pravděpodobně chtěli přidat, by byla úprava roll_dice()
přijmete modifikátor (+ nebo – nějaká částka). A pokud si opravdu chcete udělat představu, můžete začít kontrolovat výsledky, abyste zvýraznili 1s nebo 20s, nebo jiné výsledky hodu, které mají ve vaší hře speciální hodnoty.
Napsat komentář