• Martes 18 de Febrero de 2020, 07:23

Autor Tema:  Barajar Cartas  (Leído 1907 veces)

kto!

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Barajar Cartas
« en: Viernes 22 de Junio de 2007, 04:42 »
0
Hola, soy algo nuevo en programacion y estoy intentando crear un metodo para barajar cartas. El que estoy utilizando a mi parecer funciona logicamente, pero al correrlo el programa se cuelga ya que la computadora se tarda mucho en encontrar los valores aleatorios necesarios, aqui les dejo el codigo del metodo, supongo q debe haber una forma mas eficaz...

public void Barajar()
        {
            Random ram = new Random();

            for (int j = 0; j != 52; j++)
            {
                aleatorio = ram.Next(1, 13);
                aleatorio2 = ram.Next(1, 4);
                for (int h = 0; h != j; h++)
                {
                    if ((Mazo[h] == Espadas[aleatorio]) || (Mazo[h] == Treboles[aleatorio]) ||
                      (Mazo[h] == Corazones[aleatorio]) || (Mazo[h] == Cocos[aleatorio]))
                    {
                        a = false;
                        h = j - 1;                        
                    }
                }
                if (a == true)
                {
                    switch (aleatorio2)
                    {
                        case 1: Mazo[j] = Espadas[aleatorio]; break;
                        case 2: Mazo[j] = Treboles[aleatorio]; break;
                        case 3: Mazo[j] = Corazones[aleatorio]; break;
                        case 4: Mazo[j] = Cocos[aleatorio]; break;
                    }
                }
                else
                {
                    a = true;
                    j--;
                }
            }
        }


Nota: Cada carta tiene primero el valor de la misma y luego el mazo al q pertenece, Espadas = 1, Treboles = 2, Corazones = 3, Cocos = 4. Por ejemplo, el diez de cocos seria: 104.

hano

  • Miembro activo
  • **
  • Mensajes: 87
    • Ver Perfil
Re: Barajar Cartas
« Respuesta #1 en: Viernes 22 de Junio de 2007, 10:12 »
0
Citar
f ((Mazo[h] == Espadas[aleatorio]) || (Mazo[h] == Treboles[aleatorio]) ||
(Mazo[h] == Corazones[aleatorio]) || (Mazo[h] == Cocos[aleatorio]))
{
a = false;
h = j - 1;
}

En esa sección de código, estás comprobando que la nueva carta aleatoria que has elegido aleatoriamente no está ya en el mazo. Si ya está, vuelves a calcular aleatoriamente otra carta.

Piensa que cuando queden pocas cartas, por ejemplo, 1, la posibilidad de que elijas una carta que no esté en el mazo es de 1/52, es decir, que es muy seguro que esté mucho tiempo repitiendo la elección de carta hasta que elija justo la que le falta por tomar.

Yo lo haría introduciendo todas las cartas en un List como números (1-13 espadas, 14-17 tréboles, ....). Escogería un número aleatorio entre 0 y la longitud de la lista, y quitaría ese elemento, que sería la carta elegida. Todo esto en un bucle while la longitud de la lista sea superior a 0.

Es una idea. Prueba la que mejor se ajuste a tus necesidades.

Un saludo.

Luis Javier López Arredondo
                                                                                               
Para programadores
http]
[url=https://hardprogrammer.blogspot.com]https]

kto!

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Barajar Cartas
« Respuesta #2 en: Sábado 23 de Junio de 2007, 06:56 »
0
Gracias, nose si he hecho lo que me sugeriste pero algo parecido y me funciono a la perfeccion! gracias otra vez.