[JUEGO EN C] problema para repartir cartas.

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • FaLKoN
    Magic Gladiator
    • 29-04-2004
    • 12911

    #1

    [JUEGO EN C] problema para repartir cartas.

    okey, tengo que hacer un juego (practicando para parciales y finales y ksjdngdf).
    puedo mesclar un mazo de cartas españolas (sin que importe el palo) pero el problema sale cuando intento repartir esas cartas entre 4 jugadores.
    los primeros 2 reciben todo bien, pero los ultimos 2 la primera carta es algo como "09183240923"... probe 2 o 3 formas distintas y logicas (al menos en mi cabeza)

    esta es la que mejor me salio.

    Código:
    void mesclarrepartir (int a[],int b[],int c[],int d[])
    {
    
     int mazo[48] = {1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12};
        int i=0,c1,c2,aux,j=0;
        for(i=0;i<144;i++)
        {
            c1=rand()%48;
            c2=rand()%48;
            aux=mazo[c1];
            mazo[c1]=mazo[c2];
            mazo[c2]=aux;
        }
     for(i=0;i<48;i++)
        {
            if(i<=12)
                a[i]=mazo[i];
            if(i>12 && i<=24)
                b[i-12]=mazo[i];
            if(i>24 && i<=36)
                c[i-24]=mazo[i];
            if(i>36 && i<=48)
                d[i-36]=mazo[i];
        }
    }
  • FaLKoN
    Magic Gladiator
    • 29-04-2004
    • 12911

    #2
    olvidense, ya lo arregle, no se por que mierda pero no me importa.

    Código:
    {
    
     int mazo[48] = {1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12};
        int i=0,c1,c2,aux,j=0,z=0,x=0,v=0;
        for(i=0;i<144;i++)
        {
            c1=rand()%48;
            c2=rand()%48;
            aux=mazo[c1];
            mazo[c1]=mazo[c2];
            mazo[c2]=aux;
        }
     for(i=0;i<48;i++)
        {
            if(i<=12)
            {
                a[j]=mazo[i];
                j++;
            }
            if(i>12 && i<=24)
            {
                b[z]=mazo[i];
                z++;
            }
            if(i>24 && i<=36)
            {
                c[x]=mazo[i];
                x++;
            }
            if(i>36 && i<=48)
            {
                d[v]=mazo[i];
                v++;
            }
        }
    }

    Comentario

    • NeoXero
      Alto Egel
      • 16-07-2007
      • 1095

      #3
      bien por vos, suerte
      Y lo bien que estoy...

      Comentario

      • murof_lege
        Pelotudo
        • 01-06-2009
        • 126

        #4
        Código:
        for(i=0;i<48;i++)
            {
                if(i<=12)
                {
                    a[j]=mazo[i];
                    j++;
                }
        te das cuenta que ahi entra al if 13 veces, y no 12, verdad?
        aunque "funcione", estas tocando memoria que no es tuya y eso deberia segfaultear cuando lo corras en un sistema operativo (<> sistema inoperativo)

        Comentario

        • MoaLaiSkirulais
          ^^(V)^^
          • 08-07-2003
          • 23268

          #5

          Comentario

          • Kpoyo
            Mandatory rape!
            • 16-05-2004
            • 8042

            #6
            Originalmente publicado por murof_lege
            Código:
            for(i=0;i<48;i++)
                {
                    if(i<=12)
                    {
                        a[j]=mazo[i];
                        j++;
                    }
            te das cuenta que ahi entra al if 13 veces, y no 12, verdad?
            aunque "funcione", estas tocando memoria que no es tuya y eso deberia segfaultear cuando lo corras en un sistema operativo (<> sistema inoperativo)
            No veo las definiciones de a,b,c,d asi que no se si podes concluir que a esta declarado como int a[12].

            (Seguramente si, pero no se puede asumir)

            Ademas, probablemente haya declarado a,b,c,d todo junto, por lo cual el malloc del compilador tiende a asignarles memoria contigua (en el mejor de los casos, si), entonces a+13 = b[0] (o 0[b] si somos hackish). Luego, es memoria alocada por el proceso, por lo que no segfaultearia.

            Comentario

            • murof_lege
              Pelotudo
              • 01-06-2009
              • 126

              #7
              que ridiculo es ponerse en pedante al pedo, no?
              pretendes defender un mal programa, alegando que "si hizo las cosas, de pedo, de cierta forma" va a andar bien?

              "el programa anda bien. le da 12 cartas a cada uno. bueno en realidad le da 13 al primero, 12 al segundo, 12 al tercero y 11 al cuarto, pero como estan todos en fila, no se nota j3j3".

              genial lo tuyo, ojala labures en una empresa de primera

              para programar hackish primero tenes que saber pogramar BIEN normalmente.
              y manipular MAL punteros a dentro de una funcion es la puerta numero uno a todo tipo de buffer overflows.
              JAMAAAAAAAS ASUMIS el tamaño de un puntero que recibis como parametro. JAMAS DE LOS FUCKING JAMASES.

              remontate al codigo original:
              Código:
              for(i=0;i<48;i++)
                  {
                      if(i<=12)
                          a[i]=mazo[i];
                      if(i>12 && i<=24)
                          b[i-12]=mazo[i];
                      if(i>24 && i<=36)
                          c[i-24]=mazo[i];
                      if(i>36 && i<=48)
                          d[i-36]=mazo[i];
                  }
              eso anda mal porque entra al 3er if (x ejemplo) con i minimo 25, y le resta 24. osea que jamas asigna nada al elemento 0 del vector c.
              bastaba poner BIEN los indices de los ifs, y listo.
              no entrar a defender el porque "aveces" puede ser que funcione.
              si estuvieran LOS CUATRO arrays contiguos en memoria, no verias "valores raros" en los "elementos 0" de los ultimos dos vectores. y los ve.
              Código:
              for(i=0;i<48;i++)
                  {
                      if(i<12)
                          a[i]=mazo[i];
                      if(i>=12 && i<24)
                          b[i-12]=mazo[i];
                      if(i>=24 && i<36)
                          c[i-24]=mazo[i];
                      if(i>=36 && i<48)
                          d[i-36]=mazo[i];
                  }
              tada

              Soluciones Logicas 1 - Soluciones a las apuradas 0
              Editado por última vez por murof_lege; 21-07-2009, 08:48 PM.

              Comentario

              • FaLKoN
                Magic Gladiator
                • 29-04-2004
                • 12911

                #8
                lo que postee es una funcion void que viene de un main donde tengo delcarados los vectores a,b,c,d. los declare en [12]

                Comentario

                • Intervalo
                  Pichium
                  • 30-06-2007
                  • 9385

                  #9
                  quien es murof?
                  Oy with the poodles already!

                  Comentario

                  • Kpoyo
                    Mandatory rape!
                    • 16-05-2004
                    • 8042

                    #10
                    Originalmente publicado por murof_lege
                    que ridiculo es ponerse en pedante al pedo, no?
                    pretendes defender un mal programa, alegando que "si hizo las cosas, de pedo, de cierta forma" va a andar bien?

                    "el programa anda bien. le da 12 cartas a cada uno. bueno en realidad le da 13 al primero, 12 al segundo, 12 al tercero y 11 al cuarto, pero como estan todos en fila, no se nota j3j3".

                    genial lo tuyo, ojala labures en una empresa de primera

                    para programar hackish primero tenes que saber pogramar BIEN normalmente.
                    y manipular MAL punteros a dentro de una funcion es la puerta numero uno a todo tipo de buffer overflows.
                    JAMAAAAAAAS ASUMIS el tamaño de un puntero que recibis como parametro. JAMAS DE LOS FUCKING JAMASES.

                    remontate al codigo original:
                    Código:
                    for(i=0;i<48;i++)
                        {
                            if(i<=12)
                                a[i]=mazo[i];
                            if(i>12 && i<=24)
                                b[i-12]=mazo[i];
                            if(i>24 && i<=36)
                                c[i-24]=mazo[i];
                            if(i>36 && i<=48)
                                d[i-36]=mazo[i];
                        }
                    eso anda mal porque entra al 3er if (x ejemplo) con i minimo 25, y le resta 24. osea que jamas asigna nada al elemento 0 del vector c.
                    bastaba poner BIEN los indices de los ifs, y listo.
                    no entrar a defender el porque "aveces" puede ser que funcione.
                    si estuvieran LOS CUATRO arrays contiguos en memoria, no verias "valores raros" en los "elementos 0" de los ultimos dos vectores. y los ve.
                    Código:
                    for(i=0;i<48;i++)
                        {
                            if(i<12)
                                a[i]=mazo[i];
                            if(i>=12 && i<24)
                                b[i-12]=mazo[i];
                            if(i>=24 && i<36)
                                c[i-24]=mazo[i];
                            if(i>=36 && i<48)
                                d[i-36]=mazo[i];
                        }
                    tada

                    Soluciones Logicas 1 - Soluciones a las apuradas 0
                    Calmate salame, yo no te agredi. Solo di una explicacion por la cual no haria segfault eso, fuera *nix o windows.

                    Una asignacion de un array en C, no implica que se borren los valores, Por lo cual, cuando imprime el valor 0, obvio que va a tener la basura del malloc, que no es lo mismo que limpiandolas manualmente. Ahi surge el problema del off by one que apuntas, pero te pusiste en pedante vos, no yo. Yo solo remarque porque puede no segfaultear, nada mas.

                    Comentario

                    • murof_lege
                      Pelotudo
                      • 01-06-2009
                      • 126

                      #11
                      exacto. remarcaste que puede no segfautear de pedo. yippie!!!

                      "(Seguramente si, pero no se puede asumir)"
                      "(en el mejor de los casos, si)"
                      "los vectores a,b,c,d. los declare en [12]"

                      el codigo hace 48 asignaciones. esos dos "ceros malloc" fueron a parar a algun lado. que quedaran agujeros indica que ese valor numerico fue a parar a donde no deberia, y ya estas practicamente encendiendole una vela al gcc para que no te explote.
                      es decir, se direcciona c[12], y se sabe que c[12] no es (en memoria) d[0].
                      Editado por última vez por murof_lege; 21-07-2009, 10:02 PM.

                      Comentario

                      • Kpoyo
                        Mandatory rape!
                        • 16-05-2004
                        • 8042

                        #12
                        En ningun momento se me ocurrio dar comentarios constructivos sobre las tecnicas de programacion del tipo. Solo di una explicacion de porque puede NO ESTAR FALLANDO POR ESO.

                        Nunca hice review del nombre de variables, del uso de indices, de condiciones booleanas. Solo marque un punto, solo uno. Y vos saltaste a remarcarme que no era una solucion al problema de fondo(que nunca dije que tuviera o porque lo tuviera).

                        Hice un comentario al margen y saltas como leche hervida. Mogolico.

                        Comentario

                        • klaus?
                          >>>
                          • 10-09-2004
                          • 1247

                          #13
                          la parte de los if y for son muy parecidos a php, el día que entienda esto por completo voy a aplaudir con los cachetes de la cola.

                          nn
                          (bah en realidad lo entiendo pero.. eso de void arriba nd)

                          Comentario

                          • FaLKoN
                            Magic Gladiator
                            • 29-04-2004
                            • 12911

                            #14
                            lo unico que dice el void es que los vectores a,b,c,d estan declarados en otra funcion/main.
                            a lo que hay, sumale la declaracion de lo vectores y listo.

                            Comentario

                            • Lysander
                              Concha Y Perón
                              • 19-06-2005
                              • 5514

                              #15
                              Originalmente publicado por klaus?
                              la parte de los if y for son muy parecidos a php, el día que entienda esto por completo voy a aplaudir con los cachetes de la cola.

                              nn
                              (bah en realidad lo entiendo pero.. eso de void arriba nd)
                              ese void es un procedimiento dentro del formulario.

                              Comentario

                              Trabajando...