You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现国际象棋坐标合法性判断循环?

国际象棋坐标合法性判断问题

功能需求

  • 当用户输入字母+数字格式的国际象棋坐标(如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):

问题根源与修复方案

问题根源

  1. 列表语法错误:legalmoves列表中每行末尾缺少逗号,导致相邻字符串被自动拼接(如"b8"和"c1"会变成"b8c1"),所有合法坐标都不在正确的列表中。
  2. 循环逻辑完全错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:55:19