내일배움캠프-언리얼

[내일배움캠프 - 언리얼] DAY 25 - 텍스트 콘솔 RPG - 3

이시보 2026. 1. 2. 20:40

동일한 주소를 가르키고있는 아이템

문제: 상점에서 동일한 아이템을 여러 개 구매하고나서 해당 아이템을 사용하거나 판매시 오류 발생

원인: 아이템을 구매할 때 새로 아이템을 생성하여 주는 것이 아니라 상점에 있는 아이템의 포인터를 전달해주는 방식이었다.

해결 방안: clone 패턴으로 같은 아이템을 새로 만들어서 내보내는 방식으로 해결하였다.

Item* clone() const override{
	return new HealthPotion(*this);
}
Item* item = sellList[itemindex]->clone();

 

반복하여 사용되는 부분 함수로 변환

몬스터 배틀과 보스 배틀에서 반복되어 사용되는 구문을 함수로 만들었다.

 

랜덤으로 아이템을 사용하는 함수

void GameManager::useRandomItem(Character* player)
{
    size_t itemsize = player->getInventory().size();
    if (itemsize >= 1)
    {
        random_device rd1;   // 난수 시드
        mt19937 gen(rd1());  // Mersenne Twister 엔진
        uniform_int_distribution<> dis(1, 2);   // 1~2 균등 분포
        int useitemrandom = dis(gen);   // 난수 생성
        uniform_int_distribution<> dis2(0, int(itemsize) - 1);
        int itemindex = dis2(gen);   // 난수 생성
        if (useitemrandom == 1)
        {
            cout << " | " << player->getInventory()[itemindex]->getName() << "아이템 사용" << " | " << endl;
            if (player->getInventory()[itemindex]->getName() == "AttackBoost")
            {
                player->setisBoosted(player->getisBoosted() + 1);
            }
            player->useItem(itemindex);
        }
    }
    return;
}

 

배틀 도중 사용한 공격부스트를 초기화하는 함수

void GameManager::resetBoost(Character* player)
{
    if (player->getisBoosted() > 0)
    {
        player->setAttack(player->getAttack() - (10 * player->getisBoosted()));
        player->setisBoosted(0);
    }
    return;
}