Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import chess
- def simplify_fen_string(fen):
- parts = fen.split(' ')
- simplified_fen = ' '.join(parts[:4]) # Zachováváme informace o pozici, hráči na tahu, rošádách a en passant
- return simplified_fen
- def minimax(board, depth, alpha, beta, maximizing_player, depth2, depths, position_count, memo):
- position_count[0] += 1 # Přidáváme počet prozkoumaných pozic
- if position_count[0] % 1000000 == 0: # Každých 1 000 000 pozic
- print(f"Prozkoumano {position_count[0]} pozic.")
- key = (board.fen(), maximizing_player, depth) # Odstraněny alpha a beta z klíče pro jednodušší ukládání výsledků
- if key in memo:
- return memo[key]
- if depth == 0 or board.is_game_over():
- eval = evaluate_board(board, depth2)
- memo[key] = (None, eval)
- return None, eval
- best_move = None
- if maximizing_player:
- max_eval = float('-inf')
- for move in board.legal_moves:
- board.push(move)
- _, eval = minimax(board, depth - 1, alpha, beta, False, depth2 + 1, depths, position_count, memo)
- board.pop()
- if eval > max_eval:
- max_eval = eval
- best_move = move
- alpha = max(alpha, eval)
- if beta <= alpha:
- break
- memo[key] = (best_move, max_eval)
- if depth2 not in depths: # Přidáváme hloubku do seznamu po dokončení rekurze
- depths.append(depth2)
- print(f"Hloubka rekurze: {depth2}")
- return best_move, max_eval
- else:
- min_eval = float('inf')
- for move in board.legal_moves:
- board.push(move)
- _, eval = minimax(board, depth - 1, alpha, beta, True, depth2 + 1, depths, position_count, memo)
- board.pop()
- if eval < min_eval:
- min_eval = eval
- best_move = move
- beta = min(beta, eval)
- if beta <= alpha:
- break
- memo[key] = (best_move, min_eval)
- if depth2 not in depths: # Přidáváme hloubku do seznamu po dokončení rekurze
- depths.append(depth2)
- print(f"Hloubka rekurze: {depth2}")
- return best_move, min_eval
- def evaluate_board(board, depth):
- if board.is_checkmate():
- return -1000 + depth if board.turn == chess.WHITE else 1000 - depth
- elif board.is_stalemate() or board.is_insufficient_material() or board.can_claim_fifty_moves():
- return 0
- return 0
- # Nastavení startovní pozice
- board = chess.Board("8/5k2/8/8/8/8/8/1KQ5 w - - 0 1")
- board = chess.Board("8/8/8/8/8/2k5/1R6/K7 w - - 0 1")
- # Inicializace seznamu pro sledování hloubek, proměnné pro počet pozic, a memoizačního slovníku
- depths = []
- position_count = [0]
- memo = {}
- # Spuštění minimaxu s maximální hloubkou 16
- best_move, best_score = minimax(board, 33, float('-inf'), float('inf'), True, 0, depths, position_count, memo)
- if best_move:
- move_san = board.san(best_move)
- print(f"Nejlepší tah z pozice {board.fen()} je {move_san} s hodnocením {best_score}.")
- else:
- print("Nebyl nalezen žádný tah, nebo je hra u konce. Skóre: ", best_score)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement