让 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 点圣水时立即全部部署。它更适合由防守存活的火枪手或炸弹兵,配合新部署的巨人形成,而不是把三张牌一次性堆出去。组合费用只是投入成本,并不证明能稳定赚费。

六、将分析转化为能执行的攻防方案

进攻:先守住,再把残兵变成压力

这套卡组的主线不是开局就投入巨人,而是:

  1. 用加农炮或部队处理敌方进攻。
  2. 观察存活单位的血量、位置与当前费用。
  3. 条件合适时,在残兵前方补巨人。
  4. 看见对方解牌后,再决定补部队还是交法术。
  5. 保留处理另一条路进攻的能力。

例如,火枪手防守后仍然存活,在她过桥前部署巨人,让巨人先承受伤害,火枪手继续输出。这里的资源收益来自一张已付费单位同时参与防守和反击,而不是凭空获得了一张免费火枪手。

防守:按威胁选择组件

对手威胁 优先处理思路
野猪骑士等建筑目标单位 及时用加农炮中场拉扯,视支援情况补牌
高血量地面目标 迷你皮卡配合塔输出,必要时先用建筑改变路径
地面小兵群 炸弹兵处理,或在合适时机使用万箭齐发
空中进攻 火枪手与亡灵分散部署,避免同时被范围伤害清除
聚集的后排支援 火球补伤害,再由部队接手

这些方案都依赖位置、等级、时机和敌方支援,不能理解为固定的无伤公式。加农炮虽然可吸引只攻击建筑的空中单位,但自身不能对空输出。

必须保留的弱点说明

一份合格的 AI 策略输出,应该明确告诉玩家什么时候会难打:

  • 火枪手和亡灵被处理后,对空压力会明显增加。
  • 本套没有重置类法术,面对地狱系防守时不能盲目堆兵。
  • 巨人投入后,另一条路可能成为对方施压的目标。
  • 3.5 费不等于极限速转,关键防守牌交错时,未必能及时回手。

因此,模型提供的是练习起点,后续仍应结合自己的卡等、常见对手和对战记录调整。

七、把战术方案生成 4K 教学海报

文字适合解释原因,图片则更适合展示站位关系和出牌顺序。本案例没有采用八张大卡牌机械排列的方式,而是将画面设计成三个相连的教学阶段:

低费防守 → 巨人顶前、残兵跟进 → 看清解牌、补充支援。

下图是本次由 Image 2.0 生成的教学海报。图片文件的尺寸经检查为 3840×2160,16:9。

3.5费巨人防守反击教学海报:八张基础卡牌、费用与防守反击步骤

图: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 展示战术,再用实战反馈修正方案。

最终得到的巨人卡组,核心思路可以浓缩为一句话:

加农炮拉扯,迷你皮卡处理肉盾,火枪手对空,炸弹兵清群;守住以后,让巨人顶到前面。

比起只拿到八张卡的名字,这种方式更有价值的地方在于:玩家不仅知道“带什么”,也能理解“为什么这样带,以及什么时候应该这样打”。

参考资料

本文为 AI 辅助策略与开发实践案例,非 Supercell 官方攻略。封面与教学海报为 AI 生成示意图;《皇室战争》相关角色与商标归相应权利人所有。