Wednesday, November 05, 2014

Programación lúdica: Piezas de ajedrez, ¿imágenes o sprites?


Ayer estaba revisando algunos de los programas de código abierto y libre, que permiten usar una base de partidas de ajedrez, y que sirven para estudiar las aperturas, el medio juego, los finales, a ciertos jugadores en particular, etcétera. Hay varios manejadores de partidas gratuitos y desde luego, otros comerciales, pero el que me pareció más interesante, de la primera categoría, es "José", presumiblemente llamado así en honor de José Raúl Capablanca, campeón del mundo de ajedrez (de 1921 a 1927, en donde perdiese el título ante Alexander Alekhine, en la ciudad de Buenos Aires, Argentina, en  uno de los encuentros más emocionantes de todos los tiempos).

José, como Scid y otros programas de esta naturaleza, más o menos tienen las mismas características. Unos hacen alguna cosilla que otro programa no hace y viceversa. Vale la pena si alguien quiere estudiar ajedrez de esta manera moderna y sin tener que gastar miles de pesos en comprar programas comerciales. Sin embargo, cuando vi la interfaz de "José", me pareció muy bien hecha y noté algo curioso: las piezas del tablero estaban hechas con los tipos de letra truetype. Pensé que esto era una buena idea, porque si quiere alguien escribir un programa que despliegue un tablero de ajedrez, ya no tiene que dibujar las piezas, sino que las toma de algún tipo de letra de esta naturaleza (de los cuales hay muchos gratuitos y de paga incluso).


Obsérvese el tipo de letra, el que están viendo en la imagen de "José" es "Chess Merida", de Armando H. Marroquín, un diseñador de fonts mexicano que ha escrito muchos tipos de letra diferentes para enriquecer la tipografía de ajedrez y que los ha puesto en forma gratuita en este sitio.

Aparentemente el programador de José, Peter Schaefer, toma los tipos de letra y los usa como si fuesen imágenes de las piezas de ajedrez.  El programa puede usar otros tipos de letra, por lo que claramente no sacó una imagen de cada una de las piezas para así usarlas en sus tableros gráficos. Idea sumamente interesante. ¿Cómo es que lo hace?

Decidí sentarme a averiguar esto y encontré que lo que había que hacer es mandar cadenas de caracteres (en este caso una letra, que simbolizara la pieza correspondiente) a una imagen (que tuviese el tablero de ajedrez dibujado). El código en Delphi es poco menos que trivial:

Pero oh sorpresa, el resultado que hallé fue el lo mismo que hace Gijsbert Wiesenekker en su programa de ajedrez "ZZZZZZ" escrito en Delphi.


Nótese que cada pieza (que es un caracter del tipo de letra Chess Mérida), hace transparente en toda la letra, no solamente en el entorno como en José.

Pensé entonces que Schaefer debe estar usando sprites, que son un tipo de mapa de bits dibujados en la pantalla de la computadora, particularmente para el modo gráfico, por ejemplo el cursor del ratón. Esto es posible ya que se puede hacer una operación lógica OR o AND entre la imagen original y otra, y dejar el resultado en otra posición de memoria. De esta manera es sencillo cambiar colores o eliminar el fondo mediante una "máscara". Da la impresión que José lo hace de esta forma, pero noté que también puede reducir la imagen del tablero y en consecuencia las piezas también se hacen más chicas.

Ahora mismo estoy tratando de entender cómo hacer sprites en Delphi y ver si el autor genera las imágenes de las piezas tomando los tipos de letra, haciéndolos bitmaps con su respectiva máscara para poderlos mover en la pantalla.  Finalmente solamente tiene que hacer doce (seis piezas blancas y seis piezas negras). Tal vez se pueden hacer al vuelo, aunque esto no explica cómo es que las escala adecuadamente en tiempo de ejecución.

El reto es ahora hacer un programa que pinte un tablero de ajedrez, con las piezas como José las define (usando los tipos de letra TTF). El autor debe explicarme qué técnica siguió y haciendo un programa que ejemplifique esto, pudiendo el usuario (yo en este caso), cambiar el tipo de letra (como pasa en José). El programa no tiene que estar en Delphi, aunque sería deseable.

La pregunta es pues, ¿cómo hace José este tipo de imágenes de las piezas?
 
¿El premio de este reto? Una taza con el logotipo de la Morsa a la mejor solución. Esto solamente aplica a los programadores que vivan en el DF (mandar a provincia o a otros países una taza es estúpidamente costoso). En caso de que los concursantes sean de otros países o de la provincia mexicana, el premio será una memoria USB de al menos 8 GBytes y se les enviará por correo certificado. Y sí, sé que no son los grandes premios pero esto es lo que hay por el momento. Evidentemente quien gane será anunciado aquí y hasta tendrá sus quince minutos de fama. La decisión es inapelable.

Cabe señalar que este concurso busca simplemente alentar el trabajo de la programación y mostrar que puede ser lúdica. Es un concurso de buena fe. El ganador cede su código fuente a la comunidad. Es decir, se promueve el código abierto. Programas copiados de la web o que tengan ese sabor sospechoso de plagio podrán ser eliminados sin mayores consideraciones. El chiste de estos retos es que los programadores se animen a resolverlos, no que busquen la manera de hacer trampa. ¡Así que a afilar sus habilidades de programación!

Referencias:

José Chess database
ZZZZZZ

No comments: