gambit
Un motore scacchistico in Scala 3. Generazione delle mosse, valutazione delle posizioni e ricerca - un cervello completo per giocare a scacchi, costruito con scala-cli.
Un motore di scacchi in Scala 3. Tre cose difficili in una volta: una generazione di mosse impeccabile, una valutazione della posizione sensata e una ricerca che sceglie una buona mossa in un tempo ragionevole. Un cervello completo per giocare.
Introduzione
Un motore di scacchi sembra solo un progetto. Sono tre sottosistemi, ognuno dei quali può rovinare il tutto a modo suo, e solo insieme producono qualcosa che gioca in modo sensato. gambit consiste nel far concordare queste tre parti abbastanza bene perché il risultato inizi a somigliare a un vero avversario, e non a un generatore di mosse casuali.
Scala 3 offre qui un linguaggio espressivo per modellare la scacchiera, le mosse e l'albero delle varianti. Ma la vera sfida non è sintattica, è algoritmica: un generatore impeccabile, una valutazione equa e una ricerca che non calcola all'infinito.
Tre problemi che devono concordare
Un generatore di mosse che lascia passare una mossa illegale ogni milione di posizioni farà giocare al motore qualcosa di impossibile. Una valutazione che pesa male i pezzi lo condurrà a una sconfitta con convinzione. Una ricerca senza potatura penserà per ore a una mossa che dovrebbe cadere in un secondo.
tutte le mosse legali in ogni posizione, incluso l'arrocco, la presa en passant e la promozione.
un numero che esprime chi sta meglio mentre la partita è ancora in corso.
alfa-beta, che scarta i rami che non vale la pena calcolare.
Nessuno di questi tre può essere trascurato. Un motore debole in uno qualsiasi di essi perderà, e per un motivo preciso e individuabile, non per debolezza generale.
Alfa-beta, l'arte di non calcolare
La ricerca ingenua esamina ogni continuazione possibile, e ce ne sono miliardi già a poche mosse di profondità. La potatura alfa-beta nota che se una risposta dell'avversario confuta già una linea, il resto delle sue risposte non va calcolato. Con un buon ordine delle mosse, questo taglia lo spazio così tanto che il motore arriva più in profondità nello stesso tempo.
Nodi da esplorare alla stessa profondità (indicativo, migliaia)
Non è una piccola ottimizzazione ma la differenza tra un motore che vede tre mosse in avanti e uno che ne vede sei. Negli scacchi questa profondità si traduce direttamente in forza di gioco.
Perft, la prova della correttezza del generatore
La correttezza del generatore di mosse si verifica con il cosiddetto perft: conti tutte le posizioni raggiungibili a una data profondità e le confronti con numeri che tutta la comunità scacchistica sa a memoria. Se il tuo numero non torna, hai un bug da qualche parte, e si vede esattamente a quale profondità comincia la discrepanza.
Perft dalla posizione iniziale
| Profondità | Numero di posizioni |
|---|---|
| 1 | 20 |
| 2 | 400 |
| 3 | 8902 |
| 4 | 197281 |
| 5 | 4865609 |
Il risultato è un motore completo che prende una posizione e restituisce una mossa: il generatore espone tutte le continuazioni legali, la valutazione dice quale porta verso un lato migliore, e alfa-beta cerca tanto in profondità quanto il tempo consente. Tre sottosistemi che da soli sono solo parti, insieme formano un avversario che sa giocare.
Il perft è l'esempio da manuale di un test che può davvero fallire. Non verifica che qualcosa funzioni, confronta il tuo numero con un numero noto in anticipo, quindi ogni bug nel generatore falsa subito il risultato.
Altri progetti
Altri lavori della stessa categoria - scopri come affrontiamo sfide simili.
Hai un progetto simile?
Contattaci - il preventivo è gratuito e arriva entro un'ora.



