Xadrez em Delphi. Como eu reinventei a roda

Escrever IA para jogos é muito interessante e empolgante - eu estava convencido disso mais de uma vez por experiência própria. Recentemente, tendo acidentalmente tropeçado no código do meu antigo projeto de programa de xadrez, decidi modificá-lo um pouco e colocá-lo no GitHub . E, ao mesmo tempo, conte como foi criado e quais lições me ensinou no processo.





Começar

Aconteceu em 2009: decidi escrever um programa de xadrez simples para praticar o desenvolvimento de IA de jogos. Eu mesmo não sou um jogador de xadrez e nem mesmo diria que sou um amante do xadrez. Mas a tarefa de treinamento é bastante adequada e interessante. Além disso, quando jogava xadrez no tabuleiro ou no programa, sempre ficava curioso por que esse ou aquele lance é mais forte que o outro. Eu queria ser capaz de ver claramente toda a árvore do desenvolvimento das posições de xadrez. Eu não vi esse recurso em outros programas - então por que não escrevê-lo você mesmo? Bem, como isso é treinamento, você precisa inventar e escrever do zero, e não aprender outros algoritmos e escrever sua própria implementação. Em geral, acho que em três dias você consegue administrar e fazer algum tipo de versão funcional.





Primeira versão

Normalmente, os mecanismos de xadrez usam DFS com ramificações e limites para restringir a pesquisa. Mas isso não está muito claro, então foi decidido: nós seguiremos nosso próprio caminho - que seja uma busca ampla em uma profundidade fixa. Em seguida, haverá uma árvore de pesquisa completa na memória, que pode ser visualizada de alguma forma. E também descubra: a) em que profundidade um jogo de xadrez pode ser calculado dentro da estrutura dos recursos de CPU e memória disponíveis, b) quão bem ou mal esse algoritmo irá jogar?





Devo dizer que naquela época eu tinha um processador de 2 núcleos com 2 ou 4 GB de memória (não me lembro exatamente), Windows de 32 bits e um compilador Turbo Delphi Explorer de 32 bits. Portanto, se o tempo de execução ainda pudesse ser sacrificado, a memória disponível para o processo era limitada a 2 Gb. Eu não sabia sobre a bandeira PE, que estende a memória do usuário para 3Gb. Porém, como tanto o sistema quanto o Delphi e outros programas consomem memória, menos de um gigabyte está disponível para o xadrez, para não entrar em swap.





O resultado foi a primeira versão do jogo, composta pelos seguintes módulos:





  • UI - a janela principal, desenhando um quadro com formas.





  • Lógica do jogo - compilar uma lista de movimentos possíveis, fazer um movimento, detectar o fim do jogo.





  • AI: pontuação é a função de avaliação da posição.





  • AI: força bruta - pesquisa ampla em uma fila.





  • UI: - , .





:





  • 3 - , - 5-15 . 4 . .





  • 3 - " ": - , "" , "". . , .





  • , , .





, : , . .





- . - - , - - . , .





:





  • :





    • : - 3, - 5 .. - 1, .





    • , , ( ). .





    • . - . ! - . - . 1-2 .





    • : . AI , .. , .





  • = (white_rate - black_rate) * (1 + 10 / (white_rate + black_rate)). , , - , .





, , . - , . - 1, - 0.4, - . .





, - .





:





  1. 3 ( ).





  2. .





  3. - .





  4. : .





  5. : . 2.





:





  • - .





  • - .





  • - .





. , : . : ?





: - . - . - -. , 64- . 264, , 232, - - - .





"" 30-45%, 80-90%, 5-10 , . !





?

, - 2- , . , , - . :





  • AI - CPU .





  • ?





  • AI . ?





  • : . , . , , . .





, "" . , .





, - . :





  • : 8-, 2- CPU, .





  • 64- : , , x64. , ! x64 , x86 5-10% . 64- Delphi , .





  • : 32- PE- . , 1 - - "" . .





  • : , . - , . - , , . . , - , . .





  • . - . , . .. .





  • . . - . , , , .





  • . - . ? , .





AI , . AI chess.com , 1800-1900. , !





A IA do jogo de programação é extremamente viciante: você sempre quer fazer melhor. E embora eu ainda tenha muitas ideias para desenvolver mais, chega o momento em que preciso parar. Eu acho que veio. No entanto, se alguém quiser, pode pegar meu código, brincar, experimentar, implementar algo. Felizmente, o Delphi agora está disponível para todos graças à Community Edition gratuita, sem mencionar o Free Pascal e o Lazarus. O código do projeto (assim como o exe-shnik compilado) pode ser obtido aqui (para compilação, você também precisará de algo em https://github.com/Cooler2/ApusGameEngine ). Obrigado a todos que o leram.








All Articles