Questa domanda riguarda la creazione di un motore di scacchi. Ho fatto proprio questo, e a mio modesto parere abbastanza elegantemente. Ma mi mancano le mie condizioni finali.
Ecco alcune funzioni di pseudopython che uso.
# Move from position old to new
def move(old, new):
if is_legal(old, new):
# Eat and move
if is_legal(new, enemy_king) or check_in_los(enemy_king, old):
# Set check on enemy king
if piece_type == 'Pawn' and position at the end of board:
# Convert to Queen
def is_legal(old, new):
# Assure piece is moving, it's your own and new position not on another own piece
# Based on piece type, assure it's maneuvering properly
# Assure there are no pieces in between the positions if applicable
if piece_type == 'King':
is_checked(new) # Not moving to a checked square
elif checked:
# Assure check is removed
else:
check_in_los(own_king, old) # Moving the piece does not create a check from behind
# Determine if king is checked from line of sight
def check_in_los(king_pos, direction):
# Divide path into single-square steps
# Find next piece in direction by incrementing king position by step
if is_legal(next, king_pos):
# King is checked from direction
# Determine if king is checked
def is_checked(king_pos):
# Check if knight positions around kings contain enemy knights
# For every 8 directions around king, check_in_los(king, direction)
Ora al compagno di controllo. Sarebbe banale controllare tutte le posizioni intorno al re se si tratta di una posizione legale, ma non è abbastanza.
Considera il seguente scenario in cui il re bianco è minacciato:
A B C D E F G H
1 BR | | BR | | | | |
2 | | | | | | |
3 | | | | | | |
4 | | | | | | |
5 | | | | | | |
6 | | | | | | |
7 | | | | WN | | |
8 | WK | BQ | | | | |
Il re (B8) non ha mosse legali a sinistra, ma il cavaliere (E7) può salvarlo mangiando la regina. Allo stesso modo se la posizione della regina è cambiata e il cavaliere è invece una torre:
A B C D E F G H
1 BR | | BR | | | | |
2 | | | | | | |
3 | | | | | | |
4 | BQ | | | | | |
5 | | | | | | |
6 | | | | | | |
7 | | | | WR | | |
8 | WK | | | | | |
La torre bianca può salvare il re spostandosi su B7.
Un approccio ingenuo al controllo di un compagno immagino che implichi il controllo di ogni possibilità, ma ciò sembra uno spreco.
Quale sarebbe un buon modo per raggiungere questo obiettivo? Preferibilmente usando le funzioni già in atto. Sono anche aperto ad altri approcci, se necessario. Mi è venuto in mente che forse sarebbe utile tenere traccia dei pezzi di controllo o anche di ogni quadrato che viene controllato e il modello di controllo di ogni singolo pezzo, ma non ne sono sicuro ..