No estoy seguro de haberte entendido del todo...
No solo no es mala idea obtener por combinatoria todas las manos, si no que es mucho más eficaz ya que reduce sensiblemente el análisis de cada mano, las funciones de verificación se resumen en 3 o 4 muy simples.
De hecho es lo que yo haría, pero con dos indicaciones que fijan y minimizan el problema:
* Solo para las manos que retienen un valor. De este modo cada mano se asocia a un hash, el resto solo manteienen el valor (negativo) de la carta más alta, HASH = 0)
* El cálculo del hash se divide en dos pasos (cuando se encuentra una posible mano). En el paso 1, se simplifica el cálculo al no considerar palos-color. Si se localiza es una mano (se considera potencialmente de momento), la segunda fase determina si cumple los requisitos de color siendo que esa figura lo exija, si no lo cumple se descarta (por ejemplo con un valor negativo (menos 13)).
Esto simplifica enormemente el análisis a base de una preparación inicial (y única) y la división en dos partes permite que el número de combinaciones resultantes sea totalmente asequibles.
El hash podría calcularse como la multiplicación de valores de cada carta. Dado que el 1, no altera una multiplicación para el caso de calcular el hash, cada carta debería sumar 1 a su valor natural, o bien intermente asignar siempre 1 valor más a cada carta (lo que resulte más transparente y menos costoso, creo que sería lo primero).
Sabiendo el número máximo de cartas que recibe un jugador (pongamos 5) y que el valor más alto es el rey (13+1) pero que solo hay 4 reyes, entonces el hash mas alto sería: 14*14*14*14*13 = 499.408 que es un valor manejable, y por tanto no habría problema en mantener un array (en la banca) de hasta 500.000 donde se guarda que figuras ofrece cada mano. Dicho array por tanto mantiene un valor numérico, conforme asignado conforme a la siguiente enumeración (es un ejemplo, se puede modificar al gusto)
enumeracion figuras
CARTA_ALTA= 0 // en realidad valor de la carta más alta con signo negativo, pero este es el valor que se guarda en el array
PAREJA = 2
TRIO = 4
DOBLE_PAREJA = 8 + 2 // tienes doblepareja pero también una sola pareja,
FULL = 16 + 8 + 4 + 2 //full, pero también, hay doble pareja, pareja, y trio
POKER = 32 + 8 + 2 // doblepareja del mismo valor (4 naipes del mismo valor).
COLOR = 64 // 5 cartas del mismo color
ESCALERA = 128 // 5 cartas consecutivas
ESCALERA_COLOR = 256 + 128 + 64 // Cinco cartas consecutivas del mismo palo
ESCALERA_REAL = 512 + 256 + 128 + 64 // escalera de color del 10 al as.
fin enumeracion
Así tu función de hash, podría ser algo como:
entero = Hash(carta1, carta2, carta3, carta4, carta5) // o bien pasar el array de cartas del jugador, con el número de cartas que contiene (habrá juegos con diferente numero de cartas, aunque convencionalmente suelen ser 5).
entero temp = (carta1 + 1) * (carta2 +1) * (carta3 +1) * (carta4 +1) * (carta5 +1)
entero resultado = ArrayValor(temp) // el array precalculado al inicio (una sola vez).
si (resultado = 0)
Si BuscarColor(carta1, carta2, carta3, carta4, carta5) = false
devolver (-1 * BuscarValorCartaMasAlta(carta1, carta2, carta3, carta4, carta5)
sino
devolver = COLOR // valor 64, esto puede interesar para decidir el descarte para intentar buscar escalera de color.
fin si
Sino
// en el array cada 'mano cuyo Valor es Dependiente De Color', se el suma 1, así estos son impares...(mayor que 2).
si ((resultado and 1) = 1) // )
resultado = RevisarSiManoCumpleRequisitosdeColor(resultado, carta1, carta2, carta3, carta4, carta5)
// si mano cumple resultado podría aumentar el valor, por ejemeplo ante una posible escalera (128), pasa a ser de color (suma 256) y si además es de color investigar si es real (si suma 512).
fin si
fin si
devolver resultado
fin funcion
Jugando con 52 cartas y tomando solo 5 de ellas cada vez, el número de combinaciones posibles es: 52*51*50*49*48 = 311.875.200. Este es el número máximo de combinaciones distintas de manos que existen. Si bien, dado que hay más jugadores y la banca... durante el desarrollo del juego el número de combinaciones posibles se reduce enormemente (dado también las cartas salidas y las que se tienen actualmente).
Por otro lado, como estamos hablando de no considerar en el primer paso, diferencias entre palos. Las combinaciones como hemos dicho anteriormente no alcanzan las 500.000, desde 2*2*2*2*3 = 48 hasta 14*14*14*14*13 = 499.408 (desde poker de ases hasta poker de reyes)
El valor 2*2*2*2*? = POKER (de ases, recuerda que sumamos 1 al valor de cada carta, para que no existan multiplicaciones *1)
Podemos reducir las combinaciones si decidimos no aumentar ese 1 al valor de cada carta a condición de que cuando aparezca un as, se haga más código para identificar parejas, trios y póker, ya que en ese caso las combinaciones quedarían como: 13*13*13*13*12 = 342.732
Ahora bien, 350.000 frente a 500.000 a cambio de simplificar el código, es preferible el array de 500.000.
Así a bote pronto, no he verificado si diferentes productos (a la hora de calcular el hash) de la mano actual de un jugador pueda dar el valor equivalente al de una mano de valor. Que seguramente sea posible, en ese caso habría que minimizar tal posibilidad asignando valores númeriscos distintos a ciertos naipes...
Un forma rápida de verificarlo es calcular las combinaciones, desde 2*2*2*2*3, 2*2*2*2*4...2*2*2*2*14 hasta 14*14*14*14*2, 14*14*14*14*3...14*14*14*14*13, OJO: No se precisan calcular los 311millones, si se pasan siempre las cartas ordenadas de menor a mayor, se eliminan todas las repeticiones (2*2*2*2*3 = 2*2*2*3*2 = 2*2*3*2*2 = 2*3*2*2*2 = 3*2*2*2*2, esta tiene 5 repeticiones, pero si son todos valores distintos, hay hasta 120 repeticiones (1*2*3*4*5)...
...entonces vas desde la combinación 2*2*2*2*3 hasta 13*14*14*14*14,
LUEGO EL TOTAL de combinaciones (a considerar como no repetidas a bulto) SON: (52*51*50*49*48) / (1*2*3*4*5) = 2.598.960
Puesto que hablamos de 350.000 indices sobre un array de 500.000 y hay unas 2'6millones de firmas únicas de manos, es claro que hay valores repetidos con la forma de calcular el hash. Hay que tomar decisiones a la hora de decidir como evitar o diferenciar esas colisiones...
p.d.: Se ha cambiado el signo '+' por el signo '*', donde ponía: (52+51+50+49+48) / (1*2*3*4*5) = 2.598.960, es: (52*51*50*49*48) / (1*2*3*4*5) = 2.598.960, como el propio resultado resume.