Academia PyLeague

Aprende a
programar
un equipo que gana.

Aquí no se trata de saberte todo el motor de memoria. Se trata de entender las tres decisiones que toma tu equipo y afinarlas hasta que ganen partidos. Te llevamos de la plantilla que ya juega a tu primera victoria contra un rival de verdad.

Por dónde empezar

Tu ruta, de cero a competir

No hace falta escribir un equipo desde la nada. El camino corto es este: partes de algo que ya funciona y lo vas mejorando con método, midiendo cada cambio.

01

Copia la plantilla

Ya juega de forma competitiva: pasa, dispara a las esquinas y presiona balones sueltos. Es tu punto de partida, no un folio en blanco.

$ cp -r equipos/plantilla equipos/miequipo
02

Cambia una cosa

Toca solo la táctica, o solo el jugador. Un único cambio cada vez es la única forma de saber qué mejora y qué empeora.

03

Mide con sparring

Enfréntalo a varios rivales en muchas semillas y mira win-rate y estadísticas. Así no te engaña un partido con suerte.

$ python sparring.py --team equipos/miequipo
04

Compite

Sube tu equipo a la plataforma y mídete en ligas con ranking ELO, o monta la tuya. El código habla.

$ python league.py
Lo que programas

Tres capas, de lo lento a lo rápido

Tu equipo decide en tres niveles. La idea clave: la IA (si la usas) fija el plan a ritmo lento, y una capa determinista y rápida lo ejecuta cada instante. Así un modelo nunca tiene que decidir 20 veces por segundo. Personaliza solo la capa que te interese; el resto lo reutilizas.

10

Entrenador

Lee el marcador y el reloj y fija la mentalidad: atacar, equilibrio o defender. Decide pocas veces, pero marca el tono. CoachBrain.decide(ctx)

ritmolento
6

Táctica

Coloca al equipo en el campo con cuatro mandos: altura de línea, amplitud, presión y banda. Casi siempre es aquí donde se gana o se pierde. TeamStrategy.plan(ctx)

ritmomedio
9

Jugador

Decide cada instante: moverse, pasar, tirar, esprintar. Rápido y reactivo, uno por jugador. PlayerBrain.decide(view)

cadatick

¿Quieres el detalle de qué recibe y qué devuelve cada capa? Está en la Guía del participante.

La táctica, sin matemáticas

Tu equipo, en cuatro mandos

No calculas posiciones a mano. Eliges cuatro valores y el motor los traduce a dónde se coloca cada jugador. Puedes fijarlos o hacer que cambien según el partido (una táctica reactiva).

line_height · 0.0 → 1.0

Altura de línea

Cómo de adelantado juega tu equipo. Baja = bloque replegado y seguro; alta = presionas arriba pero dejas espacio a la espalda.

width · 0.0 → 1.0

Amplitud

Cómo de abierto está el equipo. Compacto tapa el centro; abierto busca las bandas y estira al rival.

pressing · 0.0 → 1.0

Presión

Con cuánta intensidad vas a por el balón. Ojo: hoy presionar mucho cansa y no siempre roba (lee el «meta» más abajo).

focus · left / center / right

Banda de ataque

Por dónde cargas el juego. Centro por defecto; cárgalo a una banda para atacar por ahí o para buscar el desmarque de tu delantero.

Código de verdad

Tu primera táctica, en seis líneas

Una táctica fija es un diccionario de mandos. Una reactiva es una función que los recalcula mirando el partido. Las dos, cortas.

mi_tactica.py
# 1) Táctica FIJA: un estilo constante
from aicup import TacticalStrategy

mi_estilo = TacticalStrategy("Mi estilo", {
    "line_height": 0.35,   # replegado, seguro
    "width":       0.45,   # compacto por el centro
    "pressing":    0.30,   # espero, no me lanzo
})

# 2) Táctica REACTIVA: cambia según el partido
from aicup.tactics import progress, possession

def mandos(ctx):
    defendiendo = possession(ctx) == "theirs" or progress(ctx) < 0.45
    if defendiendo:
        return {"line_height": 0.30, "pressing": 0.35}   # me repliego
    return {"line_height": 0.74, "pressing": 0.50}       # al robar, me lanzo

mi_contra = TacticalStrategy("Mi contraataque", mandos)

El mando que no pongas usa su valor por defecto. La galería completa (tiki-taka, catenaccio, gegenpressing…) y cómo escribir el jugador y el entrenador están en las docs de tácticas.

Recetas para ganar

Lo que de verdad marca la diferencia

Consejos que salen de jugar cientos de partidos. No son magia: son hábitos que separan a un equipo que compite de uno que hace bulto.

Mide, no adivines

Un partido miente: la suerte pesa. Usa sparring con muchas semillas y decide por win-rate, no por sensaciones.

Explota el meta

Hoy un bloque compacto y replegado rinde más que la presión alta. Empieza sólido atrás y crece desde ahí.

Gestiona la estamina

Esprintar y chutar fuerte cansa. Guarda sprints para el tramo final y presiona al rival que ya está fundido.

Usa el plan del equipo

En tu jugador, lee view.plan: te dice dónde colocarte y a quién le toca ir al balón. No improvises solo.

Dispara a las esquinas

Chutar al centro es regalar el balón al portero. Apunta a los palos y ajusta la potencia: no todo es máxima fuerza.

Sube de capa con orden

Primero la táctica (mandos), luego el jugador (pases, tiros, marcajes) y por último el entrenador (cuándo arriesgar).

Errores típicos

Y cómo evitarlos

Casi todo el mundo tropieza aquí al empezar. Verlos venir te ahorra media docena de derrotas tontas.

Presión a tope siempre

Esperas robar y solo consigues cansarte. Arreglo: baja el pressing y presiona por momentos, no todo el rato.

Portero paseante

Un GK lejos de su portería son goles regalados. Arreglo: que no se aleje; mira cómo lo trata el jugador de ejemplo.

Línea muy alta sin cobertura

Subes a todos y te cazan a la espalda. Arreglo: sube medios y delanteros más que la defensa, o baja la línea.

Sobreajustar a un rival

Ganas a uno y pierdes con todos. Arreglo: mide contra varios rivales y varias semillas antes de dar algo por bueno.

Chutar a máxima potencia

Fuerza siempre = te quedas sin estamina y disparas peor al final. Arreglo: dosifica la kick_power.

Código que peta

El motor te protege, pero un jugador que falla se queda quieto y pierdes ticks. Arreglo: prueba en local y revisa el visor.

El «meta» del motor

Descubrir qué gana es parte del juego

Un detalle honesto del motor de hoy: las tácticas compactas y defensivas rinden mejor que la presión alta. El motivo es que, por ahora, presionar no «roba» el balón de forma efectiva —la posesión es pegajosa y quitarla exige acercarse con mucho margen—. Por eso estilos tipo catenaccio suelen ir muy bien y el gegenpressing sufre.

Las tácticas de ejemplo son puntos de partida, no soluciones óptimas. El motor evolucionará (el roadmap contempla que la presión llegue a robar balón), así que el meta también cambiará. Encontrar la combinación que gana ahora es tu ventaja competitiva.

Antes de competir

¿Tu equipo está listo?

Repasa esta lista rápida. Si marcas todo, ya puedes subirlo y medirte con el resto.

  • Juega sin fallar: aguanta un partido entero sin excepciones ni jugadores parados.
  • Gana a la plantilla: le saca partidos al rival de referencia en varias semillas.
  • Tiene una idea clara: sabes por qué se coloca como se coloca.
  • Aprovecha la estamina: no llega fundido al final ni malgasta sprints.
  • Dispara con criterio: apunta a las esquinas y dosifica la potencia.
  • Medido con datos: lo has pasado por el sparring, no solo por un partido.
Ahora te toca a ti

Ya sabes cómo.
Que decida el código.

Crea tu cuenta y compite online en minutos, o clónalo y trabaja en local. En modo básico funciona sin API ni configuración.