임의 D20 숫자 생성기
On 2월 9, 2021 by admin저는 Zed Shaw의 배우기 Python을 사용하여 코드를 직접 가르치고 있습니다. 어려운 길 , 암기 레슨 중 하나가 지루해서 RPGS를 할 때 임의의 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의 _는 빈 이름을 의미합니다 (변수를 제공해야 할 때 사용합니다. 쓸모가 없습니다-이 루프처럼). 파이썬에서도 같은 의미를 가지고 있다고 생각합니다.
- @Aleksandar 기술적으로는 ' 완전히 합법적 인 이름이므로 할 수 있습니다 루프 내부에서 사용되었지만 올바른 아이디어를 얻었습니다. 저는 ' 그것이 Haskell에서 온 것인지 몰랐지만 (그리고 Haskell을 몰랐습니다 ') 많은 의미가 있습니다.
li>
답변
스타일 측면에 대해서는 할 말이별로 없습니다. 실제 의견은 여러 줄 문자열에 대해 삼중 따옴표보다 줄 바꿈 문자를 사용하는 것이 개인적으로 더 간단하다는 것입니다. 특히 줄 사이의 간격을 확인하고 싶을 때 더욱 그렇습니다.
iv를 사용하는 것이 좋습니다. 롤의 경우 randrange
또는 기타 구조 대신 id = “04f05aa78e”>
: 시작 및 중지가 포함되며 실제와 정확히 일치합니다. 여기에서 다시 만들고있는 함수이므로 매개 변수 나 결과를 +1로 퍼지 할 필요가 없습니다.
디자인 측면에서는 프런트 엔드 항목을 분할하여 사용자가 실제 주사위 굴림에서 얻은 정보를 다시 제공합니다. 그러면 주사위 롤러를 다른 용도로 재사용 할 수 있습니다. 임의의 보물 생성기), 추가 기능으로 인터페이스 로직을 확장하거나 전체 구조를 분리하지 않고 로직을 재 작업하십시오.
그렇게하는 한 생각해보십시오. 더 크게- “I need to roll a d20″은 “I need to roll some dice”의 단 하나의 경우에 불과하며 그 문제는 해결하기가 그리 어렵지 않습니다. 이에 접근하는 방법은 다음과 같습니다.
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)]
추가하고 싶은 기능 중 하나는 roll_dice()
를 사용하여 수정 자 (+ 또는-약간)를 허용합니다. 정말 멋지게 만들고 싶다면 결과 확인을 시작하여 1, 20 또는 게임에 특별한 값이있는 다른 롤 결과를 강조 표시 할 수 있습니다.
답글 남기기