PyLeague アカデミー

勝つチームを
プログラム
する方法を学ぶ。

ここで大事なのは、エンジンをすべて暗記することではありません。チームが下す 3 つの判断を理解し、試合に勝てるまで磨き上げることです。すでにプレーするテンプレートから、本物の相手に対する初勝利まで導きます。

どこから始めるか

ゼロから参戦までのあなたのルート

チームをゼロから書く必要はありません。近道はこうです:すでに動くものから始め、変更ごとに計測しながら、方法論をもって改良していきます。

01

テンプレートをコピー

すでに競争力のあるプレーをします:パスを出し、隅を狙ってシュートし、こぼれ球にプレスをかけます。白紙ではなく、あなたの出発点です。

$ cp -r equipos/plantilla equipos/miequipo
02

一つだけ変える

戦術だけ、または選手だけをいじります。一度に一つだけ変えることが、何が良くなり何が悪くなるかを知る唯一の方法です。

03

スパーリングで計測

多くのシードで複数の相手と対戦させ、勝率と統計を見ます。そうすれば運のいい 1 試合にだまされません。

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

競う

チームをプラットフォームにアップして ELO ランキングのあるリーグで腕を競うか、自分でリーグを開こう。コードが語ります。

$ python league.py
あなたがプログラムするもの

3 つの層、遅いものから速いものへ

チームは 3 つのレベルで判断します。要点はこうです:AI(使う場合)はゆっくりとしたペースでプランを決め、速く決定論的な層がそれを毎瞬実行します。こうすればモデルが毎秒 20 回も判断する必要はありません。興味のある層だけをカスタマイズし、残りは再利用しましょう。

10

監督

スコアと時計を読み、方針を決めます:攻撃・均衡・守備。判断の回数は少ないですが、基調を決めます。CoachBrain.decide(ctx)

ペース
6

戦術

4 つのつまみでチームをピッチに配置します:ライン高、幅、プレス、サイド。勝敗はたいていここで決まります。TeamStrategy.plan(ctx)

ペース
9

選手

毎瞬判断します:移動、パス、シュート、スプリント。速く反応的で、選手 1 人につき 1 つ。PlayerBrain.decide(view)

ティック

各層が何を受け取り何を返すかの詳細が知りたいですか?参加者ガイドにあります。

戦術、数学なしで

4 つのつまみで表すあなたのチーム

位置を手で計算することはありません。4 つの値を選ぶと、エンジンがそれを各選手の配置に変換します。値は固定することも、試合に応じて変化させること(リアクティブな戦術)もできます。

line_height · 0.0 → 1.0

ライン高

チームがどれだけ前でプレーするか。低い=引いて守る安全なブロック、高い=前からプレスをかけるが背後にスペースを残す。

width · 0.0 → 1.0

チームがどれだけ広がるか。コンパクトは中央を締め、ワイドはサイドを使って相手を引き伸ばす。

pressing · 0.0 → 1.0

プレス

どれだけの強度でボールを奪いに行くか。注意:今のところ強いプレスは消耗するうえ、必ずしも奪えません(下の「メタ」を読んでください)。

focus · left / center / right

攻撃サイド

どこに攻撃の重心を置くか。デフォルトは中央。片方のサイドに寄せれば、そこから攻めたりフォワードの飛び出しを狙えます。

本物のコード

6 行で書く、あなたの最初の戦術

固定戦術はつまみの辞書です。リアクティブ戦術は試合を見ながらそれを再計算する関数です。どちらも短くて済みます。

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…)と、選手や監督の書き方は戦術ドキュメントにあります。

勝つためのレシピ

本当に差を生むもの

何百試合もプレーして得たコツです。魔法ではありません。競争するチームと、ただ数合わせのチームを分ける習慣です。

推測せず、計測する

1 試合は嘘をつきます:運が大きく効きます。多くのシードでスパーリングを使い、感覚ではなく勝率で判断しましょう。

メタを突く

今のところコンパクトで引いたブロックのほうが、高い位置のプレスより効果的です。後ろを堅くしてから、そこから伸ばしましょう。

スタミナを管理する

スプリントや強いシュートは消耗します。スプリントは終盤に取っておき、すでに疲れ切った相手にプレスをかけましょう

チームのプランを使う

選手のコードで view.plan を読みましょう:どこに位置取り、誰がボールに行くべきかを教えてくれます。一人だけで場当たり的に動かないこと。

隅を狙ってシュート

中央に打つのはボールをキーパーに献上するようなもの。ポストを狙い、力を加減しましょう:常に全力とは限りません。

順序立てて層を上げる

まず戦術(つまみ)、次に選手(パス・シュート・マーク)、最後に監督(いつ勝負に出るか)。

よくある失敗

そしてその避け方

始めたてのころ、ほぼ誰もがここでつまずきます。先回りして見抜けば、つまらない敗戦を半ダースは減らせます。

常に全力プレス

奪えると思っても、結局疲れるだけです。対処: pressing を下げ、ずっとではなく場面を選んでプレスしましょう。

出歩くキーパー

ゴールから離れた GK は失点の献上です。対処: 離れさせないこと。サンプルの選手がどう扱っているか見ましょう。

カバーのない高すぎるライン

全員を上げると背後を突かれます。対処: ディフェンスより中盤とフォワードを上げるか、ラインを下げましょう。

特定の相手に合わせすぎる

一人には勝てても、全員には負けます。対処: 何かを良しとする前に、複数の相手と複数のシードで計測しましょう。

常に最大の力でシュート

常に全力=スタミナが尽き、終盤のシュートが悪くなります。対処: kick_power を加減しましょう。

落ちるコード

エンジンは守ってくれますが、エラーを起こした選手は動かなくなり、ティックを失います。対処: ローカルでテストし、ビューアで確認しましょう。

エンジンの「メタ」

何が勝つかを見つけるのもゲームのうち

今のエンジンについての正直な事実:コンパクトで守備的な戦術のほうが、高い位置のプレスより効果的です。理由は、今のところプレスがボールを効果的に「奪えない」からです——ボールの保持は粘着的で、奪うにはかなりの余裕をもって近づく必要があります。そのため catenaccio のようなスタイルはたいていうまくいき、gegenpressing は苦戦します。

サンプルの戦術は出発点であり、最適解ではありません。エンジンは進化します(ロードマップにはプレスがボールを奪えるようになることが含まれています)から、メタも変わります。勝てる組み合わせを見つけることが、あなたの競争上の強みです。

参戦する前に

あなたのチームは準備できていますか?

このクイックリストを確認しましょう。すべてにチェックが付けば、アップして他の人と腕を競えます。

  • エラーなくプレーする:例外も止まる選手もなく、1 試合を最後までもたせる。
  • テンプレートに勝つ:複数のシードで基準となる相手から勝ち星を挙げる。
  • 明確な狙いがある:なぜその配置になるのかを説明できる。
  • スタミナを活かす:終盤に疲れ切らず、スプリントを無駄遣いしない。
  • 考えてシュートする:隅を狙い、力を加減する。
  • データで計測済み:1 試合だけでなく、スパーリングを通している。
さあ、あなたの番です

やり方はもう分かった。
あとはコードが決める。

アカウントを作れば数分でオンライン参戦、あるいはクローンしてローカルで開発。基本モードなら API も設定も不要で動きます。