Semántica compleja del bote dividido para múltiples ganadores All-In con diferentes cantidades

Estoy escribiendo un software de servidor de póquer y bueno, quiero que sea preciso...

Básicamente, quiero saber cuál es la forma correcta de lidiar con esta siguiente situación:

[ second round of betting. everyone has already contributed 5 units to the pot ]
Player 1 raises the minimum bet to amount X (say 5 units)
Player 2 calls amount X (calls 5 units)
Player 3 has only a fraction of X. He calls All-in at this point and pays his remaining 3 units.
Player 4 has only a fraction of X. He also calls All-in at this point and pays his remaining 1 unit.
Player 5 folds.

El bote en este punto contiene 5 * 5desde la primera ronda de apuestas más 5 + 5 + 3 + 1unidades, lo que hace un total de ganancias potenciales de 39unidades.

Player 4 goes on to win.
Player 3 comes second.
Player 1 and 2 comes third, with their best five cards all coming from the table.

¿Cómo calculo cuánto dinero se distribuye y quién lo recibe? ¿Es correcta la siguiente afirmación o es inexacta y cómo?

Paso 1 : Clasificamos a los jugadores por sus cartas si todavía están adentro. Entonces obtenemos:

Player 4 (winner)
Player 3 (winner of remaining money)
Player 1 (split of remaining)
Player 2 (split of remaining)

Paso 2 : escaneamos esa lista para encontrar las contribuciones más grandes y crear una proporción.

Player 4 (6 units total)
Player 3 (8 units total)
Player 1 (10 units total)
Player 2 (10 units total)
-- Pot contains 39 units
-- Winners have contributed 34 units

Paso 3: Pregunta. ¿La proporción es contra el bote total... o los otros ganadores? ¿Es esto correcto? ¿Obtener una proporción en comparación con otros?

Player 4 gets contributed 6 units of 34 by other winners = eligible 17.647% of pot
Player 3 gets contributed 8 units of 34 by other winners = eligible 23.529% of pot
Player 1 gets contributed 10 units of 34 by other winners = eligible 29.412% of pot
Player 2 gets contributed 10 units of 34 by other winners = eligible 29.412% of pot
[ total adds up to 100% ]

Si lo hacemos en base al bote total... no en las contribuciones totales de los ganadores obtenemos:

Player 4 gets contributed 6 units of 39 of total pot = eligible 15.385% of pot
Player 3 gets contributed 8 units of 39 of total pot = eligible 20.513% of pot
Player 1 gets contributed 10 units of 39 of total pot = eligible 25.641% of pot
Player 2 gets contributed 10 units of 39 of total pot = eligible 25.641% of pot
[ total adds up to 87.18% ... so this is the wrong answer right? ]

Entonces, para continuar con el primer método... de calcular una proporción solo entre otros ganadores, alguien puede confirmar que el pago correcto de las 39 unidades sería:

Player 4 gets 6.88 units back `((39 units * 17.647) / 100)` ?
Player 3 gets 9.17 units back `((39 units * 23.529) / 100)`
Player 1 gets 11.47 units back `((39 units * 29.412) / 100)`
Player 2 gets 11.47 units back `((39 units * 29.412) / 100)`
[ total pay out of 39 units = 39 units ]

Así que mi pregunta es, ¿es precisa esta fórmula de bote dividido?

* EDITAR ------------------------------ *

Ok, esto es claramente incorrecto. Todos obtienen un pago igual a pesar de que 3 de ellos perdieron. Todo lo que obtienen es lo que apostaron a poner un poco más del jugador que se retira. Ahora creo que el algoritmo debería hacer lo siguiente:

Player 4 wins. Paid 6 units. Takes upto 6 units from every player (including folded players)
Player 3 wins. Takes remaining 1 unit from all players including folded players
Player 1 and 2 split the rest..

Esto da un resultado de:

Player 4 gets own Player 1's first 6, Player 2's first 6 ... All of Player 5's 5...
Total winnings for Player 4 is 29 units.

