Formula en PHP para generar eliminatorias.

JuShTo

Pues nada chicos, ando haciendo un generador de eliminatorias pero me he encontrado con un problema matemático para mi... y os consulto a ver como lo puedo hacer.

Mi problema es basicamente que no se como detectar las celdas donde tiene que ir el contenido con el nombre de un equipo pues debería ser así.

¿Cuál es mi problema?Que no encuentro la formula matematica... Para el espacio si, con un for a las lineas pares que me las ponga en blanco pero lo demás...chungo.

<form action="index.php" method="POST">
			<h1>
				Número de equipos en el bracket
			</h1>
			<input type="text" name="equipos" />
			<input type="submit" name="enviar" value="Enviar" />
		</form>
		<?php
		
	function crea_bracket()
	{
		$equipos=$_REQUEST['equipos'];
		if ($equipos == 4)
				{
					$numtd = 5;
				}
				if ($equipos == 8)
				{
					$numtd = 7;
				}
				if ($equipos == 16)
				{
					$numtd = 9;
				}
				if ($equipos == 32)
				{
					$numtd = 11;
				}
		?>
	<table>
			<?php
			for ($i=1; $i<=($equipos*2)-1; $i++)
			{
			?>
				<tr>
				<?php
				for ($o=1;$o<=$numtd; $o++)
				{
				?>
				<?php
					if($o%2 == 0)
					{
					?>
						<td style="background-color:white; width:30px;">a</td>
					<?php
					}else
					{
					?>
				
					<td style="background-color:red; width:100px;">&nbsp;a</td>
					<?php
					}
					?>
				<?php
				}
				?>
				</tr>
			<?php
			}
			?>
		</table>
		<?php
	}

		if (isset($_POST['enviar']) && $_POST['equipos'] != "")
		{
			crea_bracket();
		}
		else
		{
			echo("No funciona");
		}
	?>
	</table>

En numeracion y segun mis bucles, la relacion de filas-columnas que deberia colorear son:
1-1
2-3
3-1
4-5
5-1
6-3
7-1

EDIT: PONGO IMAGEN DE EJEMPLO QUE LO EXPLIQUE MEJOR:

Los numeros de la posicion izquierda en la celda son la fila en la que está y el de la derecha el de la columna.

Como yo tengo dos for anidados, uno para crear la fila y otro para crear las celdas de cada fila, no se como detectar en que fila tengo que meter la informacion(css, nombre del equipo, etc...)

PiradoIV

Buf, hace añazos estuve haciendo algo así, era una cuestión matemática... en cuanto des con eso, es coser y cantar.

1 respuesta
Caotico

Edit: vale nada.

JuShTo

#2 A ver si tengo suerte. Este par de horas que llevo aqui no se me ocurre nada, al menos de esta manera.

Otra manera sería crear tablas independientes por cada enfrentamiento...pero es un lío también.

eXtreM3

Yo lo haría todo por clics, sin escribir nombres en ningún momento (salvo en la inscripción, claro).

  • Añades participantes
  • Creas los enfrentamientos, de manera aleatoria o como se desee.

  • Maquetas esa tabla con html y css.

A cada celda de participantes le das una ID, después con jQuery capturas el evento onClick y lanzas el script de php donde guardes que ese equipo ha ganado el partido.

Si la tabla es dinámica... (número de participantes variable, 8, 16, 32...) asignaría también un campo inicial para saber cuántas eliminatorias hay, y pintar tantas columnas como número de equipos / 2

A ver si me he expresado bien xd

1 respuesta
JuShTo

#5

Te he entendido perfectamente pero es que no controlo para nada el jQuery ni el ajax ni leches, un poquito de javascript(miticas comprobaciones de formularios, funciones y poco más).

PD: Estoy aprendiendo.

Muchas gracias igualmente :)

1 respuesta
elkaoD

Los torneos sólo tienen sentido con n2 jugadores con n entero positivo.

Por cada fila hay dos separaciones necesarias:

L = nivel del bracket

  1. Separación de offset inicial (para centrar en el partido anterior)

(2L-1-1)

  1. Separación entre partidos del propio nivel

(2L-1)


La separación (1)__(2)

Ejemplo para n=16 (16 jugadores):

@ = jugador
F = 15

@ 1 3 7 F
1 @ 3 7 F
@ 3 3 7 F
1 3 @ 7 F
@ 3 7 7 F
1 @ 7 7 F
@ 3 7 7 F
1 3 7 @ F
@ 3 7 F F
1 @ 7 F F
@ 3 7 F F
1 3 @ F F
@ 3 7 F F
1 @ 7 F F
@ 3 7 F F
1 3 7 F @
@ 3 7 F F
1 @ 7 F F
@ 3 7 F F
1 3 @ F F
@ 3 7 F F
1 @ 7 F F
@ 3 7 F F
1 3 7 @ F
@ 3 7 7 F
1 @ 7 7 F
@ 3 7 7 F
1 3 @ 7 F
@ 3 3 7 F
1 @ 3 7 F
@ 1 3 7 F

