AI에게 《클래시 로얄》 덱 한 세트를 추천받는 것은 어렵지 않습니다. 진정으로 가치 있는 질문은 다음과 같습니다: 왜 이 여덟 장의 카드를 선택했는가? 그것들은 어떻게 서로 협력하는가? 공격과 수비 시에는 어떻게 카드를 내야 하는가? 그리고 추천 결과는 어떻게 검증해야 하는가?
이 글은 평균 엘릭서 비용이 3.5인 자이언트 수비 반격 덱을 예로 들어, 자연어 요구 사항을 구조화된 전략 분석으로 전환하고, 다시 코드 검증과 이미지 생성을 통해 이해하고, 연습하고, 반복 개선할 수 있는 교육 방안을 얻는 방법을 소개합니다.
전체 과정은 모델이 아무렇게나 “최강 덱”을 제시하게 하는 것이 아니라, 작업을 네 부분으로 나누는 것입니다:
제약 조건 명확화 → 덱 분석 → 결과 검증 → 시각화 튜토리얼 제작.
¶ 1. 먼저 명확히 하기: AI가 어떤 문제를 해결하기를 원하는가?
“이기기 쉬운 덱 한 세트 만들어 줘”는 겉보기에는 명확하지만, 실제로는 많은 필수 조건이 빠져 있습니다: 플레이어는 어느 아레나에 있는가? 어떤 카드를 이미 해금했는가? 카드 레벨은 서로 비슷한가? 진화 카드, 영웅 능력 또는 특수 타워 유닛을 사용하는가? 플레이어는 빠른 순환에 더 익숙한가, 아니면 수비 반격에 더 익숙한가? 이른바 “쉽다”는 것은 조작이 간단하다는 뜻인가, 아니면 특정 상대에게 뚜렷한 우위가 있다는 뜻인가?
이 정보가 제공되지 않으면 모델은 이론상으로는 타당하지만 실제로는 플레이어 계정에 맞지 않는 덱을 쉽게 제시할 수 있습니다. 따라서 이 사례에서는 먼저 다음과 같은 경계를 설정합니다:
| 차원 | 이번 제약 |
|---|---|
| 카드 선택 | 기본적이고 흔한 일반 및 희귀 카드를 우선 |
| 카드 형태 | 일반 형태, 진화나 영웅 능력에 의존하지 않음 |
| 타워 유닛 조건 | 일반 프린세스 타워 |
| 레벨 조건 | 기본적으로 양측 카드 레벨이 비슷함 |
| 조작 목표 | 역할 분담이 명확하고 학습에 적합 |
| 전술 방향 | 수비 성공 후 반격을 조직 |
| 평가 경계 | 실시간 버전 최강을 주장하지 않고, 승률을 지어내지 않음 |
이러한 제약은 후속 분석 방향을 결정합니다: 우리가 찾는 것은 이해하기 쉽고 역할이 상호 보완적인 기본 방안이지, 실전으로 검증되지 않은 “필승 공식”이 아닙니다.
¶ 2. 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으로 생성했습니다.
이처럼 과정을 기록하면 재현에 편리할 뿐만 아니라, “모델이 분석에 참여했다”는 사실을 “모델이 최적임을 증명했다”로 과장하는 것도 피할 수 있습니다.
¶ 3. 프롬프트 설계: “덱 추천”을 “제약 조건 아래의 추론”으로 바꾸기
¶ 1. 개방형 덱 구성 프롬프트
자신의 카드 풀에서 시작한다면 아래 템플릿을 사용할 수 있습니다:
당신은 엄밀한 《클래시 로얄》 교육 분석 어시스턴트입니다.
목표:
내가 제공한 사용 가능한 카드 중에서, 기본 플레이어에게 적합한 여덟 장의 덱을 선택하세요.
조건:
1. 내가 이미 해금한 카드만 사용하세요.
2. 진화나 영웅 능력에 의존하지 마세요.
3. 일반 프린세스 타워와 비슷한 카드 레벨을 기본값으로 합니다.
4. 역할이 상호 보완적이고, 조작이 간단하며, 학습하기 편리한 체계를 우선하세요.
5. 주요 타워 파괴 수단, 대공, 광역 정리 및 수비 방식을 반드시 설명하세요.
입력:
- 내 아레나와 트로피 수: …
- 사용 가능한 카드 및 레벨: …
- 자주 만나는 상대: …
- 내 조작 선호도: …
출력:
- 여덟 장의 카드 및 역할
- 총 비용과 평균 비용
- 선택 이유
- 공격 및 수비 단계
- 명확한 약점과 교체 비용
승률을 지어내지 마세요.
실시간 자료가 없다면 이것이 현재 버전 최강 덱이라고 주장하지 마세요.
핵심은 프롬프트가 얼마나 긴지가 아니라, 선택 가능한 범위, 최적화 목표, 그리고 반드시 인정해야 하는 한계를 제공했는지입니다.
¶ 2. 이 사례에서 사용한 재검토 프롬프트
기존 방안을 검증하기 위해, 이번에는 작업을 더욱 엄격하게 제한했습니다. 아래는 실제 재검토 요구 사항을 정리한 버전입니다:
전체 카드 풀의 최적해를 다시 찾는 것이 아니라, 다음 덱을 재검토하세요:
자이언트5, 미니 P.E.K.K.A4, 머스킷병4, 폭탄병2,
미니언3, 대포3, 화살3, 파이어볼4.
기본값:
비슷한 카드 레벨, 일반 프린세스 타워, 일반 형태,
진화 없음, 영웅 능력 없음.
다음을 포함하는 유효한 json 객체를 반환하세요:
deck、total_elixir、average_elixir、
advantages、attack_steps、defense_cases、
limitations、validation_note。
요구 사항:
- 각 카드의 역할을 설명하세요.
- “수비 후 살아남은 유닛 활용”과 “무료로 유닛 획득”을 구분하세요.
- 11엘릭서 조합을 10엘릭서가 가득 찼을 때 즉시 모두 배치할 수 있다고 말하지 마세요.
- 무피해 수비를 약속하지 마세요.
- 출처가 없는 정확한 피해량이나 승률을 제공하지 마세요.
이번 실제 호출에서 얻은 핵심 결론은 다음과 같습니다: 덱의 역할 분담이 명확하고, 수비 후 역공을 연습하기에 적합하지만, 공중 유닛은 보호해야 하며, 전진 단계에서도 반대편 공격에 대응할 자원을 반드시 남겨 두어야 합니다. 이는 주어진 메커니즘에 기반한 이론적 분석에 속하며, 시뮬레이터 테스트나 래더 통계와 같지는 않습니다.
¶ 4. 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으로 파싱할 수 있다는 것은 문법이 성립함만을 의미하며, 게임 분석이 정확하다는 뜻은 아닙니다.
¶ 5. 최종 덱: 3.5 엘릭서 자이언트 수비 후 역공
이번 구성은 다음과 같습니다. 비용은 해당 카드 자료에서 가져왔으며, 역할과 조합은 이 덱의 설계를 설명하는 데 사용됩니다.
| 카드 | 엘릭서 | 주요 역할 | 사용 시 주의점 |
|---|---|---|---|
| 자이언트 | 5 | 피해 흡수, 전진, 건물 공격 | 적 부대를 제거하는 역할은 하지 않음 |
| 미니 P.E.K.K.A | 4 | 고체력 지상 목표 처리 | 소형 유닛에게 둘러싸이거나 유인되기 쉬움 |
| 머스킷병 | 4 | 원거리 공격, 주력 대공 | 보호가 필요하며, 다른 후방 유닛과 밀집하지 않도록 주의 |
| 폭탄병 | 2 | 지상 집단 유닛 정리 | 공중 공격 불가 |
| 미니언 | 3 | 두 번째 대공, 추가 화력 | 화살과 범위 피해에 취약 |
| 대포 | 3 | 중앙 유인, 보조 수비 | 공중 유닛을 공격할 수 없음 |
| 화살 | 3 | 체력이 낮은 집단 유닛 제거 | 실제 목표에 맞추어 사용해야 함 |
| 파이어볼 | 4 | 밀집한 후방 유닛 공격, 추가 피해 | 기본적으로 동레벨 머스킷병을 즉사시킬 수 있다고 보지 않음 |
이 덱의 가치는 개별 카드의 희귀도가 아니라 역할의 상호 보완성에 있습니다: 자이언트는 주요 타워 철거 압박을 제공하고, 미니 P.E.K.K.A는 지상 위협을 처리하며, 폭탄병은 단일 대상 공격 유닛을 방해하는 소형 유닛을 정리하고, 머스킷병과 미니언은 두 개의 지속 대공 지점을 제공하며, 대포는 화력을 낼 시간을 벌고, 두 주문은 장애물 제거와 추가 피해를 담당합니다.
¶ 코드로 비용 검증하기
모델이 반환한 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 | 대공 능력이 있는 일반적인 푸시 |
| 미니 P.E.K.K.A+폭탄병 | 6 | 각각 탱커와 지상 소형 유닛 처리 |
| 대포+머스킷병 | 7 | 유인과 원거리 딜링 |
| 자이언트+머스킷병+폭탄병 | 11 | 생존 유닛 또는 엘릭서 회복을 활용해 점진적으로 완전한 푸시 형성 |
마지막 항목은 특히 주의할 만합니다: 11엘릭서 조합은 엘릭서가 10포인트뿐일 때 즉시 모두 배치할 수 없습니다. 이는 방어 후 살아남은 머스킷병이나 폭탄병과 새로 배치한 자이언트를 조합해 만드는 데 더 적합하며, 세 장의 카드를 한 번에 쌓아 내는 방식이 아닙니다. 조합 비용은 투자 비용일 뿐이며, 안정적으로 엘릭서 이득을 볼 수 있음을 증명하지는 않습니다.
¶ 6. 분석을 실행 가능한 공방 계획으로 전환하기
¶ 공격: 먼저 막고, 남은 유닛을 압박으로 바꾸기
이 덱의 주된 흐름은 시작부터 자이언트에 투자하는 것이 아니라 다음과 같습니다:
- 대포 또는 유닛으로 적의 공격을 처리합니다.
- 살아남은 유닛의 체력, 위치 및 현재 엘릭서를 관찰합니다.
- 조건이 적절할 때 남은 유닛 앞에 자이언트를 보충합니다.
- 상대의 해제 카드를 확인한 뒤, 유닛을 보충할지 주문을 사용할지 결정합니다.
- 다른 라인의 공격을 처리할 능력을 남겨 둡니다.
예를 들어, 머스킷병이 방어 후에도 살아남았다면 그녀가 다리를 건너기 전에 자이언트를 배치하여 자이언트가 먼저 피해를 받게 하고, 머스킷병은 계속 공격하게 합니다. 여기서의 자원 이득은 이미 비용을 지불한 유닛 한 장이 방어와 반격에 동시에 참여하는 것에서 나오며, 공짜 머스킷병 한 장을 갑자기 얻는 것이 아닙니다.
¶ 방어: 위협에 따라 구성 요소 선택하기
| 상대 위협 | 우선 처리 방식 |
|---|---|
| 호그 라이더 등 건물 타깃 유닛 | 제때 대포로 중앙 유인을 하고, 지원 상황에 따라 카드를 보충 |
| 고체력 지상 타깃 | 미니 P.E.K.K.A와 타워 공격을 조합하고, 필요하면 먼저 건물로 경로 변경 |
| 지상 소형 유닛 무리 | 폭탄병으로 처리하거나, 적절한 타이밍에 화살 사용 |
| 공중 공격 | 머스킷병과 미니언을 분산 배치하여 동시에 범위 피해로 제거되는 것을 방지 |
| 밀집한 후방 지원 | 파이어볼로 피해를 보충한 뒤 유닛으로 마무리 |
이러한 계획은 모두 위치, 레벨, 타이밍 및 적의 지원에 의존하므로, 고정된 무피해 공식으로 이해해서는 안 됩니다. 대포는 건물만 공격하는 공중 유닛을 끌어올 수 있지만, 자체적으로 대공 공격을 할 수는 없습니다.
¶ 반드시 남겨야 할 약점 설명
적격한 AI 전략 출력은 언제 어려워지는지 플레이어에게 명확히 알려야 합니다:
- 머스킷병과 미니언이 처리된 후에는 대공 압박이 뚜렷하게 증가합니다.
- 이 덱에는 리셋 계열 주문이 없으므로, 인페르노 계열 방어를 상대로 무작정 유닛을 쌓아서는 안 됩니다.
- 자이언트를 투자한 후에는 다른 라인이 상대의 압박 목표가 될 수 있습니다.
- 3.5엘릭서라고 해서 극한의 빠른 순환을 의미하지는 않으며, 핵심 방어 카드가 엇갈려 사용되면 제때 다시 손에 들어오지 않을 수 있습니다.
따라서 모델이 제공하는 것은 연습의 출발점이며, 이후에는 자신의 카드 레벨, 자주 만나는 상대 및 전투 기록에 맞춰 계속 조정해야 합니다.
¶ 7. 전술 계획을 4K 교육 포스터로 만들기
텍스트는 이유를 설명하는 데 적합하고, 이미지는 배치 관계와 카드 사용 순서를 보여 주는 데 더 적합합니다. 이 사례에서는 여덟 장의 큰 카드를 기계적으로 배열하는 방식을 사용하지 않고, 화면을 서로 연결된 세 가지 교육 단계로 설계했습니다:
저비용 방어 → 자이언트가 앞에서 버티고, 남은 유닛이 뒤따름 → 해제 카드를 확인하고, 지원 보충.
아래 이미지는 이번에 Image 2.0으로 생성한 교육 포스터입니다. 이미지 파일의 크기는 검사 결과 3840×2160, 16:9입니다.