Player 3 gets to take winnings next. He contributed 2 units more than Player 3. So he takes 2 unit from everyone who has a unit still left in their pot.
Total winnings for Player 3 is 6 units.

Player 1 and Player 2 equally share the remainder giving them 2 units back each.

¿Es esto correcto?

Vale la pena comentar que para ganar contra un bote de 39 unidades, haber ido all-in con 6 unidades para recuperar menos de 7 es un poco cuestionable... por eso publico mi comprensión de la lógica aquí.
Su método es propenso a errores y difícil de mantener. Revisa mi respuesta :).

Respuestas (2)

Ya ha habido varias publicaciones aquí que explican cómo calcular los botes secundarios (tenga en cuenta que el tema de las ciegas de penalización no se ha tratado, pero ese es otro tema).

Aquí hay uno de esos temas:

¿Cómo se construyen las ollas laterales?

Pregunta. ¿La proporción es contra el bote total... o los otros ganadores? ¿Es esto correcto? ¿Obtener una proporción en comparación con otros?

La pregunta no tiene mucho sentido porque no estás expresando los botes secundarios como una "proporción" del bote total. No es así como se calculan los botes, las ganancias de los botes, la comisión de los botes y la "división del bote". Nunca estás expresando ganar como una proporción del bote total.

Lo que haces es calcular exactamente cuántos botes y botes secundarios hay y ver qué jugadores son elegibles para qué bote.

En tu ejemplo, hay exactamente tres botes:

  • bote 1: 29 (el bote uno también podría llamarse "bote principal")

  • bote 2: 6 (el bote dos también podría llamarse "bote lateral 1")

  • bote 3: 4 (el bote tres también podría llamarse "bote secundario 2")

La suma de todos estos botes da el bote total (39).

El bote 1 tiene 29 porque el jugador 4 es elegible para hasta "6". ¿Cuántos jugadores pusieron "hasta 6"? cinco jugadores Cuatro de los cuales pusieron 6 y uno de ellos (el jugador 5) que puso 5. Esto da 6 * 4 + 5 * 1.

haber ido all-in con 6 unidades para recuperar menos de 7 es un poco cuestionable

Eso sí que sería cuestionable. Afortunadamente esto no es en absoluto cómo funciona. El jugador cuatro recupera 29, por lo que obtiene una ganancia neta de 23 (29 - 6). También puede obtener ese 23 calculando: 3 jugadores que aciertan hasta 6 (18) + un jugador que acierta hasta 5 (18 + 5, da la ganancia neta de 23).

El bote 2 tiene 6 unidades porque es 2 * 3. Puedes verificar esto comprobando cuántos jugadores pueden hacer coincidir hasta 8 (solo hay tres jugadores que pueden hacer eso), y luego elimina lo que ya entró en el bote 1. Tres jugadores lo hicieron pon más de 6, entonces tienes 3 * 2.

El bote 3 tiene 4 unidades. Hay dos jugadores que pueden hacer coincidir hasta 10. Una vez que quitas de su pila lo que ya se destinó a los otros dos botes, quedan 4 unidades en el último bote.

El jugador 4 tiene la mejor mano y gana 29 (+23 netos)

El jugador 3 tiene la segunda mejor mano y recupera el bote 2, que solo tiene 6. Entonces, aunque el jugador 3 es un "ganador", está haciendo una red de -2 (puso 8 pero solo recibió 6). Esto es normal porque está "ganando", pero el jugador 4 aún lo vence.

Los jugadores 1 y 2 dividen el resto (bote 3), que tiene solo 4 unidades. Así que cada uno recupera 2 de sus 10 (pérdida neta: -8).

El jugador 5 perdió su 5. Pérdida neta: -5

Lo que da:

+23
 -2
 -8
 -8
 -5
---
  0

Lo que suma cero y lo cual es normal ya que, en ausencia de rake, el póquer es (en cuanto a las fichas) un juego de suma cero.

Como nota final, recomendaría usar la menor cantidad posible de cálculos decimales al implementar un cliente de póquer en línea: lo último que desea son errores de aproximación.

