Si fuera a escribir un motor de juego de ajedrez, ¿qué paradigma de programación usaría (POO, de procedimiento, etc.) y por qué lo elegiría? Por motor de ajedrez, me refiero a la parte de un programa que evalúa el tablero actual y decide el próximo movimiento de la computadora.
Lo pregunto porque pensé que sería divertido escribir un motor de ajedrez. Entonces se me ocurrió que podría usarlo como un proyecto para aprender programación funcional. Entonces se me ocurrió que algunos problemas no se ajustan bien al paradigma funcional. Entonces se me ocurrió que este podría ser un buen tema de discusión.
object-oriented
functional-programming
paradigms
chess
dar un toque
fuente
fuente
Respuestas:
Hasta donde yo sé, la evaluación no es un problema paralelo, pero evaluar diferentes cadenas lo es, por lo que definitivamente lo escribiría para hacer uso de múltiples núcleos y subprocesos múltiples.
Ya sea que vaya funcional o semi-funcional es cuestión de gustos. Personalmente, iría a OOP y usaría el soporte para programación funcional y paralelización que existe, por ejemplo, en C #
En una nota al margen, si tuviera que escribir un motor de ajedrez, trataría de hacer uno que realmente pueda "pensar" sobre el ajedrez. Utilizando la evaluación del tablero para la fuerza bruta, todas las combinaciones posibles se han hecho hasta la muerte y extremadamente bien, pero no ha habido mucho progreso para hacer un motor de ajedrez más reflexivo / difuso. ¡Eso sería un desafío! :)
Encuentra algunos juegos con un juego de posición realmente complicado y movimientos fuertes (¡están marcados! O !!) y úsalos para entrenar y probar tu motor.
fuente
Supongo que depende de tus objetivos, que considero son estrictamente didácticos. Si intentara escribir un producto competitivo, desearía la máxima eficiencia en los evaluadores de nivel más bajo. Muchas oportunidades para el paralelismo a nivel de bits aquí. También muchas oportunidades para tablas hash. También oportunidades para explotar el paralelismo. Luego, en los niveles superiores, es probable que desee un sistema bueno para la inteligencia artificial, lo que probablemente significa un lenguaje de programación funcional. Obviamente, no desea hacer todas estas cosas, elegir una o dos de ellas y contentarse con el hecho de que su proyecto no será competitivo con los mejores programas.
fuente
Elegí el paradigma OOP en mi motor de ajedrez llamado The Turk . La primera versión de mi motor de ajedrez fue escrita más procedimental que OOP. Entonces encontré tan difícil mejorar mi motor de ajedrez debido a los largos bloques de código y el diseño deficiente.
Depende de lo que quieras lograr mientras escribes el motor de ajedrez. Si quieres crear un motor de ajedrez que sea demasiado fuerte, incluso no es posible hacerlo en lenguajes OOP debido a enlaces tardíos lentos. Si solo quieres aprender programación y también divertirte escribiendo un motor de ajedrez para que los lenguajes administrados y OOP sean tus amigos. Puedo sugerirle que elija C # porque también es posible escribir un motor de ajedrez de manera más procesal con él.
fuente
Porté un programa de ajedrez simple como un medio para aprender el idioma Forth. Resultó ser muy adecuado para este problema tan imperativo, y aprendí mucho. La pila abierta me permitió implementar la búsqueda alfa-beta de una manera única, lo que me dio una mayor comprensión del algoritmo.
Uno pensaría que la programación funcional sería excelente para los programas de ajedrez, ya que los algoritmos centrales (búsqueda alfa-beta de búsqueda en profundidad, evaluación) son recursivos y funcionalmente estrictos. Sin embargo, un programa de ajedrez vive y muere por eficiencia y ninguno de los cultivos funcionales de lenguajes actuales tiene ese objetivo. Los cien principales motores de última generación utilizan lenguajes imperativos (principalmente C / C ++, luego Delphi) para tener el máximo control sobre el uso de memoria, subprocesos múltiples, estado global y generación de código. Todos los lenguajes funcionales utilizan la asignación dinámica de memoria para las estructuras de datos centrales, lo cual es la muerte para un programa de ajedrez.
Todavía me gustaría ver que alguien intente entrar en los 100 mejores motores de ajedrez usando un lenguaje funcional.
fuente