Python字典校验输入时无法同时识别方向、退出参数怎么办
简化版龙文本游戏输入校验Bug修复
问题现象
代码预期支持两类合法用户输入:移动方向指令、退出指令,但实际运行时始终无法同时识别两类参数:
- 初始版本输入
exit可正常识别,输入south持续弹出「Invalid entry」提示无法通过校验 - 调整代码后又出现仅能识别
south、无法识别exit的问题
核心错误原因
- 布尔运算逻辑错误:校验循环中写的
validate['down' and 'exits']不符合Python语法规则。非空字符串做and运算时会返回最后一个真值,'down' and 'exits'实际运算结果为'exits',这行代码等价于while next_move not in validate['exits'],也就是仅判断输入是否是字符串exit的子串,自然无法识别south;如果手动把键改成'down',又会变成仅判断输入是否是south的子串,无法识别exit - 成员判断逻辑漏洞:
if next_move in validate['down']是判断输入是否为字符串south的子串,而非判断输入和有效值完全相等,会出现输入s/so这类短字符也被误判为合法的问题 - 无效分支语句:else块中的
next_move in validate['exits']仅做了布尔计算,没有实际分支控制作用,只要走到else分支就会直接执行退出,不管输入内容是什么 - 输入鲁棒性缺失:没有对用户输入做大小写、首尾空格的统一处理,用户输入
South/south这类格式时会被误判为无效 - 字符串语法错误:初始input提示的字符串直接折行书写,会触发Python语法报错
修正后可运行代码
# 房间映射字典,定义房间之间的连通关系 rooms = { 'Great Hall': {'South': 'Bedroom'}, 'Bedroom': {'North': 'Great Hall', 'East': 'Cellar'}, 'Cellar': {'West': 'Bedroom'} } # 打印空行优化终端显示 print('\n' * 10) # 初始化游戏状态 print('Your starting and current location is the Great Hall.\n') current_room = 'Great Hall' # 定义当前场景下的合法输入集合 valid_inputs = {'south', 'exit'} # 获取用户初始输入,统一转小写、去除首尾空格避免格式问题 next_move = input('You can only travel south from the Great Hall. \nEnter south to continue or exit:').strip().lower() # 循环校验输入,直到用户输入合法值 while next_move not in valid_inputs: print('\nInvalid entry.\n') next_move = input('\nEnter south or exit:').strip().lower() # 分支处理合法输入 if next_move == 'south': print('\nYou are now in the Bedroom.') current_room = 'Bedroom' else: exit('\nThanks for playing. Goodbye.')
内容的提问来源于stack exchange,提问作者TammyJ
相关产品推荐
相关产品推荐

