Ajedrez en Delphi. Cómo reinventé la rueda

Escribir IA para juegos es muy interesante y emocionante; estaba convencido de esto más de una vez por mi propia experiencia. Recientemente, habiendo tropezado accidentalmente con el código de mi antiguo proyecto de programa de ajedrez, decidí modificarlo un poco y ponerlo en GitHub . Y al mismo tiempo contar cómo se creó y qué lecciones me enseñó en el proceso.





Comienzo

Sucedió en 2009: decidí escribir un programa de ajedrez simple para practicar el desarrollo de la IA del juego. Yo mismo no soy un jugador de ajedrez, ni siquiera un amante del ajedrez. Pero la tarea de formación es bastante adecuada e interesante. Además, cuando jugaba al ajedrez en el tablero o en el programa, siempre tenía curiosidad por saber por qué este o aquel movimiento es más fuerte que el otro. Quería poder ver claramente todo el árbol del desarrollo de las posiciones de ajedrez. No he visto una característica de este tipo en otros programas, así que, ¿por qué no escribirla usted mismo? Bueno, dado que esto es entrenamiento, entonces necesitas inventar y escribir desde cero, y no aprender otros algoritmos y escribir su propia implementación. En general, creo que en tres días puedes gestionar y hacer algún tipo de versión funcional.





Primera versión

Normalmente, los motores de ajedrez utilizan DFS con rama y límites para limitar la búsqueda. Pero esto no está muy claro, por lo que se decidió: iremos por nuestro propio camino, que sea una búsqueda en amplitud y profundidad fija. Luego habrá un árbol de búsqueda completo en la memoria, que se puede visualizar de alguna manera. Y también averigüe: a) hasta qué profundidad se puede calcular una partida de ajedrez dentro del marco de la CPU disponible y los recursos de memoria, b) ¿qué tan bien o mal se jugará dicho algoritmo?





Debo decir que en ese momento tenía un procesador de 2 núcleos con 2 o 4 GB de memoria (no recuerdo exactamente), Windows de 32 bits y un compilador Turbo Delphi Explorer de 32 bits. Entonces, si el tiempo de ejecución aún podía sacrificarse de alguna manera, entonces la memoria disponible para el proceso se limitaba a 2 Gb. No sabía nada de la bandera PE, que extiende la memoria del usuario a 3Gb. Sin embargo, dado que tanto el sistema como Delphi y otros programas consumen memoria, hay menos de un gigabyte disponible para el ajedrez, para no entrar en intercambio.





El resultado fue la primera versión del juego, que consta de los siguientes módulos:





  • UI : la ventana principal, dibujando un tablero con formas.





  • Lógica del juego : compilar una lista de posibles movimientos, realizar un movimiento, detectar el final del juego.





  • AI: la puntuación es la función de evaluación del puesto.





  • AI: fuerza bruta : amplitud de la primera búsqueda a través de una cola.





  • 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. , !





El juego de programación AI es muchísimo adictivo: siempre quieres hacerlo mejor. Y aunque todavía tengo muchas ideas para un mayor desarrollo, llega el momento en que debo detenerme. Creo que llegó. Sin embargo, si alguien quiere, puede tomar mi código, jugar, experimentar, implementar algo. Afortunadamente, Delphi ahora está disponible para todos gracias a la Community Edition gratuita, sin mencionar Free Pascal y Lazarus. El código del proyecto (así como el exe-shnik compilado) se puede tomar aquí (para la compilación, también necesitará algo de https://github.com/Cooler2/ApusGameEngine ). Gracias a todos los que lo leyeron.








All Articles