[Programacion] Ajedrez

Hola

Me gustaria proponeros programar cada uno un ajedrez. No os asusteis, no pretendemos ganar a Kasparov XD, pero habia pensado que a la vez que vamos aprendiendo entre todos, cuando vayamos teniendo versiones jugables podriamos hacer "campeonatos" entre nuestros motores.

Como punto de partida me gustaria enseñaros mi primera experiencia en esto, un ajedrez en java que mas o menos es jugable (pero esta realmente mal optimizado y hay algunas reglas del juego que no las he implementado). Incluyo los fuentes, el applet compilado, todo. Podeis hacer lo que querais con el, no le voy a poner licencia ni nada (ya os he dicho que el codigo es "basico" XD).

http://cid-117b3734fbd11e0a.skydrive.li ... ochess.zip

Abrid el html con un navegador reciente, ya que al usar graficos svg a lo mejor en alguno no funciona... Ya me direis si os da algun problema.


Pero para poder "competir" entre nosotros, lo mas facil seria diseñar cada uno su propio motor y usar un GUI conocido, como el WinBoard. Asi, evitamos tener que hacer la parte artistica y los motores sera compatibles. El unico problema es que eso aun no lo he mirado (habra que ponerse manos a la obra, jejeje).

http://www.gnu.org/software/xboard/


Tambien, segun vayamos haciendo cosas, puedo ir actualizando el post principal con informacion de webs, algoritmos, consejos, etc. Aunque claro, todo esto si hay gente interesada. La verdad es que estaria bien!

Pues nada, un saludo y a ver la respuesta de la gente que queire empezar, de los expertos y de todos los que esten interesados.

[beer]
Pueses currarte uno guapo y participar en el concurso de software libre que se está organizando, el único requisito es que seas estudiante de ciclo medio/superior de informática, que estés haciendo la carrera o bachillerato.

Un saludo
Buenas,

Es una propuesta muy atractiva, aunque no sé hasta qué punto me vendría larga. Llevo programando casi 25 años, y he hecho de todo en este tiempo, desde pamplinas ultrasencillas hasta (módulos para) aplicaciones monstruosas y complejas, pero un motor de ajedrez "competente" me sigue pareciendo todo un reto.

Aunque sólo fuese como pasatiempo y sin pretensiones, igual me animo, me documento... y me pongo a ello :) Aunque supongo que exige un gran nivel de juego para sacar algo medio decente (al menos por los antecedentes de los motore más prestigiosos), y ahí confieso que estoy bastante limitado.
Sepho escribió:Pueses currarte uno guapo y participar en el concurso de software libre que se está organizando, el único requisito es que seas estudiante de ciclo medio/superior de informática, que estés haciendo la carrera o bachillerato.

Un saludo


De momento me viene muy grande eso, jejeje. Hay cosas basicas que de momento no tengo ni idea (y eso que he estado bastante horas este verano con esto XD). Tal vez si le dedico mas pueda ir avanzando.

Deschamps escribió:Buenas,

Es una propuesta muy atractiva, aunque no sé hasta qué punto me vendría larga. Llevo programando casi 25 años, y he hecho de todo en este tiempo, desde pamplinas ultrasencillas hasta (módulos para) aplicaciones monstruosas y complejas, pero un motor de ajedrez "competente" me sigue pareciendo todo un reto.

Aunque sólo fuese como pasatiempo y sin pretensiones, igual me animo, me documento... y me pongo a ello :) Aunque supongo que exige un gran nivel de juego para sacar algo medio decente (al menos por los antecedentes de los motore más prestigiosos), y ahí confieso que estoy bastante limitado.


Lo que pretendo en un principio es mas como "hobby", dedicarle un poco de nuestro tiempo libre, sin prisas. Pero claro, si nos va gustando y se nos da bastante bien podemos llegar lejos. Podemos aprender mucho entre todos seguro.
Tambien, sobre lo que he leido, existen 2 vertientes en este mundo del ajedrez por ordenador, los de tipo A y tipo B (fuerza bruta y los que preprocesan antes con conocimeintos de ajedrez). Si vas por el camino de fuerza bruta no necesitas mucho conocimiento (algo si, por supuesto).