Si te fijas la progresión es:

0-1
1-3
3-7
7-15
15-X


Si me he explicado mal avísame e intento explicarlo de otra forma.

1 respuesta
eXtreM3

#6 acabo de ver tu edit de #1, y si me has entendido... creo que es lo óptimo. Lo que necesitas es, en lugar de conocer la id de la fila-columna, del equipo (y eso es fácil porque los datos de los equipos los tienes a medida que pintas)

Clic de jquery: http://api.jquery.com/click/

Y así llamas a tu brackets.php desde jquery: http://gatsu-anotaciones.blogspot.com.es/2011/08/llamar-una-funcion-php-desde-jquery.html

pd: para estar aprendiendo, es un buen ejercicio eh :si: suerte!

1 respuesta
JuShTo

#7
Intentando entenderlo, uno con estas cosas se da cuenta de que es mas tonto de lo que cree.

#8
Es para el proyecto que tengo que entregar en Junio, quieres un maquetador de torneos. Todavía no tengo claro si será de cara al usuario o si sólo tendré un backend para que lo gestione unicamente el administrador(lo cual me ahorraría mucho trabajo).

1 respuesta
elkaoD

#9 para hacerlo mecánicamente:

Tomamos como que el primer nivel es el nivel 1.

  1. Por cada nivel, debes separar UNA SÓLA VEZ (2L-1-1) huecos, para centrar el partido entre los dos jugadores del nivel anterior (fíjate que para el nivel 1 hay una separación de 0.)

L1 = (21-1-1) = 20-1 = 1-1 = 0
L2 = (22-1-1) = 21-1 = 2-1 = 1
L3 = (23-1-1) = 22-1 = 4-1 = 3
L4 = (24-1-1) = 23-1 = 8-1 = 7
L5 = (25-1-1) = 24-1 = 16-1 = 15

  1. Luego entre cada partido de la columna hay una separación de (2L-1) tantas veces como partidos en esa columna.

L1 = (21-1) = 2-1 = 1
L2 = (22-1) = 4-1 = 3
L3 = (23-1) = 8-1 = 7
L4 = (24-1) = 16-1 = 15
L5 = (25-1) = innecesario

¿Por qué aparecen cuadrados en la ecuación? Si lo piensas en obvio:

La progresión de jugadores es una división entre 2: 16->8->4->2->1

1 1 respuesta
eXtreM3

Perfecto #10

JuShTo

Gracias a todos, ya no pregunto mas porque si con esto no lo saco es que soy malo, muy malo.

elkaoD

Me aburría y lo he hecho... en CoffeeScript

http://jsfiddle.net/xWQCw/4/

1 respuesta
JuShTo

#13 JAJAJAJA

Yo aqui sigo dándole! Lo sacaré! :)

JuShTo

He aqui el código sin separador... vamos a por él!

Script by elkaod se podría decir xDDDD

<html>
	<head>
		<title>Generar brackets</title>
	</head>
	<body>
	
	<form action="index.php" method="POST">
		<h1>
			Número de equipos en el bracket
		</h1>
		<input type="text" name="equipos" />
		<input type="submit" name="enviar" value="Enviar" />
	</form>
	<?php
	
	function crea_bracket()
	{
		$equipos = $_REQUEST['equipos'];
		$filas = ($equipos*2)-1;
		$columnas = 2*log($equipos,2)+1;
		?>
		<table>
			<?php
			for ($i=1; $i<=$filas; $i++)
			{
			?>
			<tr>
				<?php
					for ($o=1; $o<=$columnas; $o++)
					{
						$separador=pow(2,$o-1);
						$distancia=pow(2,$o);
						if (($i-$separador)% $distancia == 0)
						{
						?>
						<td>hola</td>
						<?php
						}
						else
						{
						?>
						<td>adios</td>
						<?php
						}
						
					}
					?>
				
					<?php
					
				?>
			<tr/>
			<?php
			}
			?>
		</table>
		<?php
}			
			if (isset($_POST['enviar']) && $_POST['equipos'] != "")
			{
				crea_bracket();
			}
			else
			{
				echo("No funciona");
			}
		?>
		</table>
	



</body>
</html>

Usuarios habituales

  • JuShTo
  • elkaoD
  • eXtreM3
  • Caotico
  • PiradoIV