为何校验国际象棋棋子数量的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
相关产品推荐
相关产品推荐

