战舰游戏项目:try-except错误处理与坐标验证问题排查
问题修复方案
一、当前try-except失效的核心原因
input()函数会把任何用户输入都转为字符串返回,不会主动抛出ValueError,所以你的try块永远不会触发except分支,这是问题的根源。
二、先修正check_validity验证函数
原函数存在逻辑错误:循环第一次迭代就直接返回结果,根本没遍历完所有字典键。直接简化成判断坐标是否在字典键集合里即可:
def check_validity(coordinate): # 直接判断坐标是否在字典键中,无需多余循环 return coordinate in coordinates_dict.keys()
三、用if-else+while循环实现输入验证(推荐方案)
既然try-except在这里没必要,直接用循环结合验证函数,就能实现“无效输入重新提示”的需求:
def prompting(): while True: x = input('Please select the coordinate at which you would like to begin placing the aircraft carrier (5-units):') if check_validity(x): # 验证通过,跳出循环并返回有效坐标 return x else: # 验证失败,提示后继续循环等待输入 print('Coordinates are indicated by letter A - J on the vertical axis and 1 - 10 on the horizontal axis. Please use the values to indicate a valid coordinate:') # 调用函数获取有效坐标 valid_coordinate = prompting()
四、可选:需要try-except的场景
如果后续要拆分坐标的字母和数字部分(比如把数字转成整数),这时try-except才有用。示例如下:
def check_validity(coordinate): # 验证坐标格式:首字母A-J,后续是1-10的数字 if len(coordinate) < 2: return False letter_part = coordinate[0].upper() num_part = coordinate[1:] # 尝试将数字部分转为整数,失败则返回False try: num = int(num_part) except ValueError: return False # 最终验证范围 return letter_part in 'ABCDEFGHIJ' and 1 <= num <=10 def prompting(): while True: x = input('Please select the coordinate at which you would like to begin placing the aircraft carrier (5-units):') if check_validity(x): return x else: print('Coordinates are indicated by letter A - J on the vertical axis and 1 - 10 on the horizontal axis. Please use the values to indicate a valid coordinate:') valid_coordinate = prompting()
内容的提问来源于stack exchange,提问作者danielpintard
相关产品推荐
相关产品推荐

