Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





algoritmo de calculo de manos

Iniciado por Kabila, 23 de Agosto de 2011, 11:46:44 AM

« anterior - próximo »

Kabila

Buenos dias.

Teniendo 7 naipes en la mano, calcular la mejor jugada. Solo se pueden hacer escaleras (cartas contiguas del mismo palo de 3 a 7 cartas) y cartas del mismo valor y diferente o igual palo (si hay mas de de una baraja)

algoritmo para calcular cual seria la mejor jugada posible

saludos

Vicente

Mmm, hay algo que no entiendo porque el problema parece trivial.

Es decir, si tu sabes los puntos que vale la escalera de tamaño N y los puntos que vale el tener X cartas iguales, simplemente buscas ambas posibilidades. Vamos, son como mucho 5 posibles escaleras y 6 posibles repeticiones (creo), buscas una detras de otra y listo.

Asi que seguro que algo me he perdido.

blau

Supongo que hablas de jugar al chinchon, y que se trata de determinar:

1. Si coges una carta de la baraja
2. Si coges la carta descartada del jugador anterior

y en todo caso que carta descartas para coger alguna de las anteriores...  

y para hacerlo bien habría que tener en cuenta las cartas que se han ido descartando que están en el montón de descarte y que de momento no van a salir, al menos hasta que se acabe el monton de la baraja y las que habiendo sido descartadas han sido rescatadas por otros jugadores...

¿es esto así?

Kabila

No es tan trivial.

Es para el juego chinchon. Cuando alguien cierra, un algoritmo que encuentre la mejor jugada de cada jugador (de momento no incluyo comodin porque sino se dispara)

Tengo unsistema hecho que funciona aunque con comodin falla en jugadas muy puntuales. Pero me gustaria hacer algo mas consistente.

saludos

Warchief

#4
Joer, se me ocurren un monton de formas. La que mas me gusta es:


// Asumo barajas de 12 cartas y 4 palos (puede haber mas de una baraja)
int CartasDelColega[4][12];

// Cada vez que le das una carta
CartasDelColega[ palo ][ valor ] ++;

// Cada vez que se la quitas
CartasDelColega[ palo ][ valor ] --;


Repeticiones:

FOR c = 0 a 11 // cartas
 FOR p = 0 a 3 // palos
   RepC += CartasDelColega[ p ][ c ];
 Si RepC es mejor que MejorRepC, tenemos mejor repeticion
MejorRepCFinal = MejorRepC + NumeroDeComodines


Escaleras

FOR p = 0 a 3 // palos
 escalera = 0
 FOR c = 0 a 11 // cartas
  Si CartasDelColega[ p ][ c ]  != 0
   escalera++
  else
  {
    if ( escalera > mejorEscalera )
        mejorEscalera = escalera
    escalera = 0
  }

// para el rey
if ( escalera > mejorEscalera )
  mejorEscalera = escalera



Creo que es lo suficientemente rapido como para que puedas hacer:
(para N comodines que tengas, combinar)

for p 0 a 3
 for c 0 a 11
   AnyadirComodin( p, c )
   CalcularEscaleras()
   QuitarComodin( p, c )


Si no, el bucle de escaleras se vuelve un poco mas complejo, pero mas optimo, mediante reutilizacion de comodines.
No he querido seguir ahi porque no se si puedes tener solo 1 comodin o varios, pero no es excesivamente complejo.

Warchief

Un par de notas:

1) Si el As puede valer como 13, puedes hacer:
int CartasDelColega[4][13]; // y contarlo en 1 y 13 al anyadir un as. No afecta a las repeticiones y las escaleras funcionaran.

2) Porque asumo que no se pueden hacer escaleras ciclicas.
Si se puede, el bucle cambia un poco, para guardar la escalera de As a N, y la de M a Rey, y sumarlas (si hay As y Rey.)

3) Para optimizar comodines, al anyadir uno:
Si cartas[p][c] ya es != 0, no hace falta probarlo, no afecta a las escaleras
Si cartas[p][c-1] == 0 && cartas[p][c+1] == 0, no hace falta probarlo, no afecta a las escaleras

Makaimura

Que lios os traéis los programadores hacer Suters con el udk y dejaos de cosas raras.

Eskema

