ランダムD20番号ジェネレータ
On 2月 9, 2021 by adminZedShawを使用して自分でコードを教えています Pythonを学ぶハードウェイ 、そして暗記のレッスンの1つで退屈したので、RPGをプレイするときにランダムなD20番号ジェネレーターを作成することを考えました。
このコードを改善するにはどうすればよいですか?私がやっている愚かなことはありますか?
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)
最終的には、どの種類のサイコロを何個振るのかを尋ねる機能を追加したいと思います。 、しかし今のところ、私がこれまでに行ったことのレビューは本当に役に立ちます。
コメント
- たぶんこの回答にいくつかのものを組み込んでください: gamedev.stackexchange.com/questions/24656/ …
回答
これが私の見解です:
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)
あなたと比較した変更点バージョン:
-
randint
は、random
で使用する唯一の関数であるため、直接インポートします。 - 新しい文字列フォーマット方法を使用します(
str.format
); - 20をハードコーディングする代わりにユーザーから上限を取得します;
- それで十分かどうかを繰り返し尋ねるのではなく、ユーザーからロールの数を取得します。
- ループを使用して繰り返します実際に動作します。続行するかどうかをユーザーに尋ねる自己反復コードはなくなりました。
コメント
- ありがとうございます。これはかっこいいです、私はそれで遊んで、あなたがもっとサイコロを振るのかどうかあなたに尋ね続けるようにするつもりです、ここで私が前に見たことがないいくつかの新しいもの。 xrange(n)の_が何をするのか聞いてもいいですか?残りの部分を見分けることができます。
- @lerugrayここ'は、
xrange
。ループ本体をn
回実行するために使用します。 - @ lerugray、haskellの_は空の名前を意味します(変数を指定する必要がある場合に使用します)これは役に立たない-このループのように)。 Pythonでも同じ意味だと思います。
- @Aleksandar技術的には、'完全に正当な名前なので、できますループ内で使用されましたが、あなたは正しい考えを持っています。 'それがHaskellから来たものだとは知りませんでした(そして' Haskellを知りません)が、それは非常に理にかなっています。
回答
スタイルの面で言うことはあまりありませんが、それは良いことです。私だけだと思います。本当のコメントは、特に行間の間隔を確認したいだけの場合は、複数行の文字列に改行文字をトリプルクォートよりも簡単に使用できることを個人的に見つけたということです。
ivを使用しているのが好きですrandrange
またはその他の構造の代わりに、ロールのid = “04f05aa78e”>
:開始と停止が含まれ、実際の世界と完全に一致しますここで再作成している関数なので、パラメータや結果を+1で調整する必要はありません。
デザイン的には、フロントエンドのものを分割します。これは、ユーザーが実際のダイスローリングから情報を返します。これにより、ダイスローラーを他の目的に再利用できます(頭のてっぺん、ランダムな宝物ジェネレーター)、追加の種類の機能でインターフェースロジックを拡張するか、構造全体を分解せずにロジックを作り直します。
そして、それをしている限り、考えてみてください。より大きな-「d20を振る必要がある」は「サイコロを振る必要がある」という1つのケースにすぎず、その問題を解決するのはそれほど難しくありません。だから、これが私がそれにアプローチする方法です:
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)]
おそらく追加したい機能の1つは、roll_dice()
修飾子(+または-ある程度の量)を受け入れます。本当に凝ったものにしたい場合は、結果のチェックを開始して、1または20、またはゲームで特別な値を持つ他のロール結果を強調表示できます。
コメントを残す