让 ИИ рекомендовать колоду для «Clash Royale» несложно. По-настоящему ценный вопрос заключается в следующем: почему выбраны именно эти восемь карт? Как они взаимодействуют друг с другом? Как следует разыгрывать карты при атаке и защите? И как проверить результат рекомендации?
В этой статье на примере колоды с Гигантом для контратаки после защиты со средней стоимостью 3,5 эликсира рассматривается, как преобразовать требования на естественном языке в структурированный стратегический анализ, а затем с помощью проверки кодом и генерации изображений получить учебный план, который можно понять, отрабатывать и совершенствовать.
Весь процесс заключается не в том, чтобы модель вскользь выдала «самую сильную колоду», а в разделении работы на четыре части:
определение ограничений → анализ колоды → проверка результата → создание визуального руководства.
¶ I. Сначала определим: какую проблему мы хотим, чтобы ИИ решил?
«Помоги мне собрать колоду, с которой легко побеждать» на первый взгляд звучит ясно, но на деле не хватает множества необходимых условий: на какой арене находится игрок? Какие карты уже разблокированы? Близки ли уровни карт? Используются ли эволюции карт, навыки героев или особые войска башни? Игрок лучше знаком с быстрым циклом или с контратакой после защиты? Под «легко» подразумевается простота управления или явное преимущество против определённых соперников?
Если эта информация не предоставлена, модели легко выдать состав, который теоретически разумен, но на практике не подходит аккаунту игрока. Поэтому в этом примере сначала задаются следующие границы:
| Измерение | Ограничения в этот раз |
|---|---|
| Выбор карт | В приоритете базовые, распространённые обычные и редкие карты |
| Форма карт | Обычная форма, без зависимости от эволюций или навыков героев |
| Условия башни | Обычная Принцесса-башня |
| Условия уровней | По умолчанию уровни карт обеих сторон близки |
| Цель управления | Чёткое распределение ролей, подходит для обучения |
| Тактическое направление | Организация контратаки после успешной защиты |
| Границы оценки | Не заявлять, что это сильнейшая колода текущей версии, не выдумывать винрейт |
Эти ограничения определяют направление дальнейшего анализа: мы ищем базовый вариант, который легко понять и в котором роли взаимно дополняются, а не «формулу гарантированной победы», не проверенную в реальных боях.
¶ II. Пусть GPT-6 Astra отвечает за анализ, а программа — за проверку
В этом примере GPT-6 Astra вызывается через интерфейс Chat Completions AceDataCloud, а идентификатор модели в запросе — gpt-6-astra. Адрес интерфейса, способ аутентификации и структура сообщений следуют документации по подключению к платформе; доступность модели и параметры должны определяться конфигурацией платформы на момент вызова. Здесь используется идентификатор модели, предоставленный платформой, и из этого не следует доступность других точек входа сервисов.
| Инструмент | Выполняемая работа | Работа, которую не следует поручать |
|---|---|---|
| GPT-6 Astra | Объяснение ролей карт, анализ взаимодействий, организация шагов атаки и защиты | Доказывать винрейт вместо реальных данных боёв |
| Python | Проверка количества карт, повторов, стоимости и затрат комбинаций | Оценивать практическую силу боя только по сложению |
| GPT Image 2 | Преобразование тактического плана в учебный плакат | Быть авторитетным источником по игровой механике |
Также необходимо различать исторический процесс и способ воспроизведения: восемь карт этой колоды были сформированы на этапе предварительного анализа, после чего GPT-6 Astra действительно был вызван для её структурированной проверки; Astra не искала глобально оптимальное решение из полного пула карт. Учебный плакат был сгенерирован Image 2.0.
Такая фиксация процесса не только упрощает воспроизведение, но и позволяет избежать преувеличения утверждения «модель участвовала в анализе» до «модель доказала оптимальность».
¶ III. Проектирование промпта: от «рекомендации колоды» к «рассуждению в условиях ограничений»
¶ 1. Промпт для открытого составления колоды
Если начинать со своего пула карт, можно использовать следующий шаблон:
Ты — строгий помощник по учебному анализу «Clash Royale».
Цель:
Из предоставленных мной доступных карт выбрать колоду из восьми карт, подходящую для базового игрока.
Условия:
1. Используй только уже разблокированные мной карты.
2. Не полагайся на эволюции или навыки героев.
3. По умолчанию используются обычные Принцесса-башни, а уровни карт близки.
4. В приоритете взаимодополняющие роли, простота управления и удобство обучения.
5. Необходимо объяснить основной способ разрушения башни, защиту от воздуха, зачистку групп и способ обороны.
Входные данные:
- Моя арена и количество кубков: …
- Доступные карты и их уровни: …
- Частые соперники: …
- Мои предпочтения в управлении: …
Выходные данные:
- Восемь карт и их роли
- Общая стоимость и средняя стоимость
- Причины выбора
- Шаги атаки и защиты
- Явные слабости и цена замены
Не выдумывай винрейт.
Если нет актуальных данных, не утверждай, что это сильнейшая колода текущей версии.
Ключевой момент не в длине промпта, а в том, предоставлены ли допустимый диапазон выбора, цель оптимизации и ограничения, которые обязательно нужно признать.
¶ 2. Промпт для проверки, использованный в этом примере
Чтобы проверить существующий вариант, в этот раз задача дополнительно сужается. Ниже приведена организованная версия фактических требований к проверке:
Проверь следующую колоду, а не ищи заново оптимальное решение из полного пула карт:
Гигант5, Мини ПЕККА4, Мушкетёр4, Бомбёр2,
Миньоны3, Пушка3, Стрелы3, Огненный шар4.
По умолчанию:
близкие уровни карт, обычные Принцесса-башни, обычная форма,
без эволюций, без навыков героев.
Верни действительный объект json, содержащий:
deck, total_elixir, average_elixir,
advantages, attack_steps, defense_cases,
limitations, validation_note.
Требования:
- Объясни роль каждой карты.
- Различай «использование выживших после защиты войск» и «бесплатное получение юнитов».
- Не говори, что комбинацию за 11 эликсира можно сразу полностью разыграть при полном запасе в 10 эликсира.
- Не обещай защиту без урона.
- Не предоставляй точные значения урона или винрейта без источников.
Основной вывод, полученный в результате фактического вызова, таков: роли карт в колоде чётко распределены, она подходит для отработки оборонительных контратак, но воздушные юниты нуждаются в защите, а на этапе продвижения также необходимо сохранять ресурсы для противодействия атаке на другой стороне. Это относится к теоретическому анализу на основе заданных механик и не равнозначно тестированию в симуляторе или статистике ладдера.
¶ IV. Получение структурированного анализа через API
Интерфейс Chat Completions использует аутентификацию Bearer Token, а сгенерированный текст можно прочитать из choices[0].message.content.
Ниже приведён упрощённый пример воспроизведения на Python. Перед запуском установите requests и настройте ACEDATACLOUD_API_KEY в собственной среде выполнения. Не записывайте ключ в репозиторий кода или фронтенд браузера. В реальном случае вызов выполнялся через инструмент MCP; приведённый ниже код демонстрирует соответствующий HTTP-способ подключения и не утверждает, что этот скрипт был протестирован в среде читателя.
import json
import os
import requests
URL = "https://api.acedata.cloud/openai/chat/completions"
# 本案例已核对的输入快照。
# 实际项目应维护版本化卡牌资料,不要依赖模型猜测费用。
cards = [
{"name": "巨人", "elixir": 5, "role": "只攻击建筑的高血量前排"},
{"name": "迷你皮卡", "elixir": 4, "role": "地面单体高伤"},
{"name": "火枪手", "elixir": 4, "role": "远程对地对空"},
{"name": "炸弹兵", "elixir": 2, "role": "地面范围伤害"},
{"name": "亡灵", "elixir": 3, "role": "空中部队,可对地对空"},
{"name": "加农炮", "elixir": 3, "role": "仅对地的防守建筑"},
{"name": "万箭齐发", "elixir": 3, "role": "清理脆皮群"},
{"name": "火球", "elixir": 4, "role": "范围伤害与补伤害"},
]
task = """
请复核输入卡组,返回有效的 json 对象。
输出字段:
deck(每项包含 name、elixir、role)、
total_elixir、average_elixir、advantages、
attack_steps、defense_cases、limitations、validation_note。
默认卡等接近、普通公主塔、普通形态,无进化无英雄。
这是已有卡组复核,不是全卡池最优搜索。
没有实时对战数据,不得编造胜率、无伤承诺或精确伤害。
"""
response = requests.post(
URL,
headers={
"Authorization": f"Bearer {os.environ['ACEDATACLOUD_API_KEY']}",
"Content-Type": "application/json",
},
json={
"model": "gpt-6-astra",
"messages": [
{
"role": "system",
"content": (
"Return a valid json object. "
"你是严谨的游戏教学助手,只基于给定事实分析。"
),
},
{
"role": "user",
"content": task + "\n输入卡组:\n"
+ json.dumps(cards, ensure_ascii=False),
},
],
"response_format": {"type": "json_object"},
"max_tokens": 2200,
},
timeout=(10, 180),
)
response.raise_for_status()
body = response.json()
if body.get("error"):
raise RuntimeError(body["error"])
choice = body["choices"][0]
if choice.get("finish_reason") != "stop":
raise RuntimeError("输出未正常结束,请检查返回状态或调整输出预算")
content = choice["message"].get("content")
if not content:
raise RuntimeError("没有获得可解析的分析内容")
result = json.loads(content)
print(json.dumps(result, ensure_ascii=False, indent=2))
¶ Одна деталь интерфейса, встретившаяся на практике
В этом вызове первый запрос в режиме JSON был отклонён сервером: сообщение об ошибке требовало, чтобы входные сообщения содержали json. После явного добавления английской инструкции Return a valid json object. в сообщение запрос был успешным.
Здесь не нужно делать вывод, что сбой обязательно был вызван регистром букв или другими факторами. Более надёжный подход в инженерной практике таков: явно требовать вывод JSON, одновременно задавать формат ответа, проверять статус завершения, а после разбора продолжать проверку полей и числовых значений.
Возможность разобрать результат как JSON означает лишь синтаксическую корректность, но не гарантирует правильность игрового анализа.
¶ V. Итоговая колода: контратака через оборону с Гигантом за 3,5 эликсира
Текущий вариант приведён ниже. Стоимость взята из соответствующих данных карт, а роли и взаимодействия используются для объяснения дизайна этой колоды.
| Карта | Эликсир | Основная роль | Примечания по использованию |
|---|---|---|---|
| Гигант | 5 | Принятие урона, продвижение, атака зданий | Не отвечает за устранение вражеских войск |
| Мини П.Е.К.К.А | 4 | Устранение наземных целей с высоким здоровьем | Легко окружается мелкими юнитами или отвлекается |
| Мушкетёр | 4 | Дальний урон, основная защита от воздуха | Нуждается в защите, не ставьте вплотную к другим юнитам задней линии |
| Бомбёр | 2 | Очистка наземных групп | Не может атаковать воздух |
| Миньоны | 3 | Вторая защита от воздуха, дополнительный урон | Уязвимы к Стрелам и урону по области |
| Пушка | 3 | Оттягивание в центре, вспомогательная оборона | Не может атаковать воздушные юниты |
| Стрелы | 3 | Очистка групп слабых юнитов | Следует применять против фактических целей |
| Огненный шар | 4 | Поражение сгруппированного тыла, добивание уроном | Не предполагается, что он по умолчанию мгновенно уничтожает Мушкетёра того же уровня |
Ценность этой колоды заключается не в редкости отдельных карт, а во взаимодополняемости ролей: Гигант создаёт основное давление на башню, Мини П.Е.К.К.А устраняет наземные угрозы, Бомбёр зачищает мелких юнитов, мешающих одиночному урону, Мушкетёр и Миньоны обеспечивают две постоянные точки защиты от воздуха, Пушка выигрывает время для нанесения урона, а два заклинания отвечают за расчистку и дополнительный урон.
¶ Проверка стоимости с помощью кода
Не следует полагаться только на average_elixir, возвращённый моделью. Более надёжный подход: пересчитать значение на основе уже проверенных входных данных и выполнить перекрёстную проверку с выводом модели.
Добавьте следующий код после предыдущего примера:
trusted_costs = {card["name"]: card["elixir"] for card in cards}
deck = result["deck"]
names = [card["name"] for card in deck]
if len(names) != 8 or len(set(names)) != 8:
raise ValueError("卡组必须恰好包含8张不同卡牌")
if set(names) != set(trusted_costs):
raise ValueError("模型更改了本次要求复核的卡组")
for card in deck:
if card["elixir"] != trusted_costs[card["name"]]:
raise ValueError(f"费用不一致:{card['name']}")
total = sum(trusted_costs[name] for name in names)
average = total / len(names)
if result["total_elixir"] != total:
raise ValueError("模型返回的总费用不一致")
if abs(float(result["average_elixir"]) - average) > 1e-9:
raise ValueError("模型返回的平均费用不一致")
print(f"总费用:{total},平均费用:{average}")
Результат независимой проверки стоимости в этом примере:
Общая стоимость: 5 + 4 + 4 + 2 + 3 + 3 + 3 + 4 = 28
Средняя стоимость: 28 ÷ 8 = 3.5
Также можно продолжить проверку распространённых комбинаций:
| Комбинация | Общая стоимость | Назначение |
|---|---|---|
| Гигант+Бомбёр | 7 | Лёгкое наступление против наземных мелких войск |
| Гигант+Мушкетёр | 9 | Обычное наступление с возможностью атаки по воздуху |
| Мини П.Е.К.К.А+Бомбёр | 6 | Отдельная борьба с танками и наземными мелкими войсками |
| Пушка+Мушкетёр | 7 | Оттягивание и дальний урон |
| Гигант+Мушкетёр+Бомбёр | 11 | Постепенное формирование полного наступления за счёт выживших войск или восстановления эликсира |
Последний пункт особенно заслуживает внимания: комбинацию стоимостью 11 эликсира нельзя немедленно полностью развернуть, имея лишь 10 единиц эликсира. Её лучше формировать из выжившего после защиты Мушкетёра или Бомбёра вместе с заново развернутым Гигантом, а не выкладывать три карты за один раз. Стоимость комбинации — это лишь цена вложения и не доказывает, что она позволяет стабильно получать преимущество по эликсиру.
¶ VI. Превращение анализа в выполнимый план атаки и защиты
¶ Атака: сначала удержаться, затем превратить выжившие войска в давление
Основная линия этой колоды — не выставлять Гиганта в начале игры, а:
- Использовать Пушку или войска для отражения атаки противника.
- Наблюдать за здоровьем, позицией выживших юнитов и текущим количеством эликсира.
- При подходящих условиях выставить Гиганта перед выжившими войсками.
- Увидев ответные карты противника, решить, добавлять ли войска или использовать заклинание.
- Сохранить возможность отражать атаку по другой линии.
Например, Мушкетёр всё ещё остаётся в живых после защиты; выставьте Гиганта перед ней до того, как она перейдёт мост, чтобы Гигант сначала принимал урон, а Мушкетёр продолжала атаковать. Здесь выгода в ресурсах возникает из-за того, что один уже оплаченный юнит одновременно участвует в защите и контратаке, а не из-за получения бесплатного Мушкетёра из ниоткуда.
¶ Защита: выбирать компоненты по угрозе
| Угроза противника | Приоритетный подход |
|---|---|
| Юниты, атакующие здания, такие как Всадник на кабане | Вовремя использовать Пушку в центре для оттягивания, в зависимости от поддержки добавлять карты |
| Наземная цель с большим запасом здоровья | Мини П.Е.К.К.А вместе с уроном башни, при необходимости сначала изменить путь с помощью здания |
| Группа наземных мелких войск | Использовать Бомбёра или при подходящем моменте Выпустить стрелы |
| Воздушная атака | Размещать Мушкетёра и Миньонов раздельно, избегая одновременного уничтожения уроном по области |
| Сгруппированная поддержка на задней линии | Нанести дополнительный урон Огненным шаром, затем передать дело войскам |
Все эти решения зависят от позиции, уровней, момента и поддержки противника, и их нельзя понимать как фиксированную формулу защиты без потерь. Хотя Пушка может притягивать воздушные юниты, атакующие только здания, сама она не может атаковать воздух.
¶ Обязательное описание слабостей
Подходящий стратегический вывод AI должен чётко сообщать игроку, когда играть будет трудно:
- После устранения Мушкетёра и Миньонов давление с воздуха заметно возрастёт.
- В этой колоде нет заклинаний сброса, поэтому против защиты типа Инферно нельзя бездумно накапливать войска.
- После вложения в Гиганта другая линия может стать целью для давления противника.
- Стоимость 3.5 не означает предельную скорость цикла: когда ключевые защитные карты использованы поочерёдно, они могут не успеть вернуться в руку.
Поэтому модель предоставляет лишь отправную точку для практики; в дальнейшем всё равно следует корректировать её с учётом уровней своих карт, часто встречающихся противников и записей боёв.
¶ VII. Превращение тактического плана в обучающий постер 4K
Текст подходит для объяснения причин, а изображения лучше подходят для демонстрации взаимного расположения и порядка розыгрыша карт. В этом случае не использовался способ механического размещения восьми больших карточек; вместо этого изображение было разработано как три связанных учебных этапа:
Защита с низкими затратами → Гигант впереди, выжившие войска следуют за ним → Увидеть ответные карты, добавить поддержку.
Ниже представлен обучающий постер, созданный в этот раз Image 2.0. После проверки размер файла изображения составляет 3840×2160, 16:9.

