Poker: analizador de manos II

Una vez que ya está planteado el camino a seguir, hace falta concretar un poco más. El siguiente paso es especificar el algoritmo que seguirá el programa. Básicamente, la entrada al programa son un conjunto de 7 cartas (cada carta tiene un número del 1 al 13 y un color de entre 4 posibles), y la salida debe ser el número de mano asociado a la carta según la tabla de las relaciones de equivalencia.

El algoritmo está planteado de la siguiente manera:

  1. A cada carta, le asociamos el valor asociado a su número según la tabla del post anterior.
  2. Sumamos todos los valores, y obtenemos una expresión única para cada combinación de cartas.
  3. Vamos a una tabla en la que esté cada expresión asociada a su valor, y lo leemos.

En principio, parece simple. Sin embargo, no lo es tanto, ya que existen dos inconvenientes:

  • Habrá que crear la tabla, y eso llevará tiempo. Notemos que la longitud de la tabla no será excesiva porque nos aprovechamos de que la suma es conmutativa y, por tanto, no importa el orden en que introducimos las 7 cartas, ahorrándonos muchos registros (ordenar las cartas de menor a mayor antes de evaluar la mano ralentiza el algoritmo, y en nuestro caso no hace ninguna falta).
  • ¡No hemos tenido en cuenta el color! Habrá que modificar nuestro algoritmo para que detecte este caso y lo tenga en cuenta.

La solución a estos dos obstáculos es la siguiente:

  • En el primer caso, para crear la tabla necesitaríamos crear un analizador de manos «a lo bruto»: uno que primero mirara si hay escalera de color. Si no, si hay poker. Si no, si hay full, etc. Después, calcular el número que le correspondería a cada tipo de mano en función de la mano concreta (poker de as, poker de K, etc.), y que el programa lo introdujese automáticamente. Este es un trabajo muy laborioso, pero afortunadamente ya está hecho: utilizando, una vez más, el código fuente del analizador de Cactus Kev’s, disponible en su página web, podemos automatizar este trabajo.
  • El segundo es más problemático, porque es un problema estructural. La mejor solución que he encontrado es comprobar en cada caso si hay color o no, y en caso de que haya color crear otra tabla como la anterior en la que sólo se tengan que sumar los valores de las cartas del color en cuestión. Para hacer más eficiente el proceso en cuestión, he tenido que hacer un proceso muy similar al anterior: a cada color le asigno un valor, según la siguiente tabla, y al sumar los valores una tabla preprogramada me dirá si hay 5 cartas o más del mismo palo, y cual es el palo

La tabla para los colores es:

Color: Corazones Picas Espadas Tréboles
Valor asignado: 1 8 57 400

Los valores son distintos en este caso que en la tabla del post anterior, porque en este caso no ponemos el 0 (ya que así podremos utilizar la misma tabla para evaluar manos de 5, 6 ó 7 cartas), y además ahora pueden aparecer hasta 7 cartas con el mismo color, a pesar de que solo pueden aparecer 4 cartas con el mismo número.

Quadcóptero I: Presentación del proyecto.

Este es el primer post de lo que espero que se convierta en un proyecto algo ambicioso: la construcción de un quadcóptero (por supuesto, DIY).

Un quadcóptero es un pequeño robot que es capaz de volar mediante 4 hélices, dispuestas en dos aspas. Además, debería llevar una batería y una unidad de control electrónica.

Un muy buen ejemplo de lo que me gustaría conseguir es:

Los principales problemas a los que habrá que enfrentarse, a priori, creo que serán:

  • La construcción física del quacóptero. Escoger materiales ligeros pero resistentes.
  • La elección de los motores y de las hélices utilizadas.
  • La elección de la batería.
  • El controlador electrónico, incluyendo:
    • El «cerebro», es decir, un microcontrolador para hacerlo autónomo.
    • Los sensores que proporcionarán la información como la velocidad, la inclinación, etc.
    • Un módulo de radiofrecuencia para que pueda ser controlado con un mando.

En principio, esto es lo que me parece lo mínimo para construir algo versátil. Una vez creado, ya se podrá pensar en incluirle una cámara o algún sensor de detección de obstáculos… pero no hay que aumentar la complejidad con características prescindibles.

La idea es hacerlo todo desde cero. Soy consciente de que puede que se tenga que comprar algo prefabricado, pero lo dejaré como última opción. No me propongo fecha de finalización, lo haré al ritmo que pueda. Además, siendo un proyecto tan extensible, probablemente será de esos que no se acaben nunca, ya que siempre habrá algo más que hacer y algo más que probar.

Ya veremos cómo sigue evolucionando!

 

Lineups.net: PHP y MySQL

Hoy me gustaría hablar un poco sobre programación web. Últimamente he estado desarrollando lineups.net, que es una página web que está dedicada a ofrecer alineaciones de partidos (en principio, solo de fútbol, pero ampliable a otros deportes).

El objetivo de la página es centralizar una información muy dispersa, ya que no es fácil encontrar las alineaciones de cada partido en un mismo sitio (sobretodo cuando hablamos de diferentes ligas extranjeras).

Técnicamente, está programada completamente en PHP y MySQL. La base es la estructura de la base de datos: tiene varias tablas (Arbitros, Equipos, Jugadores, Jornadas, Encuentros, etc.), que se modifican y se leen desde PHP.

Para realizar los archivos .php he utilizado el Netbeans, que es el IDE que utilizo normalmente. Para construir la base de datos, phpMyAdmin.

