Presumo che tu conosca già il concetto di Min-Max, alberi e potatura, euristiche e altre basi e ciò che scrivo qui sono solo alcuni dettagli che potrebbero essere stati sottovalutati.
Io con la compagnia un amico ho scritto il nostro motore di scacchi qualche volta fa. Condivido alcuni problemi e idee che abbiamo avuto e spero che li troviate utili.
Dato che entrambi eravamo programmatori Java, il nostro linguaggio si è trasformato in Java e abbiamo iniziato con un approccio orientato agli oggetti. I pezzi erano oggetti, la tavola era oggetto, i file e le file (file e colonne nella letteratura sugli scacchi) erano oggetti. E questo era sbagliato. Il sovraccarico era enorme e il programma stava lottando per andare oltre 2 mosse (4 strati) nella struttura di ricerca.
Quindi con un po 'di ricerca siamo finiti con un'idea geniale (non la nostra però!): Rappresentare pezzi e tavola come numeri interi lunghi (64 bit). Questo ha senso perché una scacchiera ha 64 quadrati. Il resto è stato un'operazione un po 'saggia (molto vicino a cpu = estremamente veloce). Ad esempio, considera un numero intero binario a 64 bit in cui quelli presentano i quadrati sul tabellone che il tuo pezzo può attaccare. Ora se esegui un "AND" logico tra due numeri come questo, un risultato diverso da zero indica che hai un quadrato con attaccanti. Esistono diversi modi per presentare la scacchiera e i pezzi, quindi:
1 - Decidi la presentazione del tuo consiglio
Quindi è necessario e aprire il database. L'apertura degli scacchi è in qualche modo risolta e si consiglia di avere e aprire il libro. In questo caso, hai un sacco di tempo extra nei giochi blitz.
2 - Trovati un libro di apertura.
Li abbiamo fatti, ma non eravamo ancora bravi:
3 - Un buon motore di scacchi dovrebbe essere in grado di vedere 6 mosse (12 strati) in avanti.
Quindi quello che abbiamo fatto è stato usare i tempi morti (se si tratta di un motore umano vs un computer).
4 - Usa il tempo in cui l'avversario sta pensando di creare alcuni livelli del tuo albero.
Eppure eravamo lontani dai 12 strati. Con ulteriori studi, scopriamo alcuni trucchi! Ad esempio, è stato suggerito di saltare uno strato dell'albero e di iniziare dallo strato successivo (come se non ci fosse un avversario). L'idea è che se una mossa è estremamente idiota, allora perché perdere tempo e vedere quali sono le risposte degli avversari a quella mossa. Tuttavia, un buon motore dovrebbe essere in grado di distinguere tra mossa idiota e sacrificio geniale della regina.
5 - Impara i trucchi di programmazione per questo problema specifico (scacchi).
Io e il mio amico, in questo stato, eravamo ancora pessimi: / Quello che potevamo fare - e in parte lo facevamo - era salvare le posizioni calcolate. Se calcoli una posizione, salvala per il futuro! Lo stesso vale per i loop nella struttura di ricerca. Il punto era salvare / recuperare in modo efficiente:
6 - Salva i dati che generi ... In modo efficiente!
e infine:
7 - Codice con la massima ottimizzazione.
Questo problema è estremamente costoso sia in termini di tempo della CPU che di memoria. È molto importante scrivere il codice in modo molto efficiente. Ricorda che stiamo parlando del fattore ramo di 35. Ciò significa che un "se" inutile da qualche parte nel tuo euristico, può essere trasformato in 3.3792205e+18
inutile "se" è da qualche parte in profondità nel tuo albero di ricerca.
La programmazione degli scacchi è una sfida molto interessante ed è il momento in cui puoi mettere alla prova le tue capacità di programmazione. Ci sono alcuni altri punti che posso suggerire, ma sono sicuro che li scoprirai da solo. Ci sono molti altri punti che non conosco ma li puoi trovare su Internet!
Buona fortuna e buon divertimento!
ps non conosco molto bene javascript ma qualcosa mi sta dicendo sulla base della difficoltà del problema, forse, considerando tutto ciò che il C ++ può offrire, sarebbe meglio lasciare javascript e farlo in C ++.