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, - . .
, - .
:
:
- .
- .
- .
. , : . : ?
: - . - . - -. , 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.