La página en sí aún no tiene una interfaz muy pulida. No obstante, dado que no seré yo quien introduzca los datos en la base de datos, y para facilitar el proceso, existe un menú de administrador al estilo de phpMyAdmin:

Menu Admin Lineups

Ahora que está ya casi acabada, creo que es un buen momento para comentar qué me ha parecido la integración entre PHP y MySQL: fantástica. Conociendo PHP y SQL (que son dos lenguajes de programación fáciles de aprender), no existe ninguna dificultad. Nunca antes había trabajado con SQL (y poco con PHP), pero no he tenido mucho problema con esto.

No obstante, no todo es tan agradable: a la hora de crear una interfaz visualmente atractiva, la mejor opción parece CSS. Eso sí, cuando empiezas a profundizar un poco, te das cuenta de que es un lenguaje muy difícil de manejar, muy poco intuitivo (ya que hay muchas variables que afectan al mismo parámetro, como por ejemplo la posición de un elemento), y además a día de hoy, el navegador Internet Explorer (sobretodo versiones anteriores a la 6), no aceptan el formato estándar. Esto quiere decir que no puedes programar las cosas una vez, sino que luego tienes que ir haciendo apaños (los conocidos hacks) para poder hacer tu página compatible con todos los navegadores existentes.

Por eso, animo a cualquiera que esté visitándome con Internet Explorer que cambie a otro navegador gratuito como Firefox, Google Chrome, Opera, o cualquier otro navegador de código libre y gratuito. Las ventajas son múltiples: mayor velocidad, menos spam, más compatibilidades y, sobretodo, evitar que Microsoft haga presión para modificar los estándares publicados por el W3C.

Poker: analizador de manos I

Un analizador de manos no es ni más ni menos que un programa que es capaz de determinar cual es la mejor mano de entre varias posibles en el juego del Poker. La gracia de conseguir un buen analizador de manos (es decir, uno que analice muchas manos en un corto espacio de tiempo) es que es posible determinar las probabilidades de ganar o perder en una partida en cualquier momento, simplemente probando todas las posibilidades (o, por lo menos, muchas).

Hace un tiempo me encontré con un analizador de manos de 5 cartas: el Cactus Kev’s Poker Hand Evaluator. Ése analizador se basa en el hecho de que sólo existen 7462 «categorías» de manos diferentes, dónde dos manos de la misma categoría empatan (es decir, es lo mismo tener full de ases a la K de corazones que full de ases a la K de tréboles. Por tanto, ambas manos están en la misma «categoría»). Gracias a eso, asigna a cada mano un número y, si obtiene el número asociado a dos manos, simplemente comparándolos será capaz de decir cual es la ganadora. Los detalles están en su página web.

A cada número se le asigna un número primo (desde el DOS = 1 hasta el AS = 41). Si suponemos que no hay color, simplemente multiplicando todos los números y mirando en una tabla hecha previamente, es casi immediato obtener el valor de dicha mano. El caso de que hubiese color se trata de forma separada. Está implementado en C y es posible descargárselo desde su página web.

No obstante, se me ocurrió una posible mejora: para aplicar la misma idea a 7 cartas, habría que evitar la multiplicación, ya que el número más grande que se puede conseguir (41^4 * 37^3 = 143133271933) ocuparía 38 bits. Si consiguiésemos bajar este número a 32, podríamos utilizar tan solo un int, mejorando con ello el rendimiento.

La idea se basa en sumar en vez de multiplicar: a cada número le asignaremos igualmente un valor, de tal manera que dos manos distintas den números distintos al sumar los valores de cada una de las cartas:

Carta: As 2 3 4 5 6 7 8 9 10 J Q K
Valor asignado: 0 1 5 24 112 521 2421 11248 52256 242769 1127845 5239688 24342288

Entonces, si suponemos que no hay color, el máximo número al que llegaremos será 113088216, que lo podremos almacenar en 27 bits! No obstante, aún hay que tener en cuenta que:

  • Para el caso en el que haya color tendremos que buscar algún método alternativo.
  • Hay que fabricar las tablas para después comprobar qué número tiene asiganada nuestra mano.
  • No podremos utilizar el analizador con manos de 8 cartas o más, ya que entonces aparecerían colisiones.

En las próximas entradas buscaremos como solucionar estos y más problemas que vayan surgiendo.

Editado. puedes descargar los archivos haciendo click aqui:

Analizador de manos de póker (Java)
466.0 KiB
270 Downloads
Details

Apuntes varios

Ya he colgado en la página web la mayoría de apuntes decentes que he hecho. Son apuntes de telecomunicaciones (ETSETB) y de matemáticas (FME). Por supuesto, todos gratis (con licencia GPL), así que están a vuestra disposición. Hay algunos en castellano y otros en catalán.

La mayoría los he hecho en colaboración con Kiko Rul·lan y con Adrià Recasens, sin cuyo trabajo no habría sido posible realizarlos.

Espero que sean útiles!

Hola Mundo!

Empiezo este blog con la intención de tener un sitio en el que colgar las cosas que me interesan. Creo que es un buen método para enseñar los proyectos que voy llevando a cabo (programación, electrónica, etc.), ya que un hace tiempo que quería organizar un poco  lo que he hecho y lo que voy haciendo.

La idea es ir organizando las entradas importantes en categorías, disponibles en cualquier momento, y ir organizando una página de descargas en la que estén disponibles todos los archivos de manera centralizada.

Por supuesto, son bienvenidos todo tipo de comentarios y críticas.

Espero que esta sea la entrada más difícil de escribir!