如何用Python优化桌游骰子工具:支持任意次数投掷并正确求和
优化后的骰子投掷工具实现
针对你目前的代码重复问题和功能需求,这里提供一个更简洁、可扩展的实现方案,能支持任意次数的投掷,轻松新增骰子类型,同时解决总和计算的问题:
import random # 定义骰子类型与对应面数的映射,新增骰子只需在此添加条目 die_types = { "d4": 4, "d6": 6, # 示例:添加更多骰子类型 # "d8": 8, # "d10": 10, # "d20": 20 } # 验证骰子类型输入 while True: selected_die = input("what type of die?: ").strip().lower() if selected_die in die_types: break print(f"请输入支持的骰子类型:{', '.join(die_types.keys())}") # 验证投掷次数输入 while True: try: roll_times = int(input("how many times?: ").strip()) if roll_times > 0: break print("投掷次数必须大于0,请重新输入") except ValueError: print("请输入有效的数字") # 核心投掷循环 roll_again = "yes" while roll_again.lower() in ("yes", "y"): # 一次性生成所有投掷结果 roll_results = [random.randint(1, die_types[selected_die]) for _ in range(roll_times)] # 输出结果与总和 print(f"投掷结果:{' '.join(map(str, roll_results))}") print(f"总和:{sum(roll_results)}") # 询问是否继续 roll_again = input("roll again? ")
关键改进说明
- 字典管理骰子类型:用字典存储骰子类型和对应面数,新增骰子时只需要在字典里添加键值对,无需编写大量分支判断,扩展性拉满。
- 输入合法性校验:对骰子类型和投掷次数做了校验,避免无效输入导致程序出错,比如输入非数字的次数、不存在的骰子类型。
- 列表推导式生成结果:通过一行代码生成任意次数的投掷结果,不管是1次还是100次都能处理,彻底告别手动编写每个次数的判断逻辑。
- 列表存储结果:用列表保存所有投掷值,既可以方便地打印所有结果,又能直接通过
sum()函数计算总和,解决了你之前单个变量无法求和的问题。 - 简化循环逻辑:把重复的"是否继续"输入统一放在循环末尾,避免每个分支重复编写相同代码,结构更清晰。
内容的提问来源于stack exchange,提问作者Emily A
相关产品推荐
相关产品推荐

