Академия PyLeague

Научитесь
программировать
команду-победителя.

Здесь не нужно знать весь движок наизусть. Нужно понять три решения, которые принимает ваша команда, и оттачивать их, пока они не начнут приносить победы. Мы проведём вас от готового шаблона до первой победы над настоящим соперником.

С чего начать

Ваш маршрут: от нуля до соревнования

Не нужно писать команду с нуля. Короткий путь такой: начните с того, что уже работает, и планомерно улучшайте, измеряя каждое изменение.

01

Скопируйте шаблон

Она уже играет конкурентоспособно: пасует, бьёт по углам и прессингует свободные мячи. Это ваша отправная точка, а не чистый лист.

$ cp -r equipos/plantilla equipos/miequipo
02

Меняйте одно

Меняйте только тактику или только игрока. Единственное изменение за раз — единственный способ понять, что помогает, а что вредит.

03

Измеряйте спаррингом

Сведите её с несколькими соперниками на множестве сидов и смотрите на win-rate и статистику. Так вас не обманет один везучий матч.

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

Соревнуйтесь

Загрузите команду на платформу и померяйтесь силами в лигах с рейтингом ELO или создайте свою. Код говорит сам за себя.

$ python league.py
Что вы программируете

Три слоя, от медленного к быстрому

Ваша команда принимает решения на трёх уровнях. Ключевая идея: ИИ (если вы его используете) задаёт план в медленном темпе, а быстрый детерминированный слой исполняет его каждое мгновение. Так модели не приходится решать 20 раз в секунду. Настраивайте только интересный вам слой; остальное используйте повторно.

10

Тренер

Читает счёт и время и задаёт установку: атаковать, баланс или обороняться. Решает редко, но задаёт тон. CoachBrain.decide(ctx)

темпмедленный
6

Тактика

Расставляет команду на поле четырьмя регуляторами: высота линии, ширина, прессинг и фланг. Почти всегда именно здесь выигрывают или проигрывают. TeamStrategy.plan(ctx)

темпсредний
9

Игрок

Решает каждое мгновение: двигаться, пасовать, бить, спринтовать. Быстро и реактивно, по одному на игрока. PlayerBrain.decide(view)

каждыйтик

Хотите узнать в деталях, что получает и что возвращает каждый слой? Это в Руководстве участника.

Тактика без математики

Ваша команда в четырёх регуляторах

Вы не считаете позиции вручную. Вы выбираете четыре значения, и движок превращает их в расстановку каждого игрока. Их можно зафиксировать или менять по ходу матча (реактивная тактика).

line_height · 0.0 → 1.0

Высота линии

Насколько высоко играет ваша команда. Низкая — отошедший назад надёжный блок; высокая — вы прессингуете впереди, но оставляете пространство за спиной.

width · 0.0 → 1.0

Ширина

Насколько широко расположена команда. Компактно закрывает центр; широко ищет фланги и растягивает соперника.

pressing · 0.0 → 1.0

Прессинг

С какой интенсивностью вы идёте за мячом. Внимание: сегодня активный прессинг утомляет и не всегда отбирает мяч (см. «мета» ниже).

focus · left / center / right

Фланг атаки

Куда вы смещаете игру. По умолчанию центр; сместите на фланг, чтобы атаковать оттуда или искать открывание своего нападающего.

Настоящий код

Ваша первая тактика в шесть строк

Фиксированная тактика — это словарь регуляторов. Реактивная — функция, которая пересчитывает их, глядя на матч. Обе короткие.

mi_tactica.py
# 1) ФИКСИРОВАННАЯ тактика: постоянный стиль
from aicup import TacticalStrategy

mi_estilo = TacticalStrategy("Mi estilo", {
    "line_height": 0.35,   # оттянутый, надёжный
    "width":       0.45,   # компактно по центру
    "pressing":    0.30,   # выжидаю, не бросаюсь вперёд
})

# 2) РЕАКТИВНАЯ тактика: меняется по ходу матча
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}   # отхожу в оборону
    return {"line_height": 0.74, "pressing": 0.50}       # отобрав мяч, бросаюсь вперёд

mi_contra = TacticalStrategy("Mi contraataque", mandos)

Регулятор, который вы не зададите, использует значение по умолчанию. Полная галерея (tiki-taka, catenaccio, gegenpressing…) и то, как написать игрока и тренера, есть в документации по тактикам.

Рецепты побед

Что действительно решает

Советы, рождённые из сотен сыгранных матчей. Это не магия: это привычки, отличающие конкурентоспособную команду от той, что просто отбывает номер.

Измеряйте, а не гадайте

Один матч обманчив: везение весомо. Используйте спарринг на множестве сидов и решайте по win-rate, а не по ощущениям.

Используйте «мету»

Сегодня компактный, оттянутый назад блок эффективнее высокого прессинга. Начните с надёжной обороны и развивайтесь оттуда.

Управляйте выносливостью

Спринты и мощные удары утомляют. Приберегите спринты на концовку и прессингуйте выдохшегося соперника.

Используйте план команды

В своём игроке читайте view.plan: он подсказывает, где встать и кому идти на мяч. Не импровизируйте в одиночку.

Бейте по углам

Бить в центр — дарить мяч вратарю. Цельтесь в штанги и регулируйте силу: не всё решает максимальная мощь.

Поднимайтесь по слоям по порядку

Сначала тактика (регуляторы), затем игрок (пасы, удары, опека) и в последнюю очередь тренер (когда рисковать).

Типичные ошибки

И как их избежать

Почти все спотыкаются здесь в начале. Если предвидеть их, сэкономите с полдюжины глупых поражений.

Постоянный прессинг на максимум

Вы ждёте отбора, а только устаёте. Решение: снизьте pressing и прессингуйте моментами, а не всё время.

Гуляющий вратарь

GK вдали от своих ворот — это подаренные голы. Решение: не давайте ему отходить; посмотрите, как с ним обходится игрок из примера.

Слишком высокая линия без подстраховки

Вы поднимаете всех, и вас ловят за спиной. Решение: поднимайте полузащиту и нападающих сильнее, чем защиту, или опустите линию.

Подгонка под одного соперника

Обыгрываете одного и проигрываете всем. Решение: проверяйте против нескольких соперников и нескольких сидов, прежде чем считать что-то удачным.

Удары на максимальной мощности

Всегда на силу = остаётесь без выносливости и бьёте хуже в концовке. Решение: дозируйте kick_power.

Код, который падает

Движок вас защищает, но игрок со сбоем застывает на месте, и вы теряете тики. Решение: тестируйте локально и проверяйте просмотрщик.

«Мета» движка

Выяснить, что побеждает, — часть игры

Честная деталь о нынешнем движке: компактные оборонительные тактики эффективнее высокого прессинга. Причина в том, что пока прессинг не «отбирает» мяч эффективно —владение «липкое», и чтобы его отнять, нужно подойти с большим запасом—. Поэтому стили вроде catenaccio обычно идут очень хорошо, а gegenpressing страдает.

Тактики из примеров — это отправные точки, а не оптимальные решения. Движок будет развиваться (дорожная карта предусматривает, что прессинг начнёт отбирать мяч), так что и «мета» изменится. Найти выигрышную комбинацию сейчас — ваше конкурентное преимущество.

Перед соревнованием

Ваша команда готова?

Пройдитесь по этому быстрому списку. Если отметили всё — можно загружать команду и мериться силами с остальными.

  • Играет без сбоев: выдерживает целый матч без исключений и застывших игроков.
  • Обыгрывает шаблон: выигрывает у эталонного соперника на нескольких сидах.
  • Имеет чёткую идею: вы понимаете, почему она расставляется именно так.
  • Разумно расходует выносливость: не выдыхается к концу и не тратит спринты впустую.
  • Бьёт с умом: целится по углам и дозирует мощность.
  • Проверена данными: вы прогнали её через спарринг, а не только через один матч.
Теперь ваш ход

Вы уже знаете как.
Пусть решает код.

Создайте аккаунт и соревнуйтесь онлайн за минуты — или клонируйте и работайте локально. В базовом режиме работает без API и настройки.