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

为何校验国际象棋棋子数量的Python代码不符合预期返回False

问题原因分析
  • 直接触发返回False的核心错误:国王数量校验逻辑错误。国际象棋棋盘必须同时存在1个白王和1个黑王,总数应为2,但代码中写的是总数不等于1就返回False,当前示例中国王数量为2,直接触发返回。
  • 皇后校验逻辑错误:代码中要求白后+黑后的总数不超过1,实际双方各最多可拥有1个皇后,总数上限为2,当前示例中有2个皇后,即使国王校验修复也会触发错误返回。
  • 骑士、主教、车的校验逻辑错误:代码将这三类棋子的总数统一限制为2,实际每类棋子双方各最多可有2个,即骑士最多4个、主教最多4个、车最多4个,不能合并统计总数。
  • 兵的校验逻辑错误:代码要求白兵+黑兵总数不超过8,实际双方各最多可有8个兵,总数上限为16。
  • 最后一行校验存在语法+逻辑双重错误:board.values[0]写法错误,values是字典方法需要加括号调用;b和w属于未定义变量,完全无法正常运行,该行本意是校验黑白双方总棋子数各不超过16,现有写法完全无法实现。
修正后代码
chessboard = {
    '1h': 'bking',
    '6c': 'wqueen',
    '2g': 'bbishop',
    '5h': 'bqueen',
    '3e': 'wking',
    '4c': 'brook',
}

def check_validity(board):
    # 统计各类棋子数量
    count = {}
    for piece in board.values():
        count[piece] = count.get(piece, 0) + 1
    # 校验国王:必须各有1个
    if count.get('wking', 0) != 1 or count.get('bking', 0) != 1:
        return False
    # 校验兵:每方最多8个
    if count.get('wpawn', 0) > 8 or count.get('bpawn', 0) > 8:
        return False
    # 校验骑士、主教、车:每方最多2个
    for piece in ['wknight', 'bknight', 'wbishop', 'bbishop', 'wrook', 'brook']:
        if count.get(piece, 0) > 2:
            return False
    # 校验皇后:每方最多1个
    if count.get('wqueen', 0) > 1 or count.get('bqueen', 0) > 1:
        return False
    # 校验双方总棋子数不超过16
    w_total = sum(v for k, v in count.items() if k.startswith('w'))
    b_total = sum(v for k, v in count.items() if k.startswith('b'))
    if w_total > 16 or b_total > 16:
        return False
    return True

print(check_validity(chessboard))
for key, values in chessboard.items():
    print(values, sum(value == values for value in chessboard.values()))
修正后运行输出
True
bking 1
wqueen 1
bbishop 1
bqueen 1
wking 1
brook 1

内容的提问来源于stack exchange,提问作者senluowanxiangxiaoyaozizai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:15:03