简单的骰子掷骰程序问题

0 投票
2 回答
4496 浏览
提问于 2025-04-18 00:52

我写了一个程序,用户可以选择一个特定面数的骰子,然后程序会掷骰子并输出生成的数字。接着,它会问用户是否想再掷一次,并通过一个循环来实现这个功能。我已经写好了程序,但不知为什么它一直重复询问用户选择骰子面数的提示,我搞不明白原因。以下是我的代码:

import random

roll_agn='yes'
    while roll_agn=='yes':
        dice=input ('Please choose a 4, 6 or 12 sided dice: ')
        if dice ==4:
                print(random.randint(1,4))
        elif dice ==6:
                print(random.randint(1,6))
        elif dice ==12:
                print(random.randint(1,12))
    else:
        roll_agn=input('that is not 4, 6 or 12, would you like to choose again, please answer yes or no') 
    if roll_agn !='yes':
        print ('ok thanks for playing')

我怀疑这可能和循环或者缩进有关,但我已经折腾了大约30分钟,还是没法让它正常工作。如果有人能帮我一下,我会非常感激,谢谢!

2 个回答

1

看起来你在if语句的缩进上有问题。试着把elif和if对齐。

if dice ==4:
    print(random.randint(1,4))
elif dice ==6:
    print(random.randint(1,6))
elif dice ==12:
    print(random.randint(1,12))
2

在这段代码中,else: roll_agn=input 的缩进方式让它只会在你退出 while 循环后才执行。但是,while 循环永远不会结束,除非你运行 else 里的内容,所以就形成了一个无限循环。

下面是一个整理过、结构更清晰的版本:

# assumes Python 3.x
from random import randint

def get_int(prompt):
    while True:
        try:
            return int(input(prompt))         # if Python 2.x use raw_input instead of input
        except ValueError:
            # not an int
            pass

def get_yn(prompt):
    while True:
        value = input(prompt).strip().lower() # if Python 2.x use raw_input instead of input
        if value in {'y', 'yes'}:
            return True
        elif value in {'n', 'no'}:
            return False

def roll(sides):
    return randint(1, sides)

def main():
    while True:
        sides = get_int("Number of sides on die (4, 6, or 12)? ")

        if sides in {4, 6, 12}:
            print("You rolled a {}".format(roll(sides)))
        else:
            print("U no reed gud?")

        if not get_yn("Play again (y/n)? "):
            print("Thanks for playing!")
            break

if __name__=="__main__":
    main()

撰写回答