首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提升一个棋子?

如何提升一个棋子?
EN

Stack Overflow用户
提问于 2021-03-11 03:15:55
回答 2查看 246关注 0票数 0

我在下一步白棋可以通过移动b7a8来提升一个兵的位置设置了一个围栏。

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

所以我要做的就是知道它是什么类型的错误,如果它是宣传的,在lcd上显示,选项皇后,车,毕晓普,骑士…所以用户选择,然后我传递带有片段字母的b7a8。

当尝试使用“if move.promotion != None:”时,我发现您必须首先发送您想要的内容,例如"b7a8q“,然后它会告诉您这是否是促销活动。但我需要在此之前知道。例如:当做b7a8时,错误,为什么?因为这是一个促销活动,所以用户重新引入了运动选择,这就是我的b7a8q。

这有可能做到吗?或者你可以用什么方式来解决这个问题?

非常感谢。

这是我用来尝试的代码:

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

发布于 2021-04-14 20:55:00

如果移动无效,您可以检查添加"q“是否使其有效。如果是这样,那么这一定是一个兵升级移动,然后您可以询问用户他们想要将兵升级到哪个棋子。

所以:

代码语言:javascript
复制
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: ")

尽管如此,仍有一些问题需要处理:

  • 即使在上面的代码之后,当输入甚至不像移动
  • 时也会出现异常,您可能会得到一个无效的移动,因此确实应该有一个循环,该循环一直持续到移动有效为止:

代码语言:javascript
复制
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")
票数 0
EN

Stack Overflow用户

发布于 2021-04-14 20:06:02

你应该用你选择的那一件来测试促销行动是否合法。在此之后,您可以向用户询问他想要的部分。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66571405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档