让 AI 推荐一套《皇室战争》卡组并不难。真正有价值的问题是:为什么选择这八张卡?它们如何互相配合?进攻和防守时应该怎样出牌?推荐结果又该如何验证?
本文以一套平均圣水消耗为 3.5 费的巨人防守反击卡组为例,介绍如何把自然语言需求转化为结构化的策略分析,再通过代码校验和图像生成,得到一份可以理解、练习和迭代的教学方案。
整个流程不是让模型随口给出“最强卡组”,而是将工作拆成四部分:
明确约束 → 分析卡组 → 校验结果 → 制作可视化教程。
¶ 一、先明确:我们希望 AI 解决什么问题?
“帮我配一套容易赢的卡组”看似明确,实际上缺少大量必要条件:玩家处于哪个竞技场?已经解锁哪些卡牌?卡牌等级是否接近?是否使用进化卡牌、英雄技能或特殊塔兵?玩家更熟悉快速轮转,还是防守反击?所谓“容易”,指操作简单,还是对特定对手优势明显?
如果这些信息没有提供,模型很容易给出一套理论上合理、实际却不适合玩家账号的阵容。因此,本案例先设置以下边界:
| 维度 | 本次约束 |
|---|---|
| 卡牌选择 | 优先基础、常见的普通与稀有卡牌 |
| 卡牌形态 | 普通形态,不依赖进化或英雄技能 |
| 塔兵条件 | 普通公主塔 |
| 等级条件 | 默认双方卡牌等级接近 |
| 操作目标 | 分工明确,适合学习 |
| 战术方向 | 防守成功后组织反击 |
| 评价边界 | 不宣称实时版本最强,不虚构胜率 |
这些约束决定了后续分析方向:我们寻找的是容易理解、职责互补的基础方案,而不是一套未经实战验证的“必胜公式”。
¶ 二、让 GPT-6 Astra 负责分析,让程序负责校验
本案例通过 AceDataCloud 的 Chat Completions 接口调用 GPT-6 Astra,请求中的模型标识为 gpt-6-astra。接口地址、认证方式与消息结构遵循平台接入文档;模型可用性与参数应以调用时的平台配置为准。这里使用的是平台提供的模型标识,不由此推断其他服务入口的可用性。
| 工具 | 负责的工作 | 不应承担的工作 |
|---|---|---|
| GPT-6 Astra | 解释卡牌分工、分析配合、组织攻防步骤 | 代替真实对战数据证明胜率 |
| Python | 校验卡牌数量、重复项、费用与组合成本 | 仅凭加法判断实战强弱 |
| GPT Image 2 | 将战术方案转化为教学海报 | 作为游戏机制的权威来源 |
还需要区分历史过程与复现方法:本案例的八张卡组已在前期分析中形成,随后实际调用 GPT-6 Astra 对它进行了结构化复核;并不是让 Astra 从完整卡池中搜索出全局最优解。教学海报则由 Image 2.0 生成。
这样记录过程,既便于复现,也避免把“模型参与了分析”夸大为“模型证明了最优”。
¶ 三、提示词设计:从“推荐卡组”变成“约束下的推理”
¶ 1. 开放式组牌提示词
如果从自己的卡池开始,可以使用下面的模板:
你是一名严谨的《皇室战争》教学分析助手。
目标:
从我提供的可用卡牌中,选择一套适合基础玩家的八张卡组。
条件:
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费即可立即全部部署。
- 不承诺无伤防守。
- 不提供没有来源的精确伤害或胜率。
本次实际调用得到的核心结论是:卡组分工清楚,适合练习防守反击,但对空单位需要保护,推进阶段也必须保留应对另一侧进攻的资源。这属于基于给定机制的理论分析,并不等于模拟器测试或天梯统计。
¶ 四、通过 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,只说明语法成立,不代表游戏分析正确。
¶ 五、最终卡组: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 点圣水时立即全部部署。它更适合由防守存活的火枪手或炸弹兵,配合新部署的巨人形成,而不是把三张牌一次性堆出去。组合费用只是投入成本,并不证明能稳定赚费。
¶ 六、将分析转化为能执行的攻防方案
¶ 进攻:先守住,再把残兵变成压力
这套卡组的主线不是开局就投入巨人,而是:
- 用加农炮或部队处理敌方进攻。
- 观察存活单位的血量、位置与当前费用。
- 条件合适时,在残兵前方补巨人。
- 看见对方解牌后,再决定补部队还是交法术。
- 保留处理另一条路进攻的能力。
例如,火枪手防守后仍然存活,在她过桥前部署巨人,让巨人先承受伤害,火枪手继续输出。这里的资源收益来自一张已付费单位同时参与防守和反击,而不是凭空获得了一张免费火枪手。
¶ 防守:按威胁选择组件
| 对手威胁 | 优先处理思路 |
|---|---|
| 野猪骑士等建筑目标单位 | 及时用加农炮中场拉扯,视支援情况补牌 |
| 高血量地面目标 | 迷你皮卡配合塔输出,必要时先用建筑改变路径 |
| 地面小兵群 | 炸弹兵处理,或在合适时机使用万箭齐发 |
| 空中进攻 | 火枪手与亡灵分散部署,避免同时被范围伤害清除 |
| 聚集的后排支援 | 火球补伤害,再由部队接手 |
这些方案都依赖位置、等级、时机和敌方支援,不能理解为固定的无伤公式。加农炮虽然可吸引只攻击建筑的空中单位,但自身不能对空输出。
¶ 必须保留的弱点说明
一份合格的 AI 策略输出,应该明确告诉玩家什么时候会难打:
- 火枪手和亡灵被处理后,对空压力会明显增加。
- 本套没有重置类法术,面对地狱系防守时不能盲目堆兵。
- 巨人投入后,另一条路可能成为对方施压的目标。
- 3.5 费不等于极限速转,关键防守牌交错时,未必能及时回手。
因此,模型提供的是练习起点,后续仍应结合自己的卡等、常见对手和对战记录调整。
¶ 七、把战术方案生成 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 指定像素尺寸,16:9 的 4K 规格为 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 接口时,则应按对应文档处理同步返回或异步回调,不要把不同调用方式的返回结构混用。
¶ 八、如何进一步做成可持续迭代的工具?
如果要将这个案例扩展为真正的卡组助手,可以增加三层能力。
¶ 1. 版本化资料
记录卡牌名称、费用、攻击目标、等级与资料更新时间。对于伤害、血量、射程等容易变化的数据,使用有来源的资料,而不是依赖模型记忆。
¶ 2. 用户卡池约束
把用户已解锁卡牌和等级作为输入。等级差距很大时,理论搭配合理不一定意味着实际表现更好。
¶ 3. 对战反馈
持续记录对手主要进攻手段、自己在哪个阶段失去圣水优势、关键对空牌是否交错,以及问题来自卡组结构还是摆位与时机。
再让模型根据这些记录提出一次只改一两个变量的调整建议,而不是每输一局就换整套卡组。
海报也应进行独立验收:检查八张牌是否完整、中文是否正确、费用是否一致、箭头是否指向正确目标。生成成功不等于内容验收通过,分辨率正确也不等于战术图示完全准确。
¶ 结语
这个案例展示的不是“AI 自动算出最强卡组”,而是一套更可靠的使用方法:
用约束限定任务,用 GPT-6 Astra 解释配合,用代码验证数值,用 Image 2.0 展示战术,再用实战反馈修正方案。
最终得到的巨人卡组,核心思路可以浓缩为一句话:
加农炮拉扯,迷你皮卡处理肉盾,火枪手对空,炸弹兵清群;守住以后,让巨人顶到前面。
比起只拿到八张卡的名字,这种方式更有价值的地方在于:玩家不仅知道“带什么”,也能理解“为什么这样带,以及什么时候应该这样打”。
¶ 参考资料
- Chat Completions API 集成指南
- Chat Completions API 参数文档
- GPT Image 图像生成集成指南
- 图像生成 API 参数文档
- 卡牌费用参考见卡组表中各卡牌资料链接;实战数值与可用功能以当前游戏内信息为准。
本文为 AI 辅助策略与开发实践案例,非 Supercell 官方攻略。封面与教学海报为 AI 生成示意图;《皇室战争》相关角色与商标归相应权利人所有。

