Zufälliger D20-Zahlengenerator
On Februar 9, 2021 by adminIch unterrichte mich selbst mit Zed Shaws Python lernen The Hard Way , und ich langweilte mich während einer der Memorisierungsstunden, sodass ich dachte, ich würde einen zufälligen D20-Zahlengenerator erstellen, wenn ich RPGS spiele.
Wie kann ich diesen Code verbessern? Gibt es etwas Dummes, das ich tue?
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)
Irgendwann würde ich gerne Funktionen hinzufügen, damit Sie gefragt werden, welche Art und wie viele Würfel Sie rollen möchten , aber im Moment würde eine Überprüfung dessen, was ich bisher getan habe, wirklich helfen.
Kommentare
- Vielleicht nehmen Sie einige der Dinge in diese Antwort auf : gamedev.stackexchange.com/questions/24656/…
Antwort
Hier ist meine Meinung:
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)
Änderungen im Vergleich zu Ihrer Version:
-
randint
direkt importieren, da dies die einzige Funktion ist, die Sie inrandom
;- Verwenden Sie die neue Formatierungsmethode für Zeichenfolgen (
str.format
).- Übernehmen Sie die Obergrenze vom Benutzer, anstatt 20;
- Nehmen Sie die Anzahl der Rollen vom Benutzer, anstatt wiederholt zu fragen, ob dies ausreicht.
- Verwenden Sie eine Schleife, um die Wiederholung durchzuführen tatsächlich arbeiten. Der sich selbst wiederholende Code, der den Benutzer fragt, ob wir fortfahren sollen, ist jetzt weg.
- Verwenden Sie die neue Formatierungsmethode für Zeichenfolgen (
Kommentare
- Vielen Dank! Das ist cool, ich werde damit herumspielen, damit es dich weiterhin fragt, ob du mehr Würfel würfeln willst, einige neue Sachen hier, die ich noch nie gesehen habe. Stört es mich zu fragen, was das _ in xrange (n) macht? Ich kann den Rest irgendwie erkennen.
- @lerugray Hier ‚ ist das Dokument auf
xrange
. Ich verwende es nur, um den Schleifenkörpern
mal auszuführen. - @lerugray, _ in haskell bedeutet einen leeren Namen (Sie verwenden ihn, wenn Sie eine Variable angeben müssen was nutzlos ist – wie in dieser Schleife). Ich nehme an, es hat die gleiche Bedeutung in Python.
- @Aleksandar Technisch gesehen ist ‚ ein völlig legitimer Name, also kann es sein innerhalb der Schleife verwendet, aber Sie haben die Idee richtig. Ich wusste nicht, dass ‚ es von Haskell stammt (und ‚ Haskell nicht kennt), aber es macht sehr viel Sinn.
Antwort
Ich habe auf der Stilseite nicht viel zu sagen, was gut ist. Ich denke, meine einzige Ein echter Kommentar wäre, dass ich persönlich die Verwendung von Zeilenumbrüchen einfacher finde als dreifache Anführungszeichen für mehrzeilige Zeichenfolgen, insbesondere wenn Sie nur den Abstand zwischen den Zeilen sicherstellen möchten.
Ich mag es, dass Sie randint
für die Rollen anstelle von randrange
oder einer anderen Struktur: Es ist inklusive für Start und Stopp, und das passt genau zur realen Welt Funktion, die Sie hier neu erstellen, sodass Sie die Parameter oder Ergebnisse nicht mit +1 verfälschen müssen.
In Bezug auf das Design würde ich das Front-End-Material aufteilen, das Eingaben von der Benutzer und gibt Informationen aus dem tatsächlichen Würfeln zurück. Dadurch können Sie die Würfelrolle für andere Zwecke wiederverwenden (aus dem Erweitern Sie die Schnittstellenlogik um zusätzliche Funktionen oder überarbeiten Sie Ihre Logik, ohne die gesamte Struktur auseinander zu reißen.
Und solange Sie das tun, denken Sie nach größer – „Ich muss einen W20 würfeln“ ist nur ein einziger Fall von „Ich muss ein paar Würfel werfen“, und dieses Problem ist nicht viel schwieriger zu lösen. So würde ich es angehen:
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)]
Eine Funktion, die Sie wahrscheinlich hinzufügen möchten, ist das Ändern von roll_dice()
, um einen Modifikator (+ oder – einen gewissen Betrag) zu akzeptieren. Und wenn Sie wirklich Lust haben möchten, können Sie die Ergebnisse überprüfen, um 1s oder 20s oder andere Würfelergebnisse hervorzuheben, die spezielle Werte in Ihrem Spiel haben.
Schreibe einen Kommentar