PDA

Ver la versión completa : Fixtures automáticos



Arielo
28/07/2008, 14:47
Subo en esta oportunidad, un pequeño programa, que automatiza la tarea de creación de fixtures tipo liga (todos contra todos).


Antes de subir el programa, voy a explicar cómo hacer para no repetir ningún partido.

- Primero, verificamos que la cantidad de participantes sea par. Si es impar, agregamos un participante ficticio llamado "Libre". De esta manera, resolvemos dos problemas a la vez: tenemos una cantidad par de participantes, y vemos cuál de ellos queda libre (no juega) en cada fecha. El participante que queda libre en una fecha, es, simplemente, el que se enfrenta al participante ficticio "Libre"

- Luego, determinamos la cantidad de fechas que tendrá la liga. Es un simple cálculo: Participantes - 1
En el caso de una cantidad impar de participantes, la liga tendrá la misma cantidad de fechas que de participantes.

- Determinamos asimismo, la cantidad de partidos por fecha: Participantes / 2

- Luego, realizamos la separación de los participantes en dos listas distintas, cada una de las cuales, tendrá exactamente la mitad de participantes.

- Mezclamos aleatoriamente ambas listas, para asegurarnos que cada fixture sea distinto y los enfrentamientos sean determinados por el azar.

- Luego creamos la primera fecha del torneo. Para este ejemplo, supondremos una liga como la que sigue:

6 participantes.
3 partidos por fecha
5 fechas.


- Para crear la primera fecha, hacemos que se enfrenten los equipos de las dos listas que separamos, de tal forma que el primero de la lista 1, se enfrente con el primero de la lista 2. El segundo de la lista 1 con el segundo de la lista 2, y así sucesivamente. Ya tenemos la primera fecha creada. Supongamos que el resultado sea el siguiente:


Participante_6 vs Participante_4
Participante_2 vs Participante_1
Participante_5 vs Participante_3


- Para la segunda fecha, y las subsiguientes, procederemos así:
Dejamos el primer participante SIEMPRE fijo (en este caso Participante_6), y vamos rotando el resto de participantes en sentido horario.

Participante_4 pasa a ocupar el puesto de Participante_1. Éste, reeemplaza a Participante_3. Participante_3, pasa a la última posición de la lista de la izquierda, donde se encontraba Participante_5, que pasa a la posición de Participante_2, quien reemplaza a Participante_4 en la primera posición de la lista de la derecha...

Hagámosle el seguimiento a Participante_2. De la manera antes descripta, la segunda fecha será:


Participante_6 vs Participante_2
Participante_5 vs Participante_4
Participante_3 vs Participante_1


Los participantes que se encuentran en la columna de la izquierda (locales), se rotan hacia arriba. El que se encuentra en segunda posición, pasará a la primera de la derecha, puesto que el primero no rota nunca.
Los que se encuentran en la columna de la derecha (visitantes), rotan hacia abajo. El último de esta lista, pasa a ser el último de la lista de la izquierda.

Para la tercera fecha, volvemos a rotar, y nos queda:

Participante_6 vs Participante_5
Participante_3 vs Participante_2
Participante_1 vs Participante_4


y la cuarta:

Participante_6 vs Participante_3
Participante_1 vs Participante_5
Participante_4 vs Participante_2

finalmente, la quinta y última fecha:

Participante_6 vs Participante_1
Participante_4 vs Participante_3
Participante_2 vs Participante_5

Como se puede apreciar, Participante_2 termina en la posición anterior a la que inició el torneo.

Arielo
28/07/2008, 14:58
Bien, ahora al programa...

Lo que hace, es, básicamente, lo que se describe en el post #1.

Lo único que hay que hacer, es ingresar el nombre de los participantes.
Una vez que estén todos ingresados, se deberá hacer clic en "Crear Fixture", y el sistema automáticamente generará el fixture correspondiente.

Notas:
- No se preocupen si ingresan un número impar de participantes. En este caso, el sistema incluirá el participante ficticio "Libre"
- Si no se está conforme con el fixture generado, se puede hacer nuevamente clic en "Crear Fixture", y se generará uno nuevo con los datos ya ingresados.
- El fixture generado, se puede grabar (cuando se pregunte, ingresar el nombre del archivo, incluyendo el path o carpeta de destino. Ej.: C:\FIXTURE.TXT)

Arielo
28/07/2008, 15:03
Este es el código fuente del programa:


Private Sub Agregar_Click()
listaParticipantes.AddItem txtNombreEquipo.Text
txtNombreEquipo.Text = ""
txtNombreEquipo.SetFocus
End Sub

Private Sub cmdGrabar_Click()
Archivo = InputBox("Nombre de archivo:")
Open Archivo For Output As #1

For NroLinea = 0 To listaPartidos.ListCount - 1
Linea = listaPartidos.List(NroLinea)
Print #1, Linea
Next

Close #1
End Sub

Private Sub cmdQuitar_Click()
txtNombreEquipo.Text = listaParticipantes.List(listaParticipantes.ListInd ex)
listaParticipantes.RemoveItem (listaParticipantes.ListIndex)
cmdQuitar.Enabled = False
End Sub

Private Sub cmdSalir_Click()
End
End Sub

Private Sub cmdSortear_Click()
Screen.MousePointer = 11
If listaParticipantes.ListCount Mod 2 <> 0 Then
listaParticipantes.AddItem "..."
For i = listaParticipantes.ListCount - 1 To 1 Step -1
listaParticipantes.List(i) = listaParticipantes.List(i - 1)
Next
listaParticipantes.List(0) = "Libre"
End If

listaParcial1.Clear
listaParcial2.Clear
listaPartidos.Clear

CantPart = listaParticipantes.ListCount
Mitad = CantPart / 2

' Separa la lista inicial en dos sublistas parciales
For i = 1 To CantPart Step 2
listaParcial1.AddItem listaParticipantes.List(i - 1)
listaParcial2.AddItem listaParticipantes.List(i)
Next

' Mezcla las dos sublistas
Randomize Timer
For i = 1 To 1200
Uno = Int(Rnd * Mitad - 1) + 1
Dos = Int(Rnd * Mitad)
r = listaParcial1.List(Uno)
listaParcial1.List(Uno) = listaParcial2.List(Dos)
listaParcial2.List(Dos) = r
Next

' Crea el Fixture

' Determina la cantidad de fechas a disputarse
Fechas = CantPart - 1

For ProgFecha = 1 To Fechas
listaPartidos.AddItem " ------ FECHA " & Str(ProgFecha) & "------"

For Partido = 0 To Mitad - 1
EqLocal = listaParcial1.List(Partido)
EqVisitante = listaParcial2.List(Partido)
Linea = EqLocal + " vs. " + EqVisitante
listaPartidos.AddItem Linea
Next
listaPartidos.AddItem ""

' Mueve los equipos para no repetir partidos

' Toma el nombre del participante en posición 1 de la lista de locales
Primero = listaParcial1.List(1)

' Toma el nombre del participante en última posición de la lista de visitantes
Segundo = listaParcial2.List(Mitad - 1)

' Mueve los equipos de la primera lista
For i = 1 To Mitad - 1
listaParcial1.List(i) = listaParcial1.List(i + 1)
Next

' Mueve los equipos de la segunda lista
For i = Mitad - 1 To 1 Step -1
listaParcial2.List(i) = listaParcial2.List(i - 1)
Next

listaParcial2.List(0) = Primero
listaParcial1.List(Mitad - 1) = Segundo

Next
Screen.MousePointer = 0
End Sub

Private Sub listaParticipantes_Click()
cmdQuitar.Enabled = True
End Sub