No estás registrado (Registrarse)

Vanilla 1.1.10 es un producto de Lussumo. Para más información: Documentación, Soporte.

    •  
      CommentAuthorcazatrucos
    • CommentTimeMay 22nd 2018
     # 1
    Hola, llevo días partiéndome la cabeza …
    estoy desarrollando una web para crear ligas y torneos de padel …
    El problema es crear el algoritmo para hacer el emparejamiento …
    a ver ..
    hay un sistema llamado round robin en php que mezcla los equipos para que juegan todos contra todos.
    ejemplo ->
    https://stackoverflow.com/questions/658727/how-can-i-generate-a-round-robin-tournament-in-php-and-mysql
    pero esto es para equipos.
    Necesito hacer lo mismo pero con jugadores de todos contra todos, teniendo en cuenta que son dos jugadores contra dos jugadores.
    Se podrán repetir el juego de esos dos jugadores, pero siempre contra otros jugadores.
    ¿me ayudan? vamos valientes … jeje
    thank ...hellow !!!
    •  
      CommentAuthorAntonio
    • CommentTimeMay 22nd 2018
     # 2
    A ver...

    Lo de dos jugadores vs dos jugadores, estos grupos de 2 jugadores ¿siempre son los mismos?

    Si es así, es lo mismo que por equipos...y es bastante sencillo, los montas de forma circular...un array con todas las parejas donde el último está enlazado al primero (por ejemplo, se puede hacer de más formas...)

    Es decir, dos arrays con la mitad en uno y la mitad en otro...

    $par1[0] contra $par2[0]..

    Y "asin" con todo.

    SIguiente jornada....

    Quitas el último del array de los primeros pares y lo añades al final del segundo array...
    Al segundo array le quitas el primero elemento y lo añades como primer elemento en el primer array...

    (Circular)

    Así hasta que se repita el array original en función de las vueltas que haya (como ida y vuelta por ejemplo).

    array_unshift($par1, array_shift($par2))

    array_push($par2, array_pop($par1))


    Y luego comparar los arrays con el original.
    •  
      CommentAuthorcazatrucos
    • CommentTimeMay 22nd 2018
     # 3
    Gracias Antonio. Efectivamente lo que dices es sencillo y lo tengo implantado en juegos por equipos …
    el problema viene por ejemplo tienes un array con 5 persdonas que se apunta:
    p1, p2, p3, p4, p5

    quedartia si ->
    p1 y p2 VS p3 y p4
    p5 descansa

    p1 y p3 VS p4 y p5
    p2 descansa ..

    he intentado hacer equipos como
    equipo1 p1 y p2
    equipo 2 p1 y p3
    equipo 3 p1 y p4

    pero puede cuadrar que equipo 1 juegue contra equipo 3, donde esta la misma persona …
    un poco lioso .. :(hellow !!!
    •  
      CommentAuthorAntonio
    • CommentTimeMay 23rd 2018
     # 4
    Entiendo que se darán todas las combinaciones posibles entre jugadores y equipos que forman...

    En principio también es fácil.

    Son todas las combinaciones posibles y que se repitan las veces que necesites.

    Es decir:

    Imaginemos que tenemos 5 jugadores como dices, que deben ser cogidos de 4 en 4. Hay que encontrar todas las combinaciones posibles sin repetición (y por orden para que sea un liga).

    Jugadores nombrados como 0..4

    Generar todas las tuplas posibles en grupos de 4 (de dos en dos), por orden.

    ((0,1),(2,3)) 01 23
    ((0,1),(2,4)) 01 24

    ((0,2),(1,3)) 02 13
    ((0,2),(1,4)) 02 14

    ((0,3),(1,2)) 03 12
    ((0,3),(1,4)) 03 14

    ((0,4),(1,2)) 04 12
    ((0,4),(1,3)) 04 13

    Estas son todas las combinaciones posibles. Obviamente se pueden repetir cambiando el orden de los "equipos".

    Simplemente genera las tuplas por orden, vamos, generar por orden todas las combinaciones de todos los jugadores siempre cogidos de 4 en 4 y evitando que en ninguna tupla (de dos) el primer número sea más grande que el segundo. Y listo, ya tienes todas las combinaciones.

    Ahora el orden...que lo lógico (no sé cómo es el juego) es tal cual salen y volver al principio. Si no, por ejemplo, alternando primero y último, en cremallera.

    Si los "partidos" tienen que ser a la vez, puedes hacer simplemente más tuplas, porque los jugadores no pueden jugar en dos equipos a la vez, por ejemplo:

    (0,1) vs (2,3) / (4,5) vs (6,7) / (8,9) vs (10,11) / jugador 12 descansa

    Y así todas las combinaciones...en este ejemplo sería un array tipo:

    $partidos = [
    [0,1,2,3,4,5,6,7,8,9,10,11],
    [0,1,2,3,4,5,6,7,8,9,10,12],
    [...]
    ];
    •  
      CommentAuthorAntonio
    • CommentTimeMay 25th 2018
     # 5
    Buscando una librería de combinatoria en PHP encontré ésta:

    https://packagist.org/packages/alphazygma/combinatorics

    Y sería fácil lo que pretendes (usando composer, aunque se puede incluir directamente)...


    <?php
    require 'vendor/autoload.php';

    function partidos($miembros, $tamano_equipo = 2) {
    $num_partidos = intdiv(count($miembros), ($tamano_equipo*2)); // intdiv esta en php7 aunque si no se puede hacer fácilmente.
    $combinaciones = \Math\Combinatorics\Combination::get($miembros, $num_partidos*4);
    $jornada = 1;
    $resultado = [];
    foreach($combinaciones as $comb) {
    $partidos = array_chunk($comb, $tamano_equipo*2);
    foreach($partidos as $partido) {
    $resultado[$jornada][] = array_chunk($partido, $tamano_equipo);
    }
    $jornada++;
    }
    return($resultado);
    }

    $jugadores = [
    "Jugador 1",
    "Jugador 2",
    "Jugador 3",
    "Jugador 4",
    "Jugador 5",
    ];

    $partidos = partidos($jugadores, 2);

    var_dump($partidos);


    Esto serían $partidos[numero de jornada contando desde 1][numero de partido desde 0][numero de equipo desde 0][miembro del equipo desde 0]

    Lo he probado con 15 jugadores y salen 455 jornadas, pero funciona también, jeje

    A ver si te sirve. :-D
    •  
      CommentAuthorcazatrucos
    • CommentTimeMay 25th 2018
     # 6
    de lujo Antonio :ildivo:
    ese algoritmo ya lo había calculado mas o menos a cabeza xD
    entonces, se puede usar por ejemplo a un máximo de 4 partidos por persona y que luego los puntos aclaren el ganador.
    En las ligas hacen esto, pero primero hacen grupos y van eliminándose por grupos para no llegar a semejantes partidos xD
    Voy a probar el script …
    gracias ...hellow !!!
    •  
      CommentAuthorcazatrucos
    • CommentTimeMay 28th 2018
     # 7
    una última propuesta … !!!
    como se haría un bucle con jugadores mínimo de 4 y máximo de 20 por ejemplo.

    ejemplos:
    jugadores=array(1,2,3,4);
    o bien
    jugadores=array(1,2,3,4,5,6,7,8,9);

    que jueguen cada uno máximo 4 o 6 veces cada uno, manteniendo el mismo numero de partidos a ser posible cada uno
    que intenten jugador todos antes de pasar a la siguiente ronda
    que jueguen 4 jugadores
    que si vuelven a jugar no se enfrente con combinaciones parecidas, ejemplo: juega: 12 vs 34, pues que no repita: 43 vs 21 por ejemplo.
    por el script del segundo array por ejemplo juegan ->
    12vs34 , 56vs 78, ronda dos:
    91 vs 23,
    entonces que por cada ronda se mezclen con shuffle para no secuenciar mismas combinaciones seguidas, manteniendo las reglas iniciales

    si me lo haces me puedes mandar un privado para comprarte el script ;)
    saludos ...hellow !!!
    •  
      CommentAuthorcazatrucos
    • CommentTimeMay 28th 2018
     # 8
    listo …
    ya lo conseguí …
    algo así como, hago un bucle con los jugadores y lo multiplico por unas 20 veces por ejemplo para que tenga el máximo numero de combinaciones. Luego dentro del bucle hago algo así como:

    if(!in_array($jugador, $montar) and /// no se repite el jugador en el partido
    $contar_user[$jugador]<$max_veces and /// el jugador no juega mas de x veces en toda las rondas
    !in_array($jugador, $v)){ /// no se repite el jugador hasta que jueguen todos

    $montar[]=$jugador; /// montamos el jugador en un array de 4

    $contar_user[$jugador]++; /// contamos el jugador


    }

    if(count($montar)==4){ /// hay 4 jugadores para grabar

    if(isset($combinaciones[implode(',',$montar)])){ /// existe una combinacion parecida, no guardamos ...

    $t+=3; /// adelantamos 3 jugadores para su eleccion
    foreach($montar as $m){ /// borramos los que se contaron previamente
    $contar_user[$m]--;

    }

    }else{

    foreach($montar as $m) /// grabamos array $v para contar los jugadores
    $v[]=$m;


    $grabar[$ronda][]=$montar; /// grabamos la ronda y el partido con los 4 jugadores

    /// grabamos todas las combinaciones posibles de los 4 jugadores

    $combinaciones[$montar[0].','.$montar[1].','.$montar[2].','.$montar[3]]++;
    $combinaciones[$montar[1].','.$montar[0].','.$montar[2].','.$montar[3]]++;
    $combinaciones[$montar[0].','.$montar[1].','.$montar[3].','.$montar[2]]++;
    $combinaciones[$montar[1].','.$montar[0].','.$montar[3].','.$montar[2]]++;

    $combinaciones[$montar[3].','.$montar[2].','.$montar[0].','.$montar[1]]++;
    $combinaciones[$montar[3].','.$montar[2].','.$montar[1].','.$montar[0]]++;
    $combinaciones[$montar[2].','.$montar[3].','.$montar[0].','.$montar[1]]++;
    $combinaciones[$montar[2].','.$montar[3].','.$montar[1].','.$montar[0]]++;
    }


    $montar=array(); /// reseteamos montar ...

    }

    if(count($v) >= ($total_jugadores) or $total_jugadores-count($v)<4){ /// ya jugaron todos
    $v=array(); // reset jugadores
    shuffle($players); // mezclamos los jugadores
    $ronda++;
    }hellow !!!
    •  
      CommentAuthorH0unter
    • CommentTimeMay 28th 2018
     # 9
    ME da curiosidad cual es la web!! asi poder jugar!Hago desarrollos Webs/Worpress/Booking/Mobile
    •  
      CommentAuthorcazatrucos
    • CommentTimeMay 29th 2018
     # 10
    ouhhh :)
    pues en principio lo he montado desde 0 con Bootstrap y un registro, login simple.
    Todo ha empezado por un grupo de amigos para poder organizar nuestros propios partidos de padel y no depender de los clubs que te cobran un pastón por entrar en sus ligas y con sus normas … Aquí juegas con quienes quieras, cuando quieras y como quieras.
    Te registras y apuntas a personas o parejas

    https://ligasdepadel.com

    Lo he montado con Bootstrap, para poder crear una APP y montarlo con webview desde la propia web directamente a la APP
    La web es muy básica, aún me queda poner los torneos, es lo mismo pero eliminándose los perdedores …
    Ya que estamos, sugerencias?
    Gracias ...hellow !!!
    •  
      CommentAuthorcazatrucos
    • CommentTimeJun 4th 2018
     # 11
    hola, bueno para los torneos por eliminatoria se ha complicado otro poco mas xD
    mas que nada para sacar un algoritmo que genere los gráficos.
    En los dos sistemas, primero se crea aleatoriamente y se mezclan los equipos, pero una vez creado, se guarda en el MySQL para que posteriormente se lea siempre desde el MySQL y no generar conflictos en las puntuaciones.
    Ejemplo de un torneo por eliminatorias con algunas puntuaciones ya publicadas.
    https://ligasdepadel.com/web/portada/juego.php?id=10
    ¿Cómo lo ven?
    saludoshellow !!!