Resultados 1 al 3 de 3

Tema: Fixtures automáticos

  1. #1
    Registrado Avatar de Arielo
    Fecha de ingreso
    07 sep, 06
    Ubicación
    Abya Yala
    Mensajes
    8,152

    Predeterminado Fixtures automáticos

    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.
    Rara paradoja de la vida: comúnmente, a militares genocidas se les premia dándoles su nombre a calles, mientras que a científicos que salvan vidas, dándoles su nombre a virus y bacterias ...
    ----------
    El 75% de las personas, deja sin terminar lo que estaba hac

  2. #2
    Registrado Avatar de Arielo
    Fecha de ingreso
    07 sep, 06
    Ubicación
    Abya Yala
    Mensajes
    8,152

    Predeterminado Re: Fixtures automáticos

    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)
    Archivos adjuntados Archivos adjuntados
    Rara paradoja de la vida: comúnmente, a militares genocidas se les premia dándoles su nombre a calles, mientras que a científicos que salvan vidas, dándoles su nombre a virus y bacterias ...
    ----------
    El 75% de las personas, deja sin terminar lo que estaba hac

  3. #3
    Registrado Avatar de Arielo
    Fecha de ingreso
    07 sep, 06
    Ubicación
    Abya Yala
    Mensajes
    8,152

    Predeterminado Re: Fixtures automáticos

    Este es el código fuente del programa:
    Código:
    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.ListIndex)
    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
    Rara paradoja de la vida: comúnmente, a militares genocidas se les premia dándoles su nombre a calles, mientras que a científicos que salvan vidas, dándoles su nombre a virus y bacterias ...
    ----------
    El 75% de las personas, deja sin terminar lo que estaba hac

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •