Creando programa ""Flopzilla"" + ""Equilator""

    • santaka
      santaka
      Bronce
      Registro: 09-01-2008 Artículos: 6.451
      Hola a todos

      Estoy intentando desarrollar una aplicación, que una vez terminada me gustaría compartirla con todos.

      Muchos conoceréis el programa Flopzilla, que calcula la probabilidad de ligar diferentes fuerzas de mano en el flop, a partir de la selección de un rango y tipo de flop.

      Yo no tengo mucha idea de programación. Soy ingeniero agrónomo, solo que en su día aprendí algo de C++ online y ahora me he cogido una asignatura de libre de programación en java (por puro placer xD )

      En un principio, quiero hacer un programa muy similar al Flopzilla, pero cuando lo termine, me gustaría ampliarlo y hacer un Flopzilla+Equilator, que nos diga la probabilidad de que el villano hitee cierta fuerza de mano y la équity que tenemos nosotros con nuestra mano vs ese rango.

      Como seguramente me surgirán muchos problemas de programación, he abierto este post para los que tengáis un poco de tiempo os paséis a ayudarme.

      De momento he conseguido simular todos los flops, y que metiendo una mano, nos evalue que % de veces ligamos ciertas fuerza de mano. Os pongo dos ejemplos del funcionamiento del programa hasta ahora:

      Teniendo en nuestra mano: 2 of Diamonds / 3 of Hearts
      Probabilidad de Set: 0.0
      Probabilidad de Poker: 0.010204081
      Probabilidad de Flush: 0.0
      Probabilidad de FD: 2.2448978
      Probabilidad de FH: 0.091836736
      Probabilidad de set o mejor: 0.10204082
      Overpair: 0.0
      TopPair: 0.045918368
      Trips: 1.3469387

      Teniendo en nuestra mano: 7 of Diamonds / 7 of Hearts
      Probabilidad de Set: 10.77551
      Probabilidad de Poker: 0.24489795
      Probabilidad de Flush: 0.0
      Probabilidad de FD: 2.2448978
      Probabilidad de FH: 0.9795918
      Probabilidad de set o mejor: 12.0
      Overpair: 5.8163266
      TopPair: 0.0
      Trips: 0.0


      Ahora estoy haciendo los diferentes métodos para que evalúe las fuerzas de manos más importantes. Luego pasaré a hacer que calcule probabilidades combinadas, y finalmente haré que no solo evalue una mano, sino que evalúe un rango completo y que calcule el % de ligar las fuerzas de mano que nosotros le indiquemos.

      Espero que todo salga bien jeje. Todo esto lo hago también porque me gusta mucho y me entretiene.

      EDITO: También porque el flopzilla es de pago, y así nos ahorramos todos unos $ jeje.


      Un saludo ;)

      Santaka
  • 46 respuestas
    • santaka
      santaka
      Bronce
      Registro: 09-01-2008 Artículos: 6.451
      Mira, ya he encontrado un error, con el ejemplo de 32 que puse nunca puedo ligar TP, porque si tengo TP entonces tengo Poker (333) o FH (332 / 322)

      Voy a ver si lo arreglo

      EDITO: Arreglado. He metido en el método de TP que solo lo compruebe si no tenemos FH.

      Teniendo en nuestra mano: 3 of Diamonds / 2 of Hearts
      Probabilidad de Set: 0.0
      Probabilidad de Poker: 0.010204081
      Probabilidad de Flush: 0.0
      Probabilidad de FD: 2.2448978
      Probabilidad de FH: 0.091836736
      Probabilidad de set o mejor: 0.10204082
      Overpair: 0.0
      TopPair: 0.0
      Trips: 1.3469387


      Un saludo
    • guillermo81
      guillermo81
      Bronce
      Registro: 07-16-2008 Artículos: 4.407
      Hola santaka , yo no se nada de programacion pero te deseo exitos con el proyecto!.
      saludos
      guillermo
    • TheRipper71
      TheRipper71
      Bronce
      Registro: 08-16-2009 Artículos: 1.737
      Santaka, lo he estado mirando, pero tengo el Flopzilla pasado de fecha.

      Cuando tienes 77 has considerado que en los flops tipo 444 es FH, ya que sino cuentas estos flop, la probabilidad es 0,73xxx%.
    • santaka
      santaka
      Bronce
      Registro: 09-01-2008 Artículos: 6.451
      original de TheRipper71
      Santaka, lo he estado mirando, pero tengo el Flopzilla pasado de fecha.

      Cuando tienes 77 has considerado que en los flops tipo 444 es FH, ya que sino cuentas estos flop, la probabilidad es 0,73xxx%.
      si, tienes razón. Dentro del método de FH comprueba el FH tipo flop 444 y luego FH en los flops doblados. He pensado que voy a diferenciar esos dos FH.

      Por ejemplo, en el FlushDraw, comprueba el FD cuando tenemos una mano suited y el FD cuando tenemos una mano offsuited, en cuyo caso tienen que salir 3 cartas del mismo suit. Esos dos FlushDraw tambien lo separare en 2 metodos diferentes.


      Gracias TheRipper :)

      EDITO: Poco a poco voy ampliando los metodos de evaluacion:

      Teniendo en nuestra mano: J of Diamonds / T of Hearts
      Probabilidad de Set: 0.0
      Probabilidad de Poker: 0.010204081
      Probabilidad de Flush: 0.0
      Probabilidad de FD: 2.2448978
      Probabilidad de FH: 0.091836736
      Probabilidad de set o mejor: 0.10204082
      Overpair: 0.0
      Trips: 1.3469387
      Dobles: 2.0204082
      TopPair: 15.183674
      MidPair: 12.306123
      BottomPair: 1.4693878
    • ditou26
      ditou26
      Bronce
      Registro: 02-29-2008 Artículos: 6.746
      go go go
    • marcos25
      marcos25
      Bronce
      Registro: 02-02-2009 Artículos: 1.839
      yo no entender.. :s_confused:
    • santaka
      santaka
      Bronce
      Registro: 09-01-2008 Artículos: 6.451
      Ahora me toca una parte un poco chuga: Straight y OESD.

      Voy a escribir aquí para centrarme un poco y voy a empezar con la escalera

      Para evaluarlo primero va a depender de la mano que llevamos nosotros. Si la mano es 3 gapped, solamente se puede forma una escalera. Entonces bastaría con comprobar que el valor de una de las cartas de nuestra mano menos el valor de la otra es = 4.

      Ahora, con una mano 3 gapped, para tener escalera, necesitamos que el flop sea consecutivo. Para ello, voy a crear un método en la clase flop que se llame "esConsecutivo()". Por último con comprobar que el TopCard() de nuestra mano menos la TopCard del flop es igual a 1.


      EDIT1:

      Vale, perfecto, me da el valor correcto:

      Teniendo en nuestra mano: A of Diamonds / T of Hearts
      Straight: 0.3265306


      Esto era lo más sencillo, ahora se empieza a complicar la cosa. Ahora tengo que considerar una mano 2 gapped. El problema es que hay diferentes 2 gapped, AQ y A4 solamente pueden formar 2 escaleras, mientras que el resto pueden formar 2

      T7 puede formar 986 y J98
      AQ solo KJT
      A4 solo 235

      Primero comprobamos que la mano sea 2 gapped:

      mano.TopCardValue() - mano.BottomCardValue = 3

      Para las que NO son AQ y A4, las comprobaciones que debería hacer, son:

      - Para la primera escalera
      mano.TopCardValue() - flop.TopCardValue() == 1
      mano.TopCardValue() - flop.MidCardValue() == 2
      mano.TopCardValue() - flop.BottomCardValue() == 4

      - Para la segunda escalera
      mano.TopCardValue() - flop.TopCardValue() == -1
      mano.TopCardValue() - flop.MidCardValue() == 2
      mano.TopCardValue() - flop.BottomCardValue() == 4

      Ahora que lo pienso, para AQ y A4 es lo mismo, es decir, por ejemplo, con AQ la primer escalera dará true, y con A4 la segunda comprobación dará true. Así que al final eso debería ser suficiente para las masno 2 gapped

      Ahora que lo pienso, voy a hacer un método dentro de mano, para que me diga si es no gapped, 1 gapped, 2 gapped o 3 gapped



      EDIT2:

      Vale ya está, funciona perfecto. Con AQ y A3 me da el mismo valor que 3gapped (1 escalera) y con el resto me da el doble (dos escaleras).

      Ahora toca las 1 gapped.

      T8 puede formar 976, J97, QJ9

      - Para la primera escalera
      mano.TopCardValue() - flop.TopCardValue() == 1
      mano.TopCardValue() - flop.MidCardValue() == 3
      mano.TopCardValue() - flop.BottomCardValue() == 4

      - Para la segunda escalera
      mano.TopCardValue() - flop.TopCardValue() == -1
      mano.TopCardValue() - flop.MidCardValue() == 1
      mano.TopCardValue() - flop.BottomCardValue() == 3

      - Para la tercera escalera
      mano.TopCardValue() - flop.TopCardValue() == -2
      mano.TopCardValue() - flop.MidCardValue() == -1
      mano.TopCardValue() - flop.BottomCardValue() == 1


      A la carga!


      EDIT3:

      Todo bien, excepto una cosa. El problema es que el A tiene valor 14, por lo que A3 no lo considera 2 gapped por ejemplo, y ninguna de las comprobaciones da true ?( . Así que habrá que hacer alguna chapucilla con A2-A5


      EDIT4:

      Buff, lo dejo por hoy, el maldito A que puede formar escaleras por arriba y por abajo... me está jodiendo jajaja.



      Un saludo
    • osv777arg
      osv777arg
      Bronce
      Registro: 04-03-2009 Artículos: 76
      Esto es chino basico para mi!!
      pero enhorabuena despues vendelooo y te llenas de plata
    • santaka
      santaka
      Bronce
      Registro: 09-01-2008 Artículos: 6.451
      Hola

      Hoy voy a intentar acabar con el Straight y OESD. Me parece que la forma de solucionar lo del A (que puede formar escaleras por arriba), es que compruebe si hay Escalera cuando el A tiene valor 14 (por arriba) y cuando el A tiene valor 1 (por abajo).

      Después de comer lo intentaré.

      El OESD va a ser más sencillo, porque solo hay que tener en cuenta que salgan 2 cartas para cada tipo mano (0,1,2,3 gaps) y poner que no haya escalera: !this.Straight()

      Voy a comer y luego os cuento qué tal.

      De momento calcula esto:

      Teniendo en nuestra mano: A of Diamonds / 5 of Hearts
      Probabilidad de Set: 0.0
      Probabilidad de Poker: 0.010204081
      Probabilidad de Flush: 0.0
      Probabilidad de FlushDraw: 2.2448978
      Probabilidad de FullHouse: 0.091836736
      Probabilidad de set o mejor: 0.10204082
      Overpair: 0.0
      Trips: 1.3469387
      Dobles: 2.0204082
      Pair: 28.959185
      TopPair: 15.489796
      MidPair: 6.612245
      BottomPair: 6.8571424
      Overcards: 1.112245
      Straight: 0.3265306


      Un saludo ;)

      Santaka
    • TheRipper71
      TheRipper71
      Bronce
      Registro: 08-16-2009 Artículos: 1.737
      Santaka, has pensado en las gutshots y en las dobles gutshots :) .
      Con 5gap te puede salir una doble gutshot, ej:

      28 flop: 456.
    • santaka
      santaka
      Bronce
      Registro: 09-01-2008 Artículos: 6.451
      original de TheRipper71
      Santaka, has pensado en las gutshots y en las dobles gutshots :) .
      Con 5gap te puede salir una doble gutshot, ej:

      28 flop: 456.
      Yeah! Ya lo había pensado. Para comprobar eso voy a crear otras funciones, tanto para las gutshots, como para las doble gutshots.

      Gracias por recordarmelo :)
    • santaka
      santaka
      Bronce
      Registro: 09-01-2008 Artículos: 6.451
      Ya está! Ya tengo el método del straight! La verdad es que me ha costado, y voy a tener que revisarlo bien, porque igual se me ha colado algo por ahí.

      Ahora ya puedo sacar ligar Escalera de color (this.Straight() && this.Flush()).

      Ahora a por la OESD jeje.


      Un saludo
    • santaka
      santaka
      Bronce
      Registro: 09-01-2008 Artículos: 6.451
      ¿Alguien tiene el Flopzilla, o no lo ha instalado nunca y puede usar el periodo de prueba?

      La verdad es que me vendría muy bien, para ir contrastando resultados y no tener que hacer todos los cálculos a mano.


      Un saludo!
    • ditou26
      ditou26
      Bronce
      Registro: 02-29-2008 Artículos: 6.746
      yo nunca lo instale!
    • mecf
      mecf
      Bronce
      Registro: 11-14-2009 Artículos: 409
      woaa santaka, que tipo más motivado! lo venderás como flopzilla? Si es asi, más barato pzl!

      BUeno, saludos (nose nada de programación como para ayudar:) .
    • lopeton
      lopeton
      Bronce
      Registro: 08-05-2008 Artículos: 1.416
      Hola santaka, llevo un par de semanas peleandome con el Visual B, se me ocurrió hacer algo muy muy parecido a lo que intentas hacer.

      Me ofrezco de voluntario para el flopzilla, dime un link bueno de descarga y te contrasto datos.

      Me encanta la idea, en algo teniamos que estar de acuerdo, jejeje


      Saludos...
    • alvargonzalez
      alvargonzalez
      Bronce
      Registro: 05-28-2009 Artículos: 55
      Una pregunta, como obtienes los porcentajes? utilizas un generador aleatorio para generar las cartas que salen en el flop? o utilizas todo el rango posible de manos existente, como lo hace PokerStove por ejemplo?

      Yo hace un tiempo comencé a programar una sala de poker en java, y uno de los aspectos mas dificiles fue la de obtener la mejor mano para cada jugador. No se si tenes pensado realizar un software pago a futuro, o decantarte por algo free y open source, pero si te decidis por este ultimo, estaria bueno que montes un repositorio svn, asi podrias conseguir colaboradores al proyecto.

      Un saludo.
    • santaka
      santaka
      Bronce
      Registro: 09-01-2008 Artículos: 6.451
      Hola

      El programa en primer lugar lo quiero para mi jeje. Luego me gustaría compartirlo con vosotros. Yo no tengo mucha idea de programación, solo he aprendido por Hobby.

      En cuanto a cómo hago para obtener los porcentajes, pues lo que hago es generar todos los flops, y evaluar la mano en cada uno de los flops.


      Un saludo!
    • santaka
      santaka
      Bronce
      Registro: 09-01-2008 Artículos: 6.451
      Hola

      Voy a intentar acabar de una vez con la maldita OESD! Hacer la función genérica es facil, pero cuando te hacercas a los extremos, 23, 24, 25, KQ, KJ, KT, solo tiene una forma de hacer la OESD. Y 34 y QJ solo pueden formar 2 OESD. Menudo lío jajaja.

      A ver si acabo con este maldito método! Luego vendrán las malditas gutshot! xD


      Un saludo ;)

      Santaka