Calendario de una liga [PHP]

YiTaN

Buenas a todos.

Estoy haciendo un proyectillo con un amigo, y hay algo que no conseguimos hacer. La idea es que tenemos una liga, con 20 equipos, y queremos un algoritmo que coja esos 20 equipos y los empareje (en formato ida y vuelta), por supuesto, sin que se repitan xDD.

No busco que me den el código, me basta con que me den la idea porque la verdad, no consigo averiguar cómo poder hacerlo.

Saludos y gracias de antemano ;)

B

+1

Hace ya por lo menosa 1 ó 2 años pregunte lo mismo y no consegui sacar nada. A ver si te ayudan que a mi me interesaría mucho también saber como hacerlo. Y poder configurarme algun programilla para meter el numero de equipo sy que lo empareje solo...

YavestruZ

Tiene que ser compeltamente aleatorio? Si no es así puedes darle a cada equipo una ID y luego si son X equipos; Y (enfrentamientos) = X/2 y en cada enfrentamiento se enfrentan ID vs ID +1. Se supone que son equipos pares así que con esto estaría O.o.

YiTaN

#3 sí, la idea es que sea aleatorio porque habrán varias temporadas. Si no, me bastaría con hacerme una yo manualmente y ya está :P

jo1nter

miralo en el foro de software y desarollo web con los script abra algo :) o x irc , con los bots esos xD
Suerte :)

elkaoD

¿Soy el único que lo ve un poco simple?

equipo[20] seteando a 0 si no está asignado, o al número del equipo rival, si está asignado.

Un bucle del 0 al 19, que si ve el valor 0 saca un rival random y si el rival está a 0 setea ambos como rivales y fin.

EDIT: Me siento generoso.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define EQUIPOS 20

int main (void)
{
int equipo[EQUIPOS];
int i, j;

if (EQUIPOS % 2 == 1)
{
	printf ("Error en compilacion: Equipos impares\n");
	return -1;
}

srand(time());
memset (&equipo, -1, sizeof(equipo));

for (i=0; i<EQUIPOS; i++)
{

	if (equipo[i] == -1)
	{
		j = rand() % EQUIPOS;
		if (equipo[j] == -1 && i != j)
		{
			equipo[i] = j;
			equipo[j] = i;

			printf ("%d vs. %d\n", i+1, j+1);
		}
		else i--;
	}
}

return 0;

}

YiTaN

#6 es que, si no lo he entendido mal, con eso consigues hacer los emparejamientos jornada a jornada, pero no compruebas si dos rivales tocados aleatoriamente ya se han enfrentado.

EDITADO: Cuando escribí el post, no habías puesto el código.

elkaoD

#7, quieres decir que si ya se han enfrentado en otra jornada no quieres que se repita?

Cúrratelo un poco, que ya te he dado mucho... Te falta poquito y con pensar un poco te sobra. A bote pronto se me ocurre que puedes usar un campo de bits o algo, como solución cutre (O quizá más hacky aunque elegante.) Si no, son un par de cosillas más con arrays 3D (equipo[JORNADAS][EQUIPOS][EQUIPOS] donde JORNADAS = EQUIPOS-1 para que jueguen todos contra todos.)

Soltrac

Te comento que actualmente, lo que es aleatorio en las ligas es la primera jornada, las demás siguen un orden lógico, por lo que solo tienes que hacer aleatoria la primera jornada y ya las siguientes es sumando 1 al orden en el que hayas puesto los equipos.

SiCk

PHP: Mete las ids de los equipos en un array y usa shuffle (http://es.php.net/manual/es/function.shuffle.php) y descolocará aleatoriamente los contenidos. Luego simplemente un for que coja los equipos de dos en dos.

YavestruZ

#10 parece buena idea, usas una función de la librería estandar y asi te dejas de posibles bugs o fallos.

Saludos

YiTaN

#6 elKaoD, pusiste muchas funciones que desconozco totalmente porque nunca he tocado C, así que no entiendo la mitad del algoritmo xDD :( Gracias de todas maneras ;)

#10 Eso funcionaría para hacer una jornada aleatoriamente, pero no para todas las jornadas de la liga porque de esa forma no puedo asegurarme que no se repitan emparejamientos en jornadas posteriores.

#9 Puede que los tiros vayan por ahí. Pero no consigo entender del todo la idea que dices. Pongamos un ejemplo, con 8 equipos e IDs que van del 1 al 8. En la primera jornada, nos sale:

[ 1vs2 | 3vs4 | 5vs6 | 7vs8 ]

¿Cómo sería la segunda jornada según tú? Según lo que dices, entiendo que sería algo como:

[ 2vs3 | 4vs5 | 6vs7 | 8vs1 ]

Sin embargo, si fuera así, la tercera jornada sería:

[ 3vs4 | 5vs6 | 7vs8 | 1vs2 ]

Por lo que se repiten los partidos y tampoco me sirve xD.
No sé si era esto a lo que te referías, pero es lo que yo entendí y, como verás, no me sirve :(

Saludos y gracias a todos por ayudar ;)

elkaoD

#12, más bien se refiere a algo así:

1:
1v2
3v4
5v6
7v8

2:
1v4
3v6
5v8
7v2

3:
1v6
3v8
5v2
7v4

4:
1v8
3v2
5v4
7v6

5:
Cambias dos de la izquierda por dos de la derecha en ambos sentidos, tal que así:

1v5
3v7

6v2
8v4

6:
Y rotas también:
1v7
3v5

6v4
8v2

7:
Cojes la otra combinación de pareja, tal que así:
1v3
5v7

6v8
2v4

Si son más clanes, solo tienes que rotar más veces de la columna izquierda a la derecha (Aquí al haber 4 en cada columna, solo había 2 combinaciones diferentes, la del 1-3 a la izquierda y la del 1-5 a la izquierda.)

Usuarios habituales