Рисунок: созданная AI тактическая обучающая схема, а не скриншот реального игрового боя и не предназначена для отображения точной дальности или позиционирования по клеткам.
¶ В промпте нужно описывать «учебные связи», а не только «визуальный стиль»
«4K, богатая детализация, кинематографичность» могут описать лишь визуальное направление, но не гарантируют, что результат будет иметь учебную ценность. Поэтому промпт должен одновременно включать:
- Отношения персонажей: гигант впереди, мушкетёр и бомбёр позади.
- Связь этапов: защита слева, контратака справа, соединены стрелками.
- Ограничения механики: гигант атакует только здания; пушка и бомбёр не могут атаковать воздушные цели.
- Иерархия информации: заголовок, обучение в три шага, список колоды, стоимость, примечания.
- Пояснение границ: обучение для обычного режима, эффект зависит от уровня карт и управления.
Ниже приведён сокращённый промпт, подходящий для воспроизведения идеи, а не дословная запись исходного длинного промпта:
制作一张16:9横版、3840×2160的中文战术教学海报。
主题:皇室战争“3.5费巨人防守反击”。
画面不是卡牌网格,而是生动的3D卡通竞技场教学场景。
左侧:加农炮中场拉扯,迷你皮卡处理地面肉盾,
火枪手对空,炸弹兵清理地面小兵。
右侧:巨人在最前方向敌方建筑推进,
防守存活的火枪手和炸弹兵在后方分散跟进,
亡灵提供空中支援。
用清晰箭头表达:
低费防守 → 补巨人反击 → 看清解牌再补支援。
底部展示八张卡及费用:
巨人5、迷你皮卡4、火枪手4、炸弹兵2、
亡灵3、加农炮3、万箭齐发3、火球4。
标注:
平均圣水3.5;
巨人+炸弹兵=7费;
巨人+火枪手=9费。
提醒:
保留防守圣水、后排分散站位、先看解牌再交法术。
确保中文清晰、战术指向准确。
不要画巨人攻击部队,不要画加农炮或炸弹兵攻击空中。
¶ Конфигурация интерфейса изображений
Документация интерфейса генерации изображений поддерживает указание размеров в пикселях через size; спецификация 4K для 16:9 — 3840x2160; простое указание «4K» в промпте не может заменить параметр размера.
Ключевая конфигурация тела запроса выглядит следующим образом, где prompt следует заменить полным описанием плаката:
{
"model": "gpt-image-2",
"prompt": "此处填写完整的战术教学海报提示词",
"size": "3840x2160",
"quality": "high",
"n": 1,
"output_format": "png",
"response_format": "url"
}
Соответствующий интерфейс:
POST https://api.acedata.cloud/openai/images/generations
¶ Сбои и переключение в ходе фактической генерации
В этот раз изначально использовался Image 2.5, но задача завершилась с явной ошибкой вышестоящего сервиса и не выдала изображение. Затем, после подтверждения переключения, был использован gpt-image-2 с сохранением спецификаций 4K и 16:9, и в итоге генерация прошла успешно.
Здесь действует важный инженерный принцип:
Пока задача выполняется, запрашивайте статус той же задачи; после явного сбоя задачи уже решайте, повторять ли попытку или переключать модель.
Использованный в этот раз инструмент изображений MCP выполняется в виде асинхронной задачи: после отправки получается ID задачи, затем выполняются запросы до успеха или сбоя. При прямом вызове HTTP-интерфейса следует обрабатывать синхронный ответ или асинхронный обратный вызов согласно соответствующей документации и не смешивать структуры ответов разных способов вызова.
¶ VIII. Как далее превратить это в инструмент для устойчивых итераций?
Если расширить этот пример до настоящего помощника по колодам, можно добавить три уровня возможностей.
¶ 1. Версионированные данные
Записывайте названия карт, стоимость, цели атаки, уровни и время обновления данных. Для данных, которые легко меняются, таких как урон, здоровье и дальность, используйте материалы с источниками, а не полагайтесь на память модели.
¶ 2. Ограничения коллекции карт пользователя
Используйте разблокированные пользователем карты и их уровни как входные данные. При большой разнице уровней теоретически разумная комбинация не обязательно будет лучше на практике.
¶ 3. Обратная связь по матчам
Постоянно записывайте основные способы атаки соперника, на каком этапе вы потеряли преимущество по эликсиру, были ли ключевые карты против воздуха использованы несогласованно, а также связана ли проблема со структурой колоды или с расстановкой и таймингами.
Затем пусть модель на основе этих записей предлагает корректировки, где за один раз меняются только одна-две переменные, а не заменяется вся колода после каждого проигранного матча.
Плакат также должен проходить независимую приёмку: проверяйте, все ли восемь карт присутствуют, верен ли китайский текст, согласованы ли стоимости, указывают ли стрелки на правильные цели. Успешная генерация не означает, что контент прошёл приёмку, а правильное разрешение не означает, что тактическая схема полностью точна.
¶ Заключение
Этот пример демонстрирует не «как ИИ автоматически вычисляет сильнейшую колоду», а более надёжный метод использования:
ограничивать задачу с помощью условий, использовать GPT-6 Astra для объяснения сочетаний, проверять числа кодом, показывать тактику через Image 2.0, а затем корректировать план по обратной связи из реальных матчей.
Основную идею итоговой колоды с гигантом можно свести к одной фразе:
Пушка отвлекает, мини-П.Е.К.К.А. разбирается с танками, мушкетёр бьёт по воздуху, бомбёр зачищает группы; после успешной защиты выпускайте гиганта впереди.
По сравнению с простым получением названий восьми карт, ценность этого подхода состоит в том, что игрок не только знает, «что брать», но и понимает, «почему брать именно это и когда следует так играть».
¶ Справочные материалы
- Руководство по интеграции Chat Completions API
- Документация по параметрам Chat Completions API
- Руководство по интеграции генерации изображений GPT Image
- Документация по параметрам API генерации изображений
- Сведения о стоимости карт см. по ссылкам на данные каждой карты в таблице колоды; фактические боевые значения и доступные функции определяются текущей информацией в игре.
Эта статья представляет собой пример практики стратегий и разработки с помощью ИИ, а не официальное руководство Supercell. Обложка и обучающий плакат являются демонстрационными изображениями, сгенерированными ИИ; персонажи и товарные знаки, связанные с «Clash Royale», принадлежат соответствующим правообладателям.

