Chess程序合法走棋校验失效:所有走棋均被判定为非法
问题根源
你代码里的list(board.legal_moves)生成的是**chess.Move对象的列表**,而非走棋字符串(比如"e4"、"e2e4")。输入的move是字符串类型,字符串和Move对象属于完全不同的类型,所以move in legal_moves永远返回False,不管输入是否合法。
解决办法
有两种常用的修复方式:
方式一:预生成合法走棋的SAN字符串列表
把合法走棋都转换成SAN格式的字符串,直接和输入的字符串做匹配:
import chess board = chess.Board() print(board) # 生成合法走棋的SAN字符串列表 legal_moves = [board.san(move) for move in board.legal_moves] while True: move = input("type a legal move: ") if move in legal_moves: board.push_san(move) # 更新合法走棋列表 legal_moves = [board.san(move) for move in board.legal_moves] print(board) else: print("Illegal move! Input a legal move")
方式二:直接解析输入并处理异常
尝试把输入的字符串解析成chess.Move对象,解析成功说明是合法走棋,失败则捕获异常提示错误:
import chess board = chess.Board() print(board) while True: move = input("type a legal move: ") try: # 解析输入为合法走棋 chess_move = board.parse_san(move) board.push(chess_move) print(board) except ValueError: print("Illegal move! Input a legal move")
这种方式不需要维护额外的合法走棋列表,更简洁,推荐使用。
内容的提问来源于stack exchange,提问作者Duel_Clip
相关产品推荐
相关产品推荐

