Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import chess
- import math
- import time
- from copy import deepcopy
- def knight_moves():
- return [(2, 1), (1, 2), (-1, 2), (-2, 1),
- (-2, -1), (-1, -2), (1, -2), (2, -1)]
- def rook_moves():
- return [(i, 0) for i in range(-7, 8) if i != 0] + [(0, i) for i in range(-7, 8) if i != 0]
- def bishop_moves():
- return [(i, i) for i in range(-7, 8) if i != 0] + [(i, -i) for i in range(-7, 8) if i != 0]
- def queen_moves():
- return rook_moves() + bishop_moves()
- def amazon_moves():
- return queen_moves() + knight_moves()
- def cyril_moves():
- return rook_moves() + knight_moves()
- def eve_moves():
- return bishop_moves() + knight_moves()
- def generate_moves(board, piece, row, col):
- size = 8
- moves = []
- directions = []
- if piece == 'A':
- directions = amazon_moves()
- elif piece == 'C':
- directions = cyril_moves()
- elif piece == 'E':
- directions = eve_moves()
- for dx, dy in directions:
- x, y = row + dx, col + dy
- if 0 <= x < size and 0 <= y < size and board[x][y] == '.':
- moves.append((x, y))
- return moves
- def board_to_fen(board):
- fen = []
- for row in board:
- empty = 0
- fen_row = ""
- for cell in row:
- if cell == '.':
- empty += 1
- else:
- if empty > 0:
- fen_row += str(empty)
- empty = 0
- fen_row += cell
- if empty > 0:
- fen_row += str(empty)
- fen.append(fen_row)
- return "/".join(fen) + " w - - 0 1"
- def create_successors(index, state, all_states, seen_fens):
- board = state['board']
- new_states = []
- new_outputs = [] # sem si připravíme řetězce pro výpis na jednom řádku
- for i in range(8):
- for j in range(8):
- piece = board[i][j]
- if piece in ['A', 'C', 'E']:
- moves = generate_moves(board, piece, i, j)
- for x, y in moves:
- new_board = deepcopy(board)
- new_board[x][y] = piece
- new_board[i][j] = '.'
- fen = board_to_fen(new_board)
- if fen not in seen_fens:
- seen_fens.add(fen)
- new_state = {
- 'radek': len(all_states),
- 'N': [],
- 'P': [index],
- 'FEN': fen,
- 'board': new_board,
- 'to_mate': None,
- 'to_end': None
- }
- all_states.append(new_state)
- new_states.append(new_state['radek'])
- new_outputs.append(f"{new_state['radek']}({state['radek']})")
- else:
- for s in all_states:
- if s['FEN'] == fen:
- if index not in s['P']:
- s['P'].append(index)
- new_states.append(s['radek'])
- # Výpis na jediném řádku
- if new_outputs:
- max_radek = max(new_states)
- print(f"\rdepth={state['radek']} max={max_radek} : {' '.join(new_outputs)}", end='', flush=True)
- return new_states
- def create_initial_board():
- board = [['.' for _ in range(8)] for _ in range(8)]
- board[0][0] = 'A'
- # board[7][7] = 'C'
- # board[3][3] = 'E'
- board[4][4] = 'K' # White king
- board[0][7] = 'k' # Black king
- return board
- def main():
- board = create_initial_board()
- start_fen = board_to_fen(board)
- L = []
- seen_fens = set()
- seen_fens.add(start_fen)
- L.append({
- 'radek': 0,
- 'N': [],
- 'P': [],
- 'FEN': start_fen,
- 'board': board,
- 'to_mate': None,
- 'to_end': None
- })
- print(f"Start FEN: {start_fen}")
- print("Generuji následníky...")
- i = 0
- while i < len(L):
- L[i]['N'] = create_successors(i, L[i], L, seen_fens)
- i += 1
- print(f"Vygenerováno {len(L)} stavů.")
- print("Hledám koncové stavy...")
- for state in L:
- fen = state['FEN']
- try:
- board = chess.Board(fen)
- if board.is_checkmate():
- state['to_mate'] = 0
- state['to_end'] = 0
- elif board.is_stalemate() or board.is_insufficient_material() or board.is_seventyfive_moves():
- state['to_mate'] = math.inf
- state['to_end'] = 0
- except Exception as e:
- print(f"Neplatný FEN: {fen} -> {e}")
- state['to_mate'] = 0
- state['to_end'] = 0
- print("Propaguji hodnoty...")
- start_time = time.time()
- round_num = 0
- while any(s['to_end'] is None for s in L):
- round_num += 1
- changed = False
- for state in L:
- if state['to_end'] is None:
- preds_mate = [L[p]['to_mate'] for p in state['P'] if L[p]['to_mate'] is not None]
- preds_end = [L[p]['to_end'] for p in state['P'] if L[p]['to_end'] is not None]
- if preds_mate:
- new_val = 1 + min(preds_mate)
- if state['to_mate'] != new_val:
- state['to_mate'] = new_val
- changed = True
- if preds_end:
- new_val = 1 + min(preds_end)
- if state['to_end'] != new_val:
- state['to_end'] = new_val
- changed = True
- elapsed = int(time.time() - start_time)
- hh, rem = divmod(elapsed, 3600)
- mm, ss = divmod(rem, 60)
- print(f"Průchod {round_num}: čas {hh:02d}h{mm:02d}m{ss:02d}s, změněno: {changed}")
- if not changed:
- break
- print("\n--- Výstup ---")
- if len(L) > 22:
- print(f"L[22] = {L[22]}")
- else:
- print(f"List L má {len(L)} stavů. Poslední stav:\n{L[-1]}")
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement