Académie PyLeague

Apprenez à
programmer
une équipe qui gagne.

Ici, il ne s'agit pas de connaître tout le moteur par cœur. Il s'agit de comprendre les trois décisions que prend votre équipe et de les affiner jusqu'à gagner des matchs. Nous vous emmenons du modèle qui joue déjà à votre première victoire contre un vrai adversaire.

Par où commencer

Votre parcours, de zéro à la compétition

Nul besoin d'écrire une équipe à partir de rien. Le chemin court est celui-ci : vous partez de quelque chose qui fonctionne déjà et vous l'améliorez avec méthode, en mesurant chaque changement.

01

Copiez le modèle

Il joue déjà de façon compétitive : il passe, tire dans les lucarnes et presse les ballons libres. C'est votre point de départ, pas une page blanche.

$ cp -r equipos/plantilla equipos/miequipo
02

Changez une chose

Modifiez seulement la tactique, ou seulement le joueur. Un seul changement à la fois est la seule façon de savoir ce qui améliore et ce qui dégrade.

03

Mesurez avec le sparring

Affrontez plusieurs adversaires sur de nombreuses graines et regardez le win-rate et les statistiques. Ainsi un match chanceux ne vous trompe pas.

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

Concourez

Envoyez votre équipe sur la plateforme et mesurez-vous en ligues avec classement ELO, ou créez la vôtre. Le code parle.

$ python league.py
Ce que vous programmez

Trois couches, du lent au rapide

Votre équipe décide à trois niveaux. L'idée clé : l'IA (si vous l'utilisez) fixe le plan à un rythme lent, et une couche déterministe et rapide l'exécute à chaque instant. Ainsi un modèle n'a jamais à décider 20 fois par seconde. Personnalisez seulement la couche qui vous intéresse ; le reste, vous le réutilisez.

10

Entraîneur

Lit le score et le chrono et fixe l'état d'esprit : attaquer, équilibre ou défendre. Décide rarement, mais donne le ton. CoachBrain.decide(ctx)

rythmelent
6

Tactique

Place l'équipe sur le terrain avec quatre curseurs : hauteur de ligne, largeur, pressing et côté. C'est presque toujours ici qu'on gagne ou qu'on perd. TeamStrategy.plan(ctx)

rythmemoyen
9

Joueur

Décide à chaque instant : se déplacer, passer, tirer, sprinter. Rapide et réactif, un par joueur. PlayerBrain.decide(view)

chaquetick

Vous voulez le détail de ce que reçoit et renvoie chaque couche ? C'est dans le Guide du participant.

La tactique, sans mathématiques

Votre équipe, en quatre curseurs

Vous ne calculez pas les positions à la main. Vous choisissez quatre valeurs et le moteur les traduit en placement de chaque joueur. Vous pouvez les fixer ou les faire varier selon le match (une tactique réactive).

line_height · 0.0 → 1.0

Hauteur de ligne

À quel point votre équipe joue haut. Basse = bloc replié et sûr ; haute = vous pressez haut mais laissez de l'espace dans le dos.

width · 0.0 → 1.0

Largeur

À quel point l'équipe est étirée. Compact bouche l'axe ; large cherche les ailes et étire l'adversaire.

pressing · 0.0 → 1.0

Pressing

Avec quelle intensité vous allez chercher le ballon. Attention : aujourd'hui, presser beaucoup fatigue et ne récupère pas toujours (lisez le «meta» plus bas).

focus · left / center / right

Côté d'attaque

Par où vous orientez le jeu. Axe par défaut ; orientez-le vers un côté pour y attaquer ou chercher l'appel de votre attaquant.

Du vrai code

Votre première tactique, en six lignes

Une tactique fixe est un dictionnaire de curseurs. Une tactique réactive est une fonction qui les recalcule en observant le match. Les deux, courtes.

mi_tactica.py
# 1) Tactique FIXE : un style constant
from aicup import TacticalStrategy

mi_estilo = TacticalStrategy("Mi estilo", {
    "line_height": 0.35,   # replié, sûr
    "width":       0.45,   # compact dans l'axe
    "pressing":    0.30,   # j'attends, je ne me projette pas
})

# 2) Tactique RÉACTIVE : change selon le match
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}   # je me replie
    return {"line_height": 0.74, "pressing": 0.50}       # à la récupération, je me projette

mi_contra = TacticalStrategy("Mi contraataque", mandos)

Le curseur que vous ne réglez pas prend sa valeur par défaut. La galerie complète (tiki-taka, catenaccio, gegenpressing…) et comment écrire le joueur et l'entraîneur sont dans les docs des tactiques.

Recettes pour gagner

Ce qui fait vraiment la différence

Des conseils issus de centaines de matchs. Ce n'est pas magique : ce sont les habitudes qui séparent une équipe qui rivalise d'une équipe qui fait de la figuration.

Mesurez, ne devinez pas

Un match ment : la chance pèse. Utilisez le sparring sur de nombreuses graines et décidez au win-rate, pas au ressenti.

Exploitez le meta

Aujourd'hui, un bloc compact et replié rend plus que le pressing haut. Commencez solide derrière et construisez à partir de là.

Gérez l'endurance

Sprinter et frapper fort fatigue. Gardez des sprints pour le money time et pressez l'adversaire déjà à bout de souffle.

Utilisez le plan de l'équipe

Dans votre joueur, lisez view.plan : il vous dit où vous placer et à qui revient d'aller au ballon. N'improvisez pas dans votre coin.

Tirez dans les lucarnes

Frapper au centre, c'est offrir le ballon au gardien. Visez les poteaux et ajustez la puissance : tout n'est pas dans la force maximale.

Montez de couche avec méthode

D'abord la tactique (curseurs), puis le joueur (passes, tirs, marquages) et enfin l'entraîneur (quand prendre des risques).

Erreurs classiques

Et comment les éviter

Presque tout le monde trébuche ici au début. Les voir venir vous épargne une demi-douzaine de défaites bêtes.

Pressing à fond en permanence

Vous espérez récupérer et vous ne faites que vous épuiser. Correctif : baissez le pressing et pressez par séquences, pas en continu.

Gardien baladeur

Un GK loin de sa cage, ce sont des buts offerts. Correctif : qu'il ne s'éloigne pas ; regardez comment le joueur d'exemple le gère.

Ligne trop haute sans couverture

Vous montez tout le monde et on vous prend dans le dos. Correctif : montez les milieux et attaquants plus que la défense, ou baissez la ligne.

Surajuster à un adversaire

Vous battez l'un et perdez contre tous. Correctif : mesurez contre plusieurs adversaires et plusieurs graines avant de valider quoi que ce soit.

Frapper à puissance maximale

Toujours à fond = vous manquez d'endurance et tirez moins bien en fin de match. Correctif : dosez la kick_power.

Du code qui plante

Le moteur vous protège, mais un joueur qui échoue reste immobile et vous perdez des ticks. Correctif : testez en local et vérifiez la visionneuse.

Le «meta» du moteur

Découvrir ce qui gagne fait partie du jeu

Un détail honnête sur le moteur actuel : les tactiques compactes et défensives rendent mieux que le pressing haut. La raison est que, pour l'instant, presser ne «récupère» pas le ballon de façon efficace —la possession est collante et la reprendre exige de s'approcher avec beaucoup de marge—. C'est pourquoi les styles à la catenaccio marchent souvent très bien et le gegenpressing souffre.

Les tactiques d'exemple sont des points de départ, pas des solutions optimales. Le moteur évoluera (la feuille de route prévoit que le pressing finisse par récupérer le ballon), donc le meta changera aussi. Trouver la combinaison qui gagne maintenant est votre avantage compétitif.

Avant de concourir

Votre équipe est-elle prête ?

Passez en revue cette liste rapide. Si vous cochez tout, vous pouvez déjà l'envoyer et vous mesurer aux autres.

  • Il joue sans faillir : il tient un match entier sans exceptions ni joueurs immobiles.
  • Il bat le modèle : il prend des matchs à l'adversaire de référence sur plusieurs graines.
  • Il a une idée claire : vous savez pourquoi il se place comme il se place.
  • Il gère l'endurance : il n'arrive pas à bout de souffle en fin de match et ne gaspille pas ses sprints.
  • Il tire avec discernement : il vise les lucarnes et dose la puissance.
  • Mesuré avec des données : vous l'avez passé au sparring, pas seulement à un match.
À vous de jouer maintenant

Vous savez comment faire.
Laissez le code décider.

Créez votre compte et concourez en ligne en quelques minutes, ou clonez-le et travaillez en local. En mode basique, il fonctionne sans API ni configuration.