1

我在下一步白棋可以通过移动 b7a8 推动棋子的地方放置一个 FEN。

在我当前使用的库中(并且我想替换)。执行此类操作时,它会返回一种错误类型,因此您会询问原因,然后您会得到指示,在这种情况下这是错误的,因为它是一种涉及提升的动作。

所以我要做的是知道它是什么类型的错误,如果是促销,在显示屏上显示,选项 Queen、Rook、Bishop、Knight ......所以用户选择然后我通过 b7a8 和字母的一块。

尝试使用“ if move.promotion != None:”时,我发现您必须首先发送您想要的内容,例如“b7a8q”,然后它会告诉您这是否是促销动作。但我需要事先知道。比如:做b7a8的时候,报错,为什么?因为是促销运动,用户重新介绍运动选择,我有b7a8q。

这可能吗?或者你能以什么方式解决这个问题?

非常感谢。

这是我用来尝试的代码:

import asyncio
import chess
import chess.engine

engine = chess.engine.SimpleEngine.popen_uci("stockfish.exe")

board = chess.Board()

board.set_fen("rn1qkbnr/pPpb1ppp/4p3/8/3p4/8/PP1PPPPP/RNBQKBNR w KQkq - 1 5") #Position to try to promote "b7a8"

while not board.is_game_over():
   
    print(board)

    mover = input("Make your move")
    

    prueba = chess.Move.from_uci(mover)
    
    
    if prueba in board.legal_moves:
        if board.is_castling(prueba):
            print("good you castling")
    else:
        print ("that is not a good move, make another valid")
        mover = input("a valid move please: ")

    if prueba.promotion != None:
        print ("This is a promotion (or was)")
        
    board.push_xboard(mover)
        
    print(board)
    
    result = engine.play(board, chess.engine.Limit(time=0.1))
    board.push(result.move)
    
    print(board)
engine.quit()
4

2 回答 2

0

如果移动无效,您可以检查添加“q”是否使其有效。如果是这样,那么这一定是一个典当促销动作,然后您可以询问用户他们想要将典当促销到哪一块。

所以:

if prueba in board.legal_moves:
    if board.is_castling(prueba):
        print("good job castling!")
else:
    if chess.Move.from_uci(mover + "q") in board.legal_moves:
        mover += input("Which piece you want to promote the pawn to? [q,r,b,n]: ")
        prueba = chess.Move.from_uci(mover)
    if prueba not in board.legal_moves:
        print ("that is not a good move, make another valid")
        mover = input("a valid move please: ")

不过,您还想处理一些问题:

  • 当输入甚至不像移动时可能会出现异常
  • 即使在上面的代码之后,你可能会留下一个无效的移动,所以确实应该有一个循环一直持续移动有效:
while True:
    mover = input("Make your move: ")
    prueba = None
    try:
        prueba = chess.Move.from_uci(mover)
    except ValueError:
        pass
    if prueba not in board.legal_moves:
        try:
            if chess.Move.from_uci(mover + "q") in board.legal_moves:
                mover += input("Which piece you want to promote the pawn to? [q,r,b,n]: ")
                prueba = chess.Move.from_uci(mover)
        except ValueError:
            pass
    if prueba in board.legal_moves:
        break
    print ("that is not a good move, make another valid move")
于 2021-04-14T12:54:59.870 回答
-1

您应该测试促销动作是否与您选择的一块合法。之后,您可以向用户询问他想要的作品。

于 2021-04-14T12:06:02.090 回答