Testeando Ceibal-Chess sobre la XO real (veredicto: leeeento)

Aprovechando el haber conseguido una XO para traerme a casa el lunes pasado, y tras una o dos horas peleando para lograr conectarla al wifi de casa (tuve que cambiar la encriptación a WPA Personal con TKIP, nada más anda), decidí probar la versión más reciente de Ceibal-Chess sobre el Hardware real.

El proceso de empaquetado, por suerte, seguía funcionando apropiadamente, y bastó con ejecutar nuestro generador de bundles para obtener el archivo distribuible (el “instalador”) para la XO.

Probar el juego sobre el Hardware real es significativamente distinto que hacerlo sobre otros sistemas, principalmente por cuestiones del Hardware mismo: la pantalla es más pequeña, el procesador más lento y la memoria más chica.

Si bien el juego comienza siendo jugable de forma apropiada, tras unas pocas jugadas, el manejo de eventos (capturar el click para seleccionar y luego mover una pieza) se vuelve demasiado lento, ciertamente por debajo de lo aceptable.

Recuerdo que Pablo Flores habría probado una versión anterior de Ceibal-Chess sobre su XO y me comentó que la maquinita podía manejarlo bien, entonces allí me surguió la duda de qué podría haber cambiado del juego desde que él lo probara de forma que, a medida que jugamos, se vuelve más y más pesado.

Haciendo memoria, resulta que el cambio principal realizado consistió en agregar la evaluación de jugadas hipotéticas para filtrar los movimientos inválidos del juego. Las reglas del ajedrez prohíben mover una pieza que está protegiendo al Rey de ser atacado. El programa debía implementar esta funcionalidad, sin embargo, para hacerlo debemos determinar si al mover una pieza a una determinada posición, el Rey entraría en Jaque.

La forma en que esto se hace consiste primero en determinar todos los movimientos válidos de la pieza seleccionada (el peón en nuestro ejemplo), luego generar un nuevo tablero “hipotético” para cada uno de los movimientos posibles y finalmente determinar si el Rey se encuentra en Jaque en ese tablero. En caso de estarlo, el movimiento se descarta.

Para determinar si el Rey está en Jaque, se evalúan todos los posibles movimientos del adversario, determinando si el Rey se encuentra comprendido dentro de alguno de ellos. Para calcular los movimientos debemos volver a invocar nuevamente nuestra función. Veamos esto gráficamente:

Seleccionar Pieza -> Calcular Movimientos -> Generar Tableros Hipotéticos -> Determinar Jaque para cada tablero -> Calcular Movimientos.

Resulta que calcular los movimientos de una pieza es una función recursiva! Una función que además aumenta la cantidad de tableros hipotéticos generados dependiendo de la cantidad de movimientos que la pieza seleccionada puede hacer.

Cuando el juego inicia, solo los peones se pueden mover y hacia adelante 1 o 2 pasos, por lo cual el número de tableros hipotéticos generados se mantiene bajo. Pero a medida que se comienza a entablar la batalla, las piezas podrán estar en cualquier orden y seguramente generarán una cantidad mayor de tableros hipotéticos, haciendo que Calcular Movimientos ejecute muchas veces y recursivamente, consumiendo casi todo el procesador de la XO.

Claramente este problema debe ser solucionado. De momento se me han ocurrido dos alternativas: manejar un caché de movimientos, intentando realizar el cálculo de los movimientos de la pieza que seleccionamos una sola vez (igual será lento la primera), o bien, reimplementar el cálculo de movimientos en C o C++, brindando la velocidad asociada a la ejecución nativa  a esta función, pero al costo de deber volver a implementara, testearla y de deber tener mucho cuidado de no romper la portabilidad del código (actualmente Ceibal-Chess puede ejecutar en cualquier plataforma que disponga Python y Pygame). Una tercer alternativa implicaría una implementación en C o C++ con caché.

Aún me encuentro duda de cuál será el mejor enfoque, pero lo que es seguro es que debemos proveer una solución a esto antes de poder liberar la versión 1.0.

This entry was posted in ceibal-chess. Bookmark the permalink.