La única forma que se me ocurre es haciendo arrays con las posibles convibaciones, pero sería una locura hacer un array para cada convinación posible. Tiene quer haber alguna forma de saber que cartas me sirven.
Se me ocurre una idea, pero muy general y sin detallar. Habría que verla despacio y pensando bien. Sería lo siguiente. Si una carta la representas con dos caracteres, por ejemplo el primero el palo, del 0 al 3, o 'T,D,C,P', y la carta con otro carácter por ejemplo, 1,2,3,4,5,6,7,8,9,0,J,Q,K, con 1 = As y 0 = 10. Con esa convención una mano de cinco cartas podría representarse con un arreglo de 10 caracteres, por ejemplo:
{D,4,D,J,T,A,P,6,C,2} sería una mano de:
- el 4 de diamantes: D4
- la J de diamantes: DJ
- el As de tréboles: TA
- el 6 de picas: P6
- el 2 de corazones: D2
Ahora se podría construir un algoritmo que leyese los caracteres del arreglo, los pares, 0,2,4,6,8 serían el palo, y los impares 1,3,5,7,9 serían la carta. Y leyendo las repeticiones de cartas se obtendrían las parejas, trios,...; o las sucesiones válidas, 2,3,4,5,6, etc, las escaleras. Igual con los palos, si hay cinco repeticiones de C sería como minimo un 'color' de corazones, ya viendo su hay una sucesión válida de cartas podría ser una escalera de color.
El algoritmo tendría su trabajillo pero desde luego nada que ver con escribir todas las combinaciones posibles, cosa que, me temo sería imposible.
También te dejo este enlace por si te puede ser útil. Yo me he bajado el texto, pero ún no lo he leído; pero tiene buena pinta.
https://openlibra.com/es/book/desarrollando-con-java-8-pokerEDITO:Es mala idea usar para las cartas esos caracteres. Mejor usar enteros. Eso sí, como se son enteros pequeños se pueden usar char, pero no por su valor de signo ('1'...'J'...'K') sino por su valor numérico. Mejor usar los valores enteros 1,2,.., 10, 11, 12, 13. Con independencia de que al representar en pantalla el 12 sea la "Q", el 13 el"K", el 1 el"A". Pero internamente usar sus valores numéricos.
Así el algoritmo para detectar escaleras sería mucho más fácil. Sólo habría que comprobar que a partir de la tercera carta, la carta fuese el entero anterior + 1. Por ejemplo que fuesen 4-5-6-7. Y después comprobar dos condiciones alternativa (OR): que el valor de la segunda carta fuese también = al valor de la primera +1 (en este caso 3) o que la primera carta fuese el entero 1; ya que en póker el As abre cualquier escalera. Así se detectarían las dos posibles escaleras:
3-4-5-6-7
A-4-5-6-7
Y luego para determinar cual escalera gana a otras habría que codificar varias cosas:
- que entre dos escaleras primero gana la que mayor nº
último tenga
- que entre dos escaleras que terminan en el mismo nº gana aquella que NO empiece por 1 (la 6-7-8-9-10 gana a la A-7-8-9-10)
- que la escalera 1-10-11-12-13 (A-10-J-Q-K) gana a cualquier otra, ya que en realidad es la
(10-J-Q-K-A)
También para los palos quizá fuera mejor usar enteros 0-3 o 1-4 mejor que los caracteres T,D,C,P ya que -quizá- pudiera construirse algún algoritmo basado en un
for mejor que comparar con las letras correspondientes. A lo mejor también puede construirse un switch-case, con lo que daría igual usar las letras. Como digo esto son comentarios generales. Una vez puesto a la faena ya se verá qué puede ser más conveniente o eficiente. Es sólo por sugerir una vía sin precisar demasiado.