El único caso complicado es cuando los jugadores están dividiendo un bote. En algunos casos no hay problema (como arriba, donde dos jugadores comparten un bote parejo), pero en otros casos puede tener problemas... Por ejemplo, si tres jugadores comparten un bote que tiene 8 centavos (puede suceder en micro -límites). En ese caso, dos jugadores deben recuperar 3 centavos y uno de ellos debe recuperar 2 centavos (dar 2 / 2 / 4 sería un error). Simplemente no hay forma de evitarlo y, hasta donde yo sé, el jugador que obtiene solo 2 (mientras que los otros dos obtienen 3) se elige al azar.

Pero, una vez más, tratar de expresar cada bote como un % del bote total es una receta para errores de aproximación, así que no lo hagas.

Además, en todos los casos, sin importar cuántos botes haya, la cantidad exacta de cada bote se puede calcular con precisión, hasta el centavo.

Tenga en cuenta que puede haber casos complicados, como lo que debe hacer cuando un jugador coloca una "penalización ciega"... Básicamente son las fichas que puso, pero a diferencia de cualquier otra ficha que puso, en realidad no cuenta para determinando los distintos tamaños de bote (además del hecho de que la ciega de penalización se suma a uno de los botes).

@amigal: ah ah, gracias... Pero no tengo ningún mérito: me he visto obligado a lidiar con todo esto por un software de póquer que estoy desarrollando (un rastreador y HUD); ) En algunos casos, es complicado porque algunos sitios no escriben los detalles de los botes laterales (solo se muestra el monto total del bote) y es un poco complicado determinar los tamaños de los botes (lo cual es importante, por ejemplo, si desea calcular todo el bote). -en valor esperado, etc.). : )
Esta es una respuesta brillante @TacticalCoder. Siempre pensé que debido a que podías calcular una proporción en retrospectiva, podías calcularla por adelantado, pero ahora veo que no puedes. Gracias.

Codificar la gestión de sidepot a partir de las "reglas de sidepot" no es muy fácil. Habiendo hecho esto yo mismo, daré un algoritmo general en dos fases. Este enfoque no se preocupa por el tamaño del bote, por lo que cualquier superposición al bote, como las ciegas de penalización, es irrelevante. También podrá rastrillar los botes laterales en la secuencia adecuada si es necesario.

Administrar Sidepots

  1. Administra los sidepots al final de cada calle/ronda. El número de nuevos sidepots es simplemente uno menos que el número total de apuestas de diferentes jugadores, después de devolver las apuestas no igualadas al último agresor.
  2. Mantenga una lista del último bote adicional que cada jugador puede ganar.

Premios Sidepots

  1. Evalúe las manos, creando una lista de rangos de manos. Si el juego se divide en alto/bajo (p. ej., 8 o mejor), haga todos los premios bajos antes que los altos.
  2. Revisando sus sidepots, cree una lista de ganadores de un sidepot en particular (la lista consistirá en un solo jugador a menos que haya empates). Estos ganadores deben cumplir con la elegibilidad construida en la fase administrada. Tenga cuidado de no otorgar a los jugadores no elegibles partes de los botes en los que empatan por rango de manos (un error fácil que dependerá de su evaluador de manos).
  3. Otorgue a cada ganador su parte redondeada hacia abajo de cada premio adicional, la mitad de eso si se trata de un premio bajo, sacando el monto del premio de ese premio adicional (para que cuando ejecute Alto después de Bajo, no tenga que lidiar con la lógica de escisión).
  4. Distribuir el resto por acción. Es posible que desee comenzar desde la ciega pequeña o habrá una preferencia por el asiento cero. Si realiza correctamente los pasos 3 y 4, no debería haber errores de redondeo.

Calcular los botes secundarios en cualquier punto de la mano en función de la contribución de fichas del jugador es otra forma y probablemente la forma intuitiva. Sin embargo, debe recordar (a) mantener un recuento adicional del dinero muerto misceláneo y (b) incluir las contribuciones de los jugadores que se retiraron antes en la mano (el mayor inconveniente del método de contribución, en mi opinión).