Yo estoy lejos de jugar bien al ajedrez, pero por si te sirve de algo he echado un par de partidas sin tomármelo muy en serio, y a veces me ha sorprendido que cambiaba piezas por otras de menor valor, sin que luego aprovechara la situación.
Efectivamente, ese es uno de los pequeños defectos que le he encontrado en la versión que he mandado al concurso (porque en versiones previas no tenía ese defecto).
La cuestión es un poco larga de explicar, pero intentaré resumirlo un poco. La última semana estuve actualizado una gran parte del motor al detectar algunos errores muy graves en el código y que, yo, achacaba a una mala valoración de la posición. Me dí cuenta cuando incruste el código en otro para poder compilarlo en un PC y poder testear valor por valor. Desgraciadamente, esto me hizo que no pudiera testear el programa lo suficiente como para detectar algunos fallos antes de enviarlo a la DEV.
De hecho, lo más dificil que he encontrado al hacer este juguecillo ha sido precisamente ese, el testeo, hay infinidad de posibilidades que por una cosa u otra se te terminan escapando, y son muy dificiles de controlar. El defecto que has encontrado estaba resuelto, como digo en versiones anteriores, y dí por hecho que seguía perfecto después de modificar el motor.
Basícamente, todo deriva de que el programa es capaz de detecta cuantas piezas propias y contrarias dominan un determinado punto. Calcula que, SI tiene mayoría de piezas en ese punto, debe conseguir ventaja, y procede a la captura. Esto se hace muy fácil con una pequeña formulita que hace que coma con la pieza de menor valor, pero se ve que al tocar el código (esta última semana como he dicho) tambien he tocado algo que ha hecho que en vez de tomar con la pieza de menor valor lo haga con la de mayor valor.
En definitiva, es algo que se dónde está, se como resolver, y lo haré.
Tambien quiero hacer mucho hincapié en que es un programa que calcula a tan solo 1/2 jugada (si el programa tuviera una previsión de 3, 4 o 5 jugadas no caería en esos errores)
En cuanto al a detalles técnicos, ¿Puedes comentarnos cuántas líneas tiene el código C, si tiene algo de ASM inline y con qué lo has compilado?
Pues líneas no son muchas, sobre unas 2500 en puro C, solo tiene pequeñas rutinillas en ASM para el trato directo con el Hardware del MSX, y esta compilado con el SDCC.
En realidad el programa realiza muy pocos cálculos, basicamente cada posición la valora en función de unos criterios muy pero que muy sencillos. Simplemente apoyados por una función que es capaz de detectar la dominación por bando de los escaques (solo en cantidad, lo ideal hubiera sido también en calidad y ordenarlos de menor a mayor, pero no me daba para más).
En fin, he intentado hacer algo que sea medianamente jugable. Cuando hize las primeras pruebas, a una previsión de 2 jugadas, ejecutaba cada movimiento cada 5 minutos, y aún así no era lo suficientemente bueno, así que opté por cambiar de criterio y meterle solo a media jugada con criterios reales de valoración de la posición, con la idea final de trasladar el código para un ajedrez para PC pero aumentando los criterios de valoración y la profundidad, así, si con tan solo media jugada se defiende medianamente bien, al aumentar la profundidad de cálculo con los mismos criterios debería jugar francamente bien.
El código es muy mejorable, y posiblemente si pudiera transformar alguna función a ensamblador, a lo mejor se ganaría en velocidad, pero en principio la idea era hacer programa de ajedrez, y las mejoras si tienen que venir ya vendrán poco a poco.
Despues de todo este rollo, lo que más me gustaría que se valorase es que juega a media jugada y hace jugadas más o menos coherentes, que no es poco, y que cualquiera, sepa más de ajedrez o sepa menos, pueda echar un rato agradable con él.
En fin, me alegra tu sinceridad respecto al programa porque eso me ayudará a mejorarlo, sin duda
.