背景
ウマ娘では、対象のウマ娘でゲーム内の G1~G3 レースで 1 着をとると「〇〇全冠」という称号が取得できます。
ただし対象レースは全部で 155個 あり、
育成ではクラシック級7月後半~シニア級12月後半の 59ターン しか出走できません。
※クラシック級7月前半はレースが存在しないため
さらにレース条件には以下のように種類があります。
- バ場: 芝 / ダート
- 距離: 短距離 / マイル / 中距離 / 長距離
そのため 1回の育成では全冠は不可能 で、毎回どのレースに出走するか計算する必要があり大変です。
これを効率化するため、プログラムでレースパターン計算機能を作ってみました。
テーブル設計
最初にレース情報とウマ娘の適性、
さらにユーザーと紐づけるためのテーブルを設計しました。
-
UserPersonal
ユーザーの基本情報を保持するテーブル。
認証に必要なuser_nameやpassword、管理フラグなどを持ちます -
Umamusume
各ウマ娘の基本情報テーブル。
名前に加えて、芝・ダートや距離ごとの適性を管理します -
Race
レースの基本情報テーブル。
レース名、距離、開催時期(何月・前半/後半)、レースグレード(G1/G2/G3)、
ジュニア/クラシック/シニアの区分フラグなどを持ちます -
RegistUmamusume
ユーザーが登録したウマ娘情報。
登録日時や累計ファン数などを保持します -
RegistUmamusumeRace
ユーザーが実際に出走させたレース情報。
どのウマ娘がどのレースに出走したかを管理します -
ScenarioRace
各シナリオに紐づく目標レース情報。
ウマ娘のシナリオごとの目標レースを保持します
シナリオごとの違い
2025年9月時点で、ウマ娘には 11個のシナリオ が存在します。
通常シナリオ
ほとんどのシナリオは、ウマ娘ごとに目標レースが固定されており、
同じタイミングに存在するレースは出走できません。
Make a new track シナリオ
目標レースが存在せず、事実上 すべてのレースに出走可能 です。
プロジェクト L'Arc シナリオ
- 全てのウマ娘で目標レースが固定
- クラシック級7月前半~10月前半、シニア級6月後半以降は固定レース以外に出走不可
- シナリオ終盤は凱旋門賞で終了
特に ニエル賞 / フォワ賞 / 凱旋門賞 はこのシナリオ限定なので必ず1度はこのシナリオを行う必要があります。
ロジック概要
レースパターン生成の流れは以下の通りです。
-
初期データの取得
- ウマ娘の基本情報
- 出走済みレース
- 出走していないレース
- シナリオ目標レース
-
因子補強戦略の作成
- 例: ダートG・マイルG・短距離G の場合
→{'ダート': 3, 'マイル': 3}のように補強対象を決定
- 例: ダートG・マイルG・短距離G の場合
-
シナリオと残レースの競合を抽出
-
戦略を適用しながらパターン作成
- 因子戦略に合うレースを優先して配置
- シナリオ目標レースと競合するレースを最初に当て込む
- ラークシナリオ条件が揃えば強制的に適用
- シナリオ名を「伝説 / メイクラ / ラーク」で分類
※2025年9月時点でオートでできるシナリオでやりやすいのが伝説シナリオのため - 空き枠は残レースから順次補完
-
ループ
- 残レースが尽きるまで4を繰り返し、複数パターンを生成
画面イメージ
左側にはウマ娘情報・選択シナリオ・必要因子が表示され、
右側にはジュニア期~シニア期の出走スケジュールが一覧化されます。
タブを切り替えることでクラシック期やシニア期のパターンも確認可能です。
レース画像をクリックすると 出走処理 が行われ、
DB の RegistUmamusumeRace にレコードが追加されます。
ソースコード
詳しい処理は下記リポジトリにて公開しています。
UMA-Crown-Fans-Assistant-Tool-Back (GitHub)
app/uma_api/racePattern.py にロジックがまとまっています。
まとめ
- ウマ娘の全冠称号取得を効率化するため、レースパターン自動生成機能を実装した
- シナリオごとの制約(特に L'Arc)を考慮しつつ、因子戦略と残レースを組み合わせてパターン化
遊びの要素からでも、アルゴリズム設計やDB設計の練習になり面白かったです。







