如何正确实现国际象棋坐标合法性判断循环?
国际象棋坐标合法性判断问题
功能需求
- 当用户输入字母+数字格式的国际象棋坐标(如a1)时,输出“合法走法”
- 当用户输入数字+字母格式的坐标(如1a)时,输出“非法走法”
现有实现代码
legalmoves = [ "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8" "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8" "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8" "e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8" "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8" "g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8" "h1", "h2", "h3", "h4", "h5", "h6", "h7", "h8" ] illegalmoves = "" def play(): Userpick = input("请输入坐标(示例:A2):").lower() if Userpick in legalmoves: print("") print("坐标:", Userpick.upper(), ",是合法走法!") else: print("") print("坐标:", Userpick.upper(), ",是非法走法!") print("") play() while True: print("") Userpick = input("请输入坐标(示例:A2):").lower() if Userpick not in illegalmoves: print("") print("坐标:", Userpick.upper(), ",是非法走法!") else: print("") print("坐标:", Userpick.upper(), ",是合法走法!")
遇到的问题
用户先输入非法格式(如6a)后,再输入合法格式(如a6),程序仍判定为非法。
错误输出
请输入坐标(示例:A2):6a 坐标:6A ,是非法走法! 请输入坐标(示例:A2):a6 坐标:A6 ,是非法走法! 请输入坐标(示例:A2):
期望输出
请输入坐标(示例:A2):6a 坐标:6A ,是非法走法! 请输入坐标(示例:A2):a6 坐标:A6 ,是合法走法! 请输入坐标(示例:A2):
问题根源与修复方案
问题根源
- 列表语法错误:
legalmoves列表中每行末尾缺少逗号,导致相邻字符串被自动拼接(如"b8"和"c1"会变成"b8c1"),所有合法坐标都不在正确的列表中。 - 循环逻辑完全错误:
illegalmoves被定义为空字符串,Userpick not in illegalmoves永远为真,导致任何输入都会被判定为非法;且程序先执行play()函数,后续的while True循环与前面逻辑完全脱节。
修复后的代码
# 自动生成所有合法坐标,避免手动输入出错 legalmoves = [f"{chr(ord('a') + col)}{row+1}" for col in range(8) for row in range(8)] def check_coordinate(): while True: user_pick = input("请输入坐标(示例:A2):").lower() # 校验格式+合法性:长度为2,首字符是a-h,第二个是1-8,且在合法列表内 if len(user_pick) == 2 and user_pick[0].isalpha() and user_pick[1].isdigit() and user_pick in legalmoves: print(f"\n坐标:{user_pick.upper()},是合法走法!") else: print(f"\n坐标:{user_pick.upper()},是非法走法!") check_coordinate()
修复说明
- 用列表推导式自动生成合法坐标,彻底避免手动输入的语法错误。
- 加入格式校验:确保输入长度为2、首字符是字母、第二个是数字,结合合法列表判断,逻辑更严谨。
- 合并循环逻辑,只保留一个主循环,解决前后逻辑脱节的问题。
内容的提问来源于stack exchange,提问作者James Leroy
相关产品推荐
相关产品推荐

