내배캠 TIL

[내배캠 TIL 260106] C++ 머드게임 아이템 자동사용 로직 개발

xodn246 2026. 1. 6. 20:02

턴 기반 게임에서 자동 아이템 사용 로직 설계하기

턴 기반 전투 게임을 구현하다 보면 플레이어가 한 턴에 수행할 수 있는 행동을 어떻게 결정할 것인가가 중요한 설계 요소가 된다.
특히 체력 회복 아이템이나 버프 아이템처럼 상황에 따라 자동으로 사용되길 원하는 아이템이 있을 경우, 그 판단 로직을 어디에 두고 어떻게 구성할지 고민하게 된다.

이 글에서는 체력 조건에 따라 자동으로 아이템을 사용하고, 사용하지 못하는 경우 공격을 수행하는 구조를 어떻게 설계했는지를 정리했다.


1. 요구사항

자동 아이템 사용 로직의 요구사항은 다음과 같았다.

  • 체력이 50% 이하일 경우 체력 포션을 사용한다.
  • 체력이 80% 이하일 경우 공격력 증가 포션을 사용한다.
  • 인벤토리에 해당 아이템이 없을 경우 사용하지 않는다.
  • 한 턴에는 공격 또는 아이템 사용 중 하나만 수행한다.
  • 자동 아이템 사용 여부에 따라 메인 전투 흐름이 결정되어야 한다.

이 요구사항을 만족하면서도 코드가 복잡해지지 않도록 구조를 잡는 것이 목표였다.


2. 초기 접근 방식의 문제점

처음에는 메인 전투 로직에서 체력 조건을 직접 검사한 뒤,
각 조건에 맞는 아이템 사용 함수를 호출하는 방식으로 접근했다.

하지만 이 방식에는 몇 가지 문제가 있었다.

  • 체력 조건과 아이템 판단 로직이 메인 전투 코드에 섞였다.
  • 아이템 사용 여부에 따라 분기문이 계속 늘어났다.
  • “아이템을 사용했는지”에 대한 결과를 깔끔하게 전달하기 어려웠다.

이 구조는 기능이 늘어날수록 메인 로직이 비대해질 가능성이 컸다.


3. 책임 분리 기준

문제를 해결하기 위해 책임을 명확히 분리했다.

  • Player 클래스
    • 현재 상태(체력 비율)를 기반으로 아이템 사용 여부를 판단한다.
    • 아이템을 실제로 사용했는지를 반환한다.
  • 메인 전투 로직
    • 아이템을 사용했는지 여부만 확인한다.
    • 아이템을 사용하지 않았다면 공격을 수행한다.

이렇게 분리함으로써 전투 흐름은 단순해지고, 판단 로직은 Player 내부로 숨길 수 있었다.


4. 반환값 설계

자동 아이템 사용 함수는 void가 아닌 bool 반환으로 설계했다.

  • true : 아이템을 사용했다.
  • false : 아이템을 사용하지 않았다.

이 반환값 하나로 **“이번 턴에 이미 행동을 소모했는지”**를 명확히 표현할 수 있었다.
이 선택 덕분에 메인 전투 흐름이 매우 단순해졌다.


5. 자동 아이템 사용 로직

자동 아이템 사용 함수는 다음과 같이 구현했다.

bool Player::ItemAutoUse()
{
	if (inventory.empty())
		return false;

	const float hpRatio = static_cast<float>(curHealth) / maxHealth;

	if (hpRatio <= 0.5f && UseItem(ItemType::HealthPotion))
		return true;

	if (hpRatio <= 0.8f && UseItem(ItemType::AttackPotion))
		return true;

	return false;
}

체력 비율을 기준으로 우선순위를 명확히 두었고,
UseItem()이 성공했을 때만 true를 반환하도록 구성했다.

이 구조 덕분에 조건 추가나 아이템 확장도 비교적 수월해졌다.


6. 메인 턴 흐름

메인 전투 로직은 다음과 같이 매우 단순해졌다.

if (!player.ItemAutoUse()) 
{ 
	player.Attack(monster); 
}
  • 아이템을 사용했다면 해당 턴은 종료된다.
  • 아이템을 사용하지 않았다면 공격을 수행한다.

턴의 흐름이 한 눈에 들어오고, 의도가 명확해졌다.


7. 구조의 장점

이 구조의 장점은 다음과 같다.

  • 전투 흐름 코드가 간결해졌다.
  • 아이템 사용 조건이 Player 내부로 캡슐화되었다.
  • 아이템 우선순위 변경이 쉬워졌다.
  • 자동 사용 로직을 끄거나 수정하기 쉬워졌다.

특히 “한 턴에 하나의 행동만 수행한다”는 규칙이 코드 구조에 자연스럽게 녹아들었다는 점이 만족스러웠다.


8. 정리

자동 아이템 사용 로직은 단순히 조건문을 나열하는 문제가 아니라,
행동 결정의 책임을 어디에 둘 것인가에 대한 설계 문제였다.

이번 구조에서는 Player가 자신의 상태를 기반으로 행동 여부를 판단하고,
메인 전투 로직은 그 결과만 받아 처리하도록 설계했다.

그 결과 코드 가독성과 확장성이 모두 개선되었다.
작은 기능이라도 설계 방향에 따라 코드의 품질이 크게 달라진다는 점을 다시 한번 느끼게 되었다.