http://es.wikipedia.org/wiki/Ajedrez_por_computadora



Gracias por los comentarios ^^.
Lo que queréis hacer si no me entere mal es bastante sencillo, es una simple selección optima teniendo en cuenta las reglas del juego y definiendo bien cual es la mejor jugada (que es lo complicado).

Para hacerlo mas "inteligente" podéis probar con alfa-beta


Lo mas difícil, y lo que nunca nadie os contara es el metaconocimiento del juego, saber cual es al mejor jugada, pero el juego en si es bastante fácil, es mas, seguramente os lo podáis encontrar como examen o practica de alguna universidad, sudokus hay unos cuantos.
En realidad es más complicado de lo que parece Ikiu, el ajedrez es uno de los pocos juegos que existen con un número de jugadas infinitas. A diferencia del sudoku, las damas o el backgammon en que sabes cuantas jugadas posibles tiene el juego, en el ajedrez no puedes más que predecir un número de jugadas, hay maquinas que juegan a treinta movimientos por ejemplo y elegir tu estrategia a partir de ahí, por eso es un ejercicio que tiene tantos adeptos entre los programadores, si buscas por Internet verás como habiendo programas que solucionan sudokus, no hay en cambio ninguno que solucione cualquier problema de ajedrez.

La verdad es que como reto está bien. Aunque no os recomendaría intentarlo sin antes saber jugar o echar unas partiditas contra maquinas (fritz ^^ a ser posible) y por supuesto contra algunos humanos. La verdad es que el tema es apasionante. Me bajaré el x-board a ver que tal es.
Yui_K escribió:En realidad es más complicado de lo que parece Ikiu, el ajedrez es uno de los pocos juegos que existen con un número de jugadas infinitas. A diferencia del sudoku, las damas o el backgammon en que sabes cuantas jugadas posibles tiene el juego, en el ajedrez no puedes más que predecir un número de jugadas, hay maquinas que juegan a treinta movimientos por ejemplo y elegir tu estrategia a partir de ahí, por eso es un ejercicio que tiene tantos adeptos entre los programadores, si buscas por Internet verás como habiendo programas que solucionan sudokus, no hay en cambio ninguno que solucione cualquier problema de ajedrez.

La verdad es que como reto está bien. Aunque no os recomendaría intentarlo sin antes saber jugar o echar unas partiditas contra maquinas (fritz ^^ a ser posible) y por supuesto contra algunos humanos. La verdad es que el tema es apasionante. Me bajaré el x-board a ver que tal es.


Pero para eso están las podas, a mi me sigue pareciendo mas difícil el definir que es una buena jugada, el resto es coger la rama mas prometedora, si lo que pretenden es no ganar a kasparov y solo competir entre sus motores, lo que va a diferenciar un motor de otro es el metaconocimiento que tenga, el que mejor defina lo que es la mejor jugada ganara, es mas, estoy seguro que IBM te daría a deep blue, lo que no te daría es su metaconocimiento
Si, el empleo del arbol y poda alfa-beta es de uso obligatorio, pero hay muchas mas cosas.
Por ejemplo:
-El uso de bitboards que acelera mucho la busqueda de movimiento, pero es complicado.
-Tambien hay que saber ordenar la lista de movimientos poniendo "los mas prometedores" al principio (cada uno lo podra hacer de formas diferentes).
-El uso de tablas de transposicion da bastante juego.
-La busqueda quiescente.
-Y el "tema sin fondo", la evaluacion de la posicion. Si que es verdad que aqui va a estar de verdad la diferencia de un motor a otro, pero todo lo de antes son aspectos importantes en cuanto a velocidad y poder ganar un nivel mas de busqueda.

