Python骰子投掷工具:单行输入解析多位数整数问题及解决
解决Python 3中rNdM格式骰子工具的多位数解析问题
嘿,我明白你遇到的麻烦了——原来的代码只能处理个位数的投掷次数和骰子面数,碰到1d20、10d4这种带两位数的输入就报错,而且不想拆分输入步骤对吧?我来给你个靠谱的解决方案,用Python 3.6.4完全能跑通。
错误原因分析
你提到的"Too Many Values to Unpack"和"int base 10"错误,大概率是因为原来的代码是按单个字符或者错误的拆分逻辑处理输入的:
- 如果是直接把输入字符串拆成单个字符赋值(比如
rolls, d, sides = input_str),那输入10d4时字符串长度是4,变量只有3个,自然会解包失败; - 如果用
split('d')但没正确处理结果(比如只取了拆分后的单个字符转int),那碰到多位数就会把整个字符串片段(比如"10")当成非数字或者处理错误,导致转int失败。
完美解决方案:正则表达式匹配
正则表达式可以精准匹配rNdM格式的字符串,不管投掷次数和骰子面数是几位数都能正确提取。下面是完整的代码:
import random import re def roll_dice(input_command): # 定义正则匹配模式:匹配开头的数字(投掷次数)、中间的d、结尾的数字(骰子面数) pattern = re.compile(r'^(\d+)d(\d+)$') match_result = pattern.match(input_command.strip()) if not match_result: raise ValueError("输入格式不正确,请使用rNdM格式,例如:1d20、10d4、3d6") # 提取并转换为整数 num_rolls = int(match_result.group(1)) num_sides = int(match_result.group(2)) # 生成随机投掷结果 results = [random.randint(1, num_sides) for _ in range(num_rolls)] total = sum(results) # 输出结果 print(f"投掷{num_rolls}个{num_sides}面骰子的结果:{results}") print(f"总和:{total}") return results, total # 测试运行 if __name__ == "__main__": user_input = input("请输入骰子指令(rNdM格式):") try: roll_dice(user_input) except ValueError as err: print(err)
代码说明
- 正则匹配:
r'^(\d+)d(\d+)$'这个模式中,(\d+)表示匹配一个或多个数字(支持多位数),d是固定分隔符,^和$确保整个输入字符串都符合格式,避免匹配到多余内容; - 输入验证:如果输入不符合格式(比如输入"d20"、"10d"或者"abc"),会抛出明确的错误提示;
- 随机生成:用列表推导式生成指定次数的随机数,范围是1到骰子面数,最后计算总和并输出。
你可以直接运行这段代码,输入1d20、10d4、5d100这类带多位数的指令都能正常工作,完全不用拆分输入步骤。
内容的提问来源于stack exchange,提问作者fantascey
相关产品推荐
相关产品推荐

