首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Minimax返回非法的uci移动-移动生成不更新?

Minimax返回非法的uci移动-移动生成不更新?
EN

Stack Overflow用户
提问于 2022-01-27 11:41:57
回答 1查看 54关注 0票数 0

当我用位置r1bqkbr1/pp2pppp/2n1p2n/2p5/3P4/7N/PPP2PPP/RNBQKB1R w KQq - 3 6测试我的代码时,下面的代码在运行时输出ValueError: illegal uci: 'd8d7' in r1bqkbr1/pp2pppp/2n1p2n/2p5/3P4/7N/PPP2PPP/RNBQKB1R w KQq - 3 6。问题似乎是,董事会没有更新后,我推动了一个新的移动(它仍然产生合法的移动,认为它是黑色的移动,而它实际上是白色的移动)。我该怎么解决这个问题?

代码语言:javascript
复制
import random
import chess
import chess.polyglot as book
from evaluate import *

searched_position_evals = {}

def choose_move(board, depth, is_max):
  # TODO: endgame database
  best_move = ""
  best_eval = float('inf')
  if not is_max: best_eval *= -1
  if check_opening_book(board)[0]: return check_opening_book(board)[1].uci()
  for move in list(board.legal_moves):
    print(f"evaluating {move}")
    board.push_uci(move.uci())
    eval = minimax(board, depth, board.turn == chess.WHITE)
    if is_max: best_eval = max(best_eval, eval) 
    else: best_eval = min(best_eval, eval)
    if best_eval == eval: best_move = move
    board.pop()
  return best_move

def check_opening_book(board):
  with book.open_reader("assets/openings.bin") as reader:
    if len(list(reader.find_all(board))) == 0:
      return (False, "")
    else:
      return (True, list(reader.find_all(board))[random.choice(range(0, len(list(reader.find_all(board)))))].move)

def minimax(board, depth, is_max):
  if depth == 0: 
    return evaluate(board)
  elif board.fen in searched_position_evals: 
    board.pop()
    return searched_position_evals[board.fen]
  else:
    if is_max:
      max_eval = -float('inf')
      for move in list(board.legal_moves):
        board.push_uci(move.uci())
        searched_eval = minimax(board, depth - 1, False)
        searched_position_evals[board.fen] = searched_eval
        max_eval = max(max_eval, searched_eval)
        board.pop()
      return max_eval
    else:
      min_eval = float('inf')
      for move in list(board.legal_moves):
        board.push_uci(move.uci())
        searched_eval = minimax(board, depth - 1, True)
        searched_position_evals[board.fen] = searched_eval
        min_eval = min(min_eval, searched_eval)
        board.pop()
      return min_eval

print(choose_move(chess.Board("r1bqkb1r/pp2pppp/2n1p2n/2p5/3P4/7N/PPP2PPP/RNBQKB1R b KQkq - 2 5"), 3, False))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-27 13:08:29

在下面注释掉board.pop()

代码语言:javascript
复制
def minimax(board, depth, is_max):
  if depth == 0: 
    return evaluate(board)
  elif board.fen in searched_position_evals: 
    # board.pop()
    return searched_position_evals[board.fen]
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70877974

复制
相关文章

相似问题

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