Cita de: makaimura en 24 de Agosto de 2011, 12:42:22 AM
Que lios os traéis los programadores hacer Suters con el udk y dejaos de cosas raras.



+++masuno!!!!!  :D

Kabila

Hola Warchief

No vas muy desencaminado pero en realidad no es eso.

Suponte esta mano de cartas  [102,103,104,105,205,305,402]

el tio cierra con 2 puntos de resto... las cartas funciona los cientos son oros,copas,espadas y bastos y los restos son el valor

El algoritmo deberia encontrar algo como   [[101,103,104],[105,205,305],[402]] o sea una escalera, un trio y sobra un dos

PArece sencillo pero un algoritmo eficiente que encuentre cualquier convinacion y cuando se complica con un comodin no lo es tanto

Vicente

Esto, el ejemplo no esta mal? No es una escalera de 4 cartas y un trio?

Warchief

Cita de: Vicente en 24 de Agosto de 2011, 06:23:29 PM
Esto, el ejemplo no esta mal? No es una escalera de 4 cartas y un trio?

Es un typo,  [[102,103,104],[105,205,305],[402]]
En cualquier caso 402 no se puede usar para la escalera del 100 porque es de otro palo.

@Kabila
Un problema interesante. Mi primer intento (o segundo) seria probar todas las combinaciones por fuerza bruta, guardando la que deje menos puntos abiertos. Para usar los comodines, como dije, poner el comodin en cada una de las posibles cartas por palo, teniendo en cuenta las posibles optimizaciones:
+ Solo afecta escaleras si hay carta de valor adyacente en el mismo palo
+ Solo afecta a repeticiones si el valor escogido esta repetido dos veces exactamente o puede formar escalera en esa posicion
| - (ya que permite liberar una carta que podemos usar para la escalera, como el 105 en tu ejemplo)

Ahora no puedo pensarlo mas,  pero a ver si encuentro tiempo estos dias. Parece divertido de resolver :)

Warchief

+ Cuantos comodines hay en la(s) baraja(s)? Son barajas de 50 cartas?
+ Si te toca mas de uno puedes combinarlos en distintos juegos? (uno para escalera otro para trio?)
+ Se puede usar el as tras el rey?

blau

Cita de: Warchief en 24 de Agosto de 2011, 07:59:13 PM
+ Cuantos comodines hay en la(s) baraja(s)? Son barajas de 50 cartas?
Normalmente dos, 50 = 48+2

Cita de: Warchief en 24 de Agosto de 2011, 07:59:13 PM+ Si te toca mas de uno puedes combinarlos en distintos juegos? (uno para escalera otro para trio?)
Claro

Cita de: Warchief en 24 de Agosto de 2011, 07:59:13 PM
+ Se puede usar el as tras el rey?
No

Yo estuve la otra tarde montando el algoritmo, intentando buscar todos las posibles soluciones parciales y luego elegir de ellas las mejores que no compartan cartas... consegui la parte de los grupos con comodines o sin ellos, pero el tema de las escaleras se me complico bastante...  ^_^'



Warchief

Cita de: blau en 24 de Agosto de 2011, 10:53:46 PM
Cita de: Warchief en 24 de Agosto de 2011, 07:59:13 PM
+ Cuantos comodines hay en la(s) baraja(s)? Son barajas de 50 cartas?
Normalmente dos, 50 = 48+2

Cita de: Warchief en 24 de Agosto de 2011, 07:59:13 PM+ Si te toca mas de uno puedes combinarlos en distintos juegos? (uno para escalera otro para trio?)
Claro

Cita de: Warchief en 24 de Agosto de 2011, 07:59:13 PM
+ Se puede usar el as tras el rey?
No

Yo estuve la otra tarde montando el algoritmo, intentando buscar todos las posibles soluciones parciales y luego elegir de ellas las mejores que no compartan cartas... consegui la parte de los grupos con comodines o sin ellos, pero el tema de las escaleras se me complico bastante...  ^_^'





Si se juega con mas de una baraja, te pueden tocar 3 comodines o solo se meten 2 comodines en total?

blau

Yo he jugado con 2 barajas y 4 comodines... pero para estar seguros habria que buscar en la norma une correspondiente.  :D






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.