Generator liczb losowych D20
On 9 lutego, 2021 by adminUczę się kodowania za pomocą Naucz się języka Python The Hard Way i znudziło mi się podczas jednej z lekcji zapamiętywania, więc pomyślałem, że stworzę generator liczb losowych D20 do gry w RPGS.
Jak mogę ulepszyć ten kod? Czy jest coś głupiego, co robię?
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)
W końcu chciałbym dodać funkcjonalność, aby zapytała Cię, jakiego rodzaju i ile kości chcesz odgrywać , ale na razie przegląd tego, co zrobiłem do tej pory, byłby naprawdę pomocny.
Komentarze
- Być może uwzględnij niektóre elementy w tej odpowiedzi : gamedev.stackexchange.com/questions/24656/…
Odpowiedź
Oto moja opinia:
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)
Zmiany w porównaniu z wersja:
- bezpośrednio importuj
randint
, ponieważ jest to jedyna funkcja, której używasz wrandom
; - użyj nowej metody formatowania napisów (
str.format
); - weź górną granicę od użytkownika zamiast zakodowania 20;
- weź liczbę rzutów od użytkownika, zamiast wielokrotnie pytać, czy to wystarczy;
- użyj pętli, aby powtórzyć faktycznie działa. Zniknął samoczynnie powtarzający się kod pytający użytkownika, czy powinniśmy kontynuować.
Komentarze
- Dziękuję! To jest fajne, będę się tym bawić, aby nadal pytał cię, czy chcesz rzucić więcej kości, jest tu kilka nowych rzeczy, których wcześniej nie widziałem. proszę mnie zapytać, co robi _ in xrange (n)? Mogę trochę rozróżnić resztę.
- @lerugray Tutaj ' s dokument na . Po prostu używam go do uruchamiania treści pętli
n
razy. - @lerugray, _ w haskell oznacza pustą nazwę (używasz jej, gdy musisz podać zmienną co jest bezużyteczne – jak w tej pętli). Przypuszczam, że ma to samo znaczenie w Pythonie.
- @Aleksandar Z technicznego punktu widzenia ' jest w pełni legalną nazwą, więc można używany wewnątrz pętli, ale masz rację. Nie ' nie wiedziałem, że pochodzi od Haskella (i nie ' nie znałem Haskella), ale ma to dużo sensu.
Odpowiedź
Nie mam wiele do powiedzenia na temat stylu, co jest dobre. Myślę, że mój jedyny prawdziwy komentarz byłby taki, że osobiście uważam, że używanie znaków nowej linii jest prostsze niż potrójne cudzysłowy dla łańcuchów wielowierszowych, zwłaszcza gdy chcesz tylko upewnić się, że są odstępy między wierszami.
Podoba mi się, że używasz randint
dla rolek, zamiast randrange
lub jakiejś innej struktury: obejmuje start i stop i dokładnie odpowiada rzeczywistości funkcji, którą tutaj „odtwarzasz”, więc nie ma potrzeby mieszania parametrów lub wyników za pomocą +1.
Jeśli chodzi o projekt, podzieliłbym część front-end, która pobiera dane wejściowe z użytkownika i przekazuje informacje z rzeczywistego rzutu kośćmi. Pozwoliłoby ci to ponownie wykorzystać rzutek do innych celów (poza na czele, losowy generator skarbów), rozszerzyć logikę interfejsu o dodatkowe rodzaje funkcjonalności lub przerobić logikę bez rozrywania całej struktury.
I dopóki to robisz, myśl większy – „Muszę rzucić k20” to tylko pojedynczy przypadek „Muszę rzucić kostką”, a ten problem nie jest dużo trudniejszy do rozwiązania. Oto jak bym do tego podszedł:
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)]
Jedną z funkcji, którą prawdopodobnie chciałbyś dodać, byłaby modyfikacja roll_dice()
, aby zaakceptować modyfikator (+ lub – jakąś kwotę). A jeśli naprawdę chcesz się spodobać, możesz zacząć sprawdzać wyniki, aby podświetlić 1 lub 20 lub inne wyniki rzutów, które mają specjalne wartości w twojej grze.
Dodaj komentarz