Ile jest możliwych ruchów szachowych?
Zaczynając od standardowej pozycji początkowej, ile jest możliwych legalnych ruchów szachowych w tej i wszystkich kolejnych pozycjach?
Powiedzmy, ignorując pozycję startową, goniec może przesunąć się na 32 pola (ale drugi obejmuje pozostałe 32), a wieża na 64, jeśli wziąć pod uwagę obie strony, pionki mogą również dotrzeć do wszystkich 64 pól, skoczek , król i hetman może również osiągnąć wszystkie 64 pozycje.
W sumie powinno to być 384 kombinacje łącznego celu ruchu i kwadratu + figury. Czy to jest poprawne?
Ale jaka jest liczba ruchów, jeśli pozycja początkowa nie jest ignorowana?
Następnie należy dodać 16 dwuetapowych postępów pionków plus 4 ruchy roszady (2, hetman i królestwo dla każdego gracza). I en passant, czyli 7 z lewej i 7 z prawej, razy 2 dla obu graczy. I wszystkie możliwe kombinacje kwadratów źródło-cel wszystkich innych elementów!
Odpowiedzi
Biały król może przejść do 8 pól z 36 wewnętrznych pól, do 4 pól z 4 pól narożnych i do 5 pól z pozostałych 24 pól granicznych. To 420 ruchów dla białego króla, dodaj 2 dla roszad, aby osiągnąć 422. Jeśli rozróżnisz zbijanie, to prawie podwaja się (roszada nie może bić) do 842. Teraz pozwól czarnemu królowi podwoić to (1684)? Albo zidentyfikować ruchy, które oboje mogliby wykonać (tj. Wszystkie oprócz roszady - 844)?
Wieża może zawsze (mając wolną linię wzroku) przesunąć się na 14 pól. To 896 ruchów. Podwój do 1792, jeśli rozróżnisz przechwytywanie. Podwój ponownie (3584), jeśli chcesz rozróżnić kolor.
Na przekątnej (powiedzmy od NW do SE) o długości n goniec może wykonać n ( n -1) ruchów (wybierz pole początkowe i wyraźne pole końcowe). Suma nad n = 1,2,3,4,5,6,7,8,7,6,5,4,3,2,1 (tj. Ignorując kolor gońca), aby dojść do 280 ruchów, podwójnie do 560, aby policzyć oba kierunki po przekątnej. Podwój (1120), jeśli chcesz rozróżniać przechwytywania, dwukrotnie (2240), jeśli chcesz rozróżniać na podstawie koloru.
Dla hetmana po prostu dodaj wieżę i gońca, licząc w ten sposób 1456, 2912 lub 5824 ruchy.
Skoczek może zwykle wykonać 8 ruchów, ale tak jak w przypadku króla musimy liczyć się z pobliską granicą. Łatwiej jest liczyć według kierunku: są 42 (6 na 7) pól, z których możemy przejść, powiedzmy, dwa w prawo i jedno w górę. Mamy tę samą liczbę 42 (choć z różnymi polami) dla wszystkich ośmiu kierunków, stąd w sumie 336 ruchów skoczka. Podwój (672), jeśli rozróżniasz przechwytywanie. Podwój ponownie (1344), jeśli rozróżniasz kolorem.
Biały pionek może przesunąć się o dwa pola do przodu od swojej pozycji wyjściowej (8 ruchów). Może poruszać się o jeden do przodu z rzędów 2 do 6 (40 ruchów). Może przejść do przodu z rzędu 7 i awansować na hetmana, wieżę, gońca lub skoczka (32 ruchy). Dla pionki, że należy odróżnić przechwytuje W tylko siedem z ośmiu kolumn, możemy uchwycić w prawo, a siedem z ośmiu kolumn możemy uchwycić w lewo. To daje nam 70 ruchów przechwytywania z rzędów 2 do 6 oraz 56 ruchów przechwytywania z promocją. Jak dotąd 206. Jeśli chcesz odróżnić bicie w przelocie od normalnego bicia tym samym ruchem (pole początkowe i końcowe) pionka, dodaj 14, aby osiągnąć 220. Ponownie, przynajmniej dla pionków wydaje się użyteczne rozróżnienie według gracza i dochodzimy do 440.
Podsumowując, najbardziej hojny sposób liczenia możliwych ruchów może prowadzić do 1684 + 3584 + 2240 + 5824 + 1344 + 440 = 15116 różnych ruchów. Można by podnieść tę liczbę jeszcze wyżej, rozróżniając ruchy, które dają czek, a nawet mata, lub rozróżniając bicie w zależności od zbitej figury.
Jeśli podana jest szachownica i tylko pole źródłowe i docelowe, a także wybór promocji (tak jak w formacie UCI ), wydaje się, że będzie 1968 możliwych ruchów.
# Python
# pip install python-chess
import chess
moves = 0
# Queen, covers all lines and diagonals
for x in range(8):
for y in range(8):
board = chess.Board("8/8/8/8/8/8/8/8")
board.set_piece_at(chess.square(x,y), chess.Piece(chess.QUEEN, chess.WHITE))
moves += len(list(board.generate_legal_moves()))
# Knight jumps
for x in range(8):
for y in range(8):
board = chess.Board("8/8/8/8/8/8/8/8")
board.set_piece_at(chess.square(x,y), chess.Piece(chess.KNIGHT, chess.WHITE))
moves += len(list(board.generate_legal_moves()))
# Straight pawn promotions, 2 players, 8 ranks each, 4 choices (queen, rook, bishop, knight)
moves += 2*8*4
# Diagonal pawn promotions, when capturing a piece
# 2 players, 14 diagonals (12 in the center and 1 each in the first and last ranks), 4 choices
moves += 2*14*4
print(moves)
Zakłada się, że roszada jest wskazywana przez przesunięcie króla o dwa kroki.
Tutaj są wszystkie możliwe ciągi UCI i tutaj jest kod, aby je generować.