그림: AI가 생성한 전술 교육 예시이며, 게임 실전 스크린샷이 아니고 정확한 사거리와 칸별 배치를 표현하기 위한 것도 아닙니다.
¶ 프롬프트에는 “교육 관계”를 써야 하며, 단지 “화면 스타일”만 써서는 안 됩니다
“4K, 디테일 풍부, 영화 같은 느낌”은 시각적 방향만 설명할 수 있을 뿐, 생성 결과에 교육적 가치가 있음을 보장할 수는 없습니다. 따라서 프롬프트에는 다음을 함께 포함해야 합니다:
- 역할 관계: 자이언트가 앞에, 머스킷병과 폭탄병이 뒤에 있다.
- 단계 관계: 왼쪽은 수비, 오른쪽은 역공이며, 화살표로 연결한다.
- 메커니즘 제약: 자이언트는 건물만 공격한다; 대포와 폭탄병은 공중을 공격할 수 없다.
- 정보 계층: 제목, 세 단계 튜토리얼, 덱 목록, 비용, 주의 사항.
- 범위 설명: 일반 형태의 튜토리얼이며, 효과는 카드 레벨과 조작에 영향을 받는다.
아래는 아이디어를 재현하기에 적합한 간결한 프롬프트이며, 원본의 긴 프롬프트를 한 글자씩 기록한 것은 아니다:
16:9 가로형, 3840×2160의 중국어 전술 교육 포스터를 제작한다.
주제: 클래시 로얄 “3.5 엘릭서 자이언트 수비 역공”.
화면은 카드 그리드가 아니라 생동감 있는 3D 카툰 아레나 교육 장면이다.
왼쪽: 대포가 중앙에서 유인하고, 미니 P.E.K.K.A가 지상 탱커를 처리하며,
머스킷병이 대공을 맡고, 폭탄병이 지상 유닛을 정리한다.
오른쪽: 자이언트가 최전방에서 적 건물을 향해 전진하고,
수비 후 살아남은 머스킷병과 폭탄병이 뒤에서 분산되어 따라가며,
미니언이 공중 지원을 제공한다.
명확한 화살표로 표현한다:
저비용 수비 → 자이언트 추가 후 역공 → 카운터 카드를 확인한 뒤 지원 추가.
하단에 여덟 장의 카드와 비용을 표시한다:
자이언트 5, 미니 P.E.K.K.A 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 인터페이스를 직접 호출할 때는 해당 문서에 따라 동기 반환 또는 비동기 콜백을 처리해야 하며, 서로 다른 호출 방식의 반환 구조를 혼용하지 말아야 한다.
¶ 8. 어떻게 더 지속적으로 반복 개선 가능한 도구로 만들 수 있을까?
이 사례를 진정한 덱 도우미로 확장하려면 세 가지 계층의 기능을 추가할 수 있다.
¶ 1. 버전 관리 자료
카드 이름, 비용, 공격 대상, 레벨 및 자료 업데이트 시간을 기록한다. 피해량, 체력, 사거리 등 쉽게 변하는 데이터에는 모델의 기억에 의존하지 말고 출처가 있는 자료를 사용한다.
¶ 2. 사용자 카드 보유 현황 제약
사용자가 해금한 카드와 레벨을 입력으로 사용한다. 레벨 차이가 매우 클 경우, 이론적으로 조합이 합리적이라고 해서 실제 성능이 반드시 더 좋다는 의미는 아니다.
¶ 3. 대전 피드백
상대의 주요 공격 수단, 자신이 어느 단계에서 엘릭서 우위를 잃었는지, 핵심 대공 카드가 엇갈려 사용되었는지, 그리고 문제가 덱 구조에서 비롯되었는지 아니면 배치와 타이밍에서 비롯되었는지를 지속적으로 기록한다.
그다음 모델이 이러한 기록에 따라 한 번에 한두 개의 변수만 바꾸는 조정 제안을 하게 하고, 한 판 질 때마다 덱 전체를 바꾸지는 않도록 한다.
포스터 역시 별도로 검수해야 한다: 여덟 장의 카드가 모두 있는지, 중국어가 올바른지, 비용이 일치하는지, 화살표가 올바른 대상을 가리키는지 확인한다. 생성에 성공했다고 해서 콘텐츠 검수가 통과한 것은 아니며, 해상도가 올바르다고 해서 전술 도식이 완전히 정확한 것도 아니다.
¶ 맺음말
이 사례가 보여 주는 것은 “AI가 자동으로 최강 덱을 계산해 낸다”는 것이 아니라, 더 신뢰할 수 있는 사용 방법의 한 세트다:
제약으로 작업을 한정하고, GPT-6 Astra로 조합을 설명하며, 코드로 수치를 검증하고, Image 2.0으로 전술을 보여 준 뒤, 실전 피드백으로 계획을 수정한다.
최종적으로 얻은 자이언트 덱의 핵심 아이디어는 한 문장으로 압축할 수 있다:
대포로 유인하고, 미니 P.E.K.K.A로 탱커를 처리하며, 머스킷병은 대공을 맡고, 폭탄병은 무리를 정리한다; 수비한 뒤에는 자이언트를 앞에 세운다.
단지 여덟 장의 카드 이름만 얻는 것보다, 이 방식이 더 가치 있는 이유는 플레이어가 “무엇을 가져갈지”뿐 아니라 “왜 이렇게 가져가야 하는지, 그리고 언제 이렇게 플레이해야 하는지”도 이해할 수 있기 때문이다.
¶ 참고 자료
- Chat Completions API 통합 가이드
- Chat Completions API 파라미터 문서
- GPT Image 이미지 생성 통합 가이드
- 이미지 생성 API 파라미터 문서
- 카드 비용 참고는 덱 표의 각 카드 자료 링크를 참조; 실전 수치와 사용 가능한 기능은 현재 게임 내 정보를 기준으로 한다.
본 글은 AI 보조 전략 및 개발 실습 사례이며, Supercell의 공식 공략이 아니다. 표지와 교육 포스터는 AI 생성 예시 이미지이며, 《클래시 로얄》 관련 캐릭터와 상표는 해당 권리자에게 귀속된다.

