Suponho que você já conheça o conceito de Min-Max, árvores e poda, heurística e outras noções básicas e o que escrevo aqui são apenas alguns detalhes que podem ter sido subestimados.
Na companhia de um amigo, escrevi nosso próprio mecanismo de xadrez algumas vezes atrás. Compartilho algumas questões e idéias que tivemos e espero que você as ache úteis.
Como nós dois éramos programadores de Java, nossa linguagem transformou-se em Java e começamos com uma abordagem orientada a objetos. Peças eram objetos, tabuleiro era objeto, arquivos e fileiras (linhas e colunas na literatura de xadrez) eram objetos. E isso estava errado. A sobrecarga era enorme e o programa estava lutando para ir além de 2 movimentos (4 dobras) na árvore de pesquisa.
Assim, com algumas pesquisas, acabamos com uma idéia brilhante (embora não a nossa!): Representar peças e tabuleiro como números inteiros longos (64 bits). Isso faz sentido porque um tabuleiro de xadrez tem 64 quadrados. O resto foram operações um pouco sábias (rodando muito perto da CPU = extremamente rápido). Por exemplo, considere um número inteiro binário de 64 bits no qual os que estão apresentando os quadrados no quadro que sua peça pode atacar. Agora, se você executar um "AND" lógico entre dois números como esse, um resultado diferente de zero indicará que você tem um quadrado com atacantes. Existem várias maneiras de apresentar o tabuleiro e as peças de xadrez:
1 - Decida sobre a sua apresentação no quadro
Então você precisa e abrir o banco de dados. A abertura do xadrez é de alguma forma resolvida e é altamente recomendável ter um livro de abertura. Nesse caso, você tem muito tempo extra em jogos de blitz.
2 - Encontre um livro de abertura.
Fizemos isso, mas ainda estávamos longe de ser bons:
3 - Um bom motor de xadrez deve ser capaz de ver 6 movimentos (12 dobras) à frente.
Então o que fizemos então foi usar o tempo morto (se é um mecanismo humano versus computador).
4 - Use o tempo em que o oponente está pensando em criar alguns níveis da sua árvore.
E ainda estávamos longe de 12 dobras. Com mais estudos, descobrimos alguns truques! Por exemplo, foi sugerido pular uma dobra da árvore e começar da seguinte (como se não houvesse oponente). A idéia é que, se um movimento é extremamente idiota, por que perder tempo e ver quais são as respostas dos oponentes a esse movimento? No entanto, um bom mecanismo deve ser capaz de distinguir entre movimento idiota e sacrifício da rainha genial.
5 - Aprenda os truques de programação para este problema específico (xadrez).
Eu e meu amigo, nesse estado, ainda éramos ruins: / O que poderíamos fazer - e parcialmente fizemos - foi salvar as posições calculadas. Se você calcular uma posição, salve-a para o futuro! O mesmo vale para loops na árvore de pesquisa. O objetivo era salvar / recuperar de forma eficiente:
6 - Salve os dados que você gerar ... Eficientemente!
e finalmente:
7 - Código com otimização máxima.
Esse problema é extremamente caro, tanto no tempo como na memória da CPU. É muito importante escrever seu código com muita eficiência. Lembre-se de que estamos falando do fator de ramificação 35. Isso significa que um "se" inútil em algum lugar da sua heurística pode se transformar em um 3.3792205e+18
"se" inútil em algum lugar profundo da sua árvore de pesquisa.
A programação de xadrez é um desafio muito muito interessante e é o momento de colocar seus recursos de programação em um teste sério. Há mais alguns pontos que posso sugerir, mas tenho certeza que você os descobrirá por si mesmo. Há muitos outros pontos que eu não sei, mas você pode encontrá-los na internet!
Boa sorte e divirta-se!
ps Eu não conheço javascript muito bem, mas algo está me dizendo a base da dificuldade do problema, talvez, considerando tudo o que o C ++ possa oferecer, seria melhor descartar o javascript e fazê-lo em C ++.