Yo creo que es algo con lo que se puede disfrutar. Yo estoy leyendo acerca de los bitboards porque quiero empezar el motor desde cero escrito en C (a lo mejor valoro la posibilidad de hacerlo en C++) y usar el protocolo xboard.

Ah, tambien habia pensado que si vamos reuniendo infromacion necesaria se podria editar una pagina en el wiki. A ver como acaba esto XD.
Ikiu, no te había leído bien :) pensaba que te referías a elegir la estrategia conociendo todas las jugadas. En efecto es como dices.
Bueno, voy a poner el principio de un ajedrez programado por ordenador: la representacion del tablero.

Existen muchas formas, pero voy a poner 3 de ellas (las explicare como buenamente pueda, si alguien sabe mas cosas que lo diga, jejeje).

1- Mediante una lista de las piezas (en vez de cada casilla del tablero) en la que se almacena su posicion en el tablero, ademas de derechos de enroque, captura al paso, ... Esta forma tuvo importancia cuando la memoria era un recurso bastante limitado, ya que almacenar 32 piezas es menor que las 64 casillas del ajedrez. Sin embargo, ahora no hay tal problema y lo unico que hace es complicar la programacion (es dificil implementar la coronacion de un peon por ejemplo).

2- Mediante un vector/matriz. Esta forma parece ser la "mas natural y sencilla", asignando un elemento de una matriz a cada casilla del tablero. Una representacion de cada pieza podria ser 0 para la casilla vacia, 1 para el peon blanco, 2 para el caballo, ... y en negativo para las negras.

Ademas existe una mejora de este metodo, que consiste en añadirle 2 filas/columnas a cada lado de la matriz (12x12 en vez de 8x8). Esto se debe a que al querer generar los movimientos de una pieza (del alfil por ej.) accedemos a la casilla siguiente en diagonal, pero si esta fuera accederemos a un elemento de la matriz que no existe y tenemos que estar haciendo constatemente comprobaciones. Al tener esas casillas extras, les podemos dar un valor no usado antes (10 por ej.) y al acceder es mas rapido comprobar que esta fuera del tablero. Ponemos 2 mas a cada lado porque el caballo tiene movimientos que podrian saltar una fila/columna extra.

3- Mediante BitBoards. Esta es la forma "dificil" y la que nos proporcionara un motor de ajedrez mas rapido. Casualmente, los bits de nuestros procesadores coinciden con el numero de casillas de un tablero de ajedrez y esto tiene su utilidad. Podemos guardar un tablero entero en una unica variable de 64bits (un long long int en programacion), en la que cada bit seria una pieza (1--> pieza, 0--> vacio). Pero se ve a simple vista que nos falta informacion y se soluciona añadiendo mas tableros. Con un tablero diferente para cada pieza y bando del ajedrez lo tendriamos todo. Un ejemplo del tablero de los caballos negros(supongamos que las negras estan arriba): 0100001000000...0. Ademas se pueden agregar otros tableros para aumentar la velocidad (como el tablero de las pieza blancas, o el de piezas que amanezan la dama, etc.).

La mejora de velocidad de este metodo viene dada porque para calcular los movimientos de un caballo blanco por ejemplo, costaria una sola instruccion que seria hacer la funcion OR del tablero de piezas negras con una plantilla de los movimientos de un caballo (las "L"s tipicas). 1 sola instruccion cuando con el metodo anterior teniamos que ir comprobando cada casilla para ver si estaba dentro del tablero, si no habia una pieza amiga,...

Lo complicado de este metodo es la generacion de movimientos de una pieza que se debe detener cuando encuentra otra en su camino. En este momento estoy leyendo mas sobre esto y no puedo daros mas informacion XD.


Ahi estan. En mi ejemplo de ajedrez java he usado la segunda, pero tengo ganas de meterme con los bitboards. Es una solucion muy ingeniosa ^^. Todo el que quiera dejar su granito de arena que lo haga. Mas tarde, si nadie lo ha hecho, continuare con las generaciones de movimientos.

Saludos!
9 respuestas