Tengo un algoritmo para calcular si la mano de un jugador tiene una escalera en Texas Hold'em. Funciona bien, pero me pregunto si hay una manera más simple de hacerlo que no involucre matrices/cadenas de conversión, etc.¿Hay una manera más simple que esto de calcular una escalera en el póker?
Aquí hay una versión simplificada de lo que tengo. Digamos que el jugador recibe una mano que es una matriz de 52-elemento de valores de las cartas:
var rawHand = [1,0,0,0,0,0,0,0,0,0,0,0,0, //clubs
0,0,0,0,0,0,0,0,0,0,0,0,0, //diamonds
0,1,1,0,1,0,0,0,0,0,0,0,0, //hearts
0,0,0,1,0,0,0,0,1,0,0,0,0];//spades
A 1 representa una tarjeta en la que la ranura de valor. La mano de arriba tiene 2 palos, sin diamantes, 3 corazones, 4 corazones y 6 corazones, 5 palas y 10 palas. Ahora lo miro para encontrar una escalera.
var suits = []; //array to hold representations of each suit
for (var i=0; i<4; i++) {
var index = i*13;
// commenting this line as I removed the rest of its use to simplifyy example
//var hasAce = (rawHand[i+13]);
//get a "suited" slice of the rawHand, convert it to a string representation
//of a binary number, then parse the result as an integer and assign it to
//an element of the "suits" array
suits[i] = parseInt(rawHand.slice(index,index+13).join(""),2);
}
// OR the suits
var result = suits[0] | suits[1] | suits[2] | suits[3];
// Store the result in a string for later iteration to determine
// whether straight exists and return the top value of that straight
// if it exists; we will need to determine if there is an ace in the hand
// for purposes of reporting a "low ace" straight (i.e., a "wheel"),
// but that is left out in this example
var resultString = result.toString(2);
//Show the result for the purposes of this example
alert("Result: " + resultString);
El truco aquí es para los diversos trajes por lo que solo hay una representación de 2 a As. ¿Me equivoco al pensar que debe haber una forma más simple de hacer esto?
Parece bastante simple para mí, ¿cuánto más simple crees que podría ser? Con el fin de detectar la rueda, simplemente insertaría una copia del último elemento de cada conjunto de trajes en la parte delantera de la matriz antes de juntarlos. Luego puede buscar el resultado de la cadena para '11111'. –
podría ser más rápido con el uso de un revés while/for loop 'for (var i = 3; i -;) {...}' – vol7ron
@Larry Lustig: Es la línea de análisis que yo pensaba que podría ser más simple. Ya sabes, como en "tal vez si fuera mejor en esto, no tendría que convertir a una matriz => cadena => int y luego volver a una cadena" ... – Robusto