Immagino che tu sappia già del concetto di Min-Max, alberi e potatura, euristica e altre nozioni di base e quello che scrivo qui sono solo alcuni dettagli che potrebbero essere stati sottovalutati.
Io con una compagnia un amico ha scritto il nostro motore di scacchi qualche volta fa. Condivido alcuni problemi e idee che abbiamo avuto e spero che li trovi utili.
Dato che entrambi eravamo programmatori java, il nostro linguaggio ha trasformato il nostro in java e abbiamo iniziato con un approccio orientato agli oggetti. I pezzi erano oggetti, il bordo era oggetto, i file e le file (righe e colonne nella letteratura degli scacchi) erano oggetti. E questo era sbagliato. Il sovraccarico è stato enorme e il programma ha faticato ad andare oltre 2 mosse (4 strati) nell'albero di ricerca.
Quindi con alcune ricerche abbiamo trovato una brillante idea (non la nostra però!): rappresentazione di pezzi e schede come interi lunghi (64 bit). Questo ha senso perché una scacchiera ha 64 quadrati. Il resto è stato operazioni poco saggi (molto vicino a cpu = estremamente veloce). Ad esempio, prendi in considerazione un intero binario a 64 bit in cui quelli presentano i quadrati sul tabellone che il tuo pezzo può attaccare. Ora se si esegue un "AND" logico tra due numeri come questo, un risultato diverso da zero indica che si ha un quadrato con gli attaccanti. Ci sono diversi modi per presentare la scacchiera e pezzi, quindi:
1 - Decide about your Board Presentation
Quindi hai bisogno di aprire il database. L'apertura degli scacchi è in qualche modo risolta e si consiglia vivamente di avere e aprire il libro. In questo caso, hai molto tempo in più nei giochi blitz.
2 - Find yourself an opening book.
Li abbiamo fatti, ma eravamo ancora lontani dall'essere bravi:
3 - A good chess engine should be able to see 6 moves (12 ply) ahead.
Quindi quello che abbiamo fatto allora era utilizzare il tempo morto (se si tratta di un motore umano vs computer).
4 - Use the time when opponent is thinking to create some levels of your tree.
Eppure eravamo molto lontani da 12 strati. Con più studio, scopriamo alcuni trucchi! Ad esempio, è stato suggerito di saltare uno strato dell'albero e iniziare dal prossimo strato (come se non ci fosse nessun 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 della regina geniale.
5 - Learn the programming tricks for this specific problem (chess).
Io e il mio amico, in questo stato, eravamo ancora cattivi: /
Quello che potevamo fare - e in parte lo abbiamo fatto - era di salvare le posizioni calcolate. Se calcoli una posizione, salvala per il futuro! Lo stesso vale per i loop nell'albero di ricerca. Il punto era salvare / recuperare efficientemente:
6 - Save the data you generate...Efficiently!
e infine:
7 - Code with maximum optimization.
Questo problema è estremamente costoso sia in termini di tempo di CPU che di memoria. È molto importante scrivere il tuo codice in modo molto efficiente. Ricorda che stiamo parlando del fattore di derivazione di 35. Significa un "se" inutile da qualche parte nella tua euristica, può essere trasformato in 3.3792205e+18
inutile "se" è da qualche parte nel profondo del tuo albero di ricerca.
La programmazione di scacchi è una sfida molto molto interessante ed è il momento in cui puoi trasformare le tue capacità di programmazione in un test serio. Ci sono alcuni punti in più che posso suggerire, ma sono sicuro che li scoprirai da solo. Ci sono molti altri punti che non conosco ma puoi trovarli su internet!
Buona fortuna e buon divertimento!
P.S. Non conosco molto bene il javascript, ma qualcosa mi sta dicendo la difficoltà del problema, forse, considerando tutto ciò che il C ++ può offrire, sarebbe meglio abbandonare javascript e farlo in C ++.