카테고리 없음

C++ 팀프로젝트 - 텍스트 RPG 게임 만들기(3)

이개 2026. 3. 30. 20:26
#include <iostream>

int main() {
    std::cout << "               _____   _____  _____  ______             " << std::endl;
    std::cout << "              |  __ \\ |_   _|/ ____||  ____|            " << std::endl;
    std::cout << "              | |  | |  | | | |     | |__               " << std::endl;
    std::cout << "              | |  | |  | | | |     |  __|              " << std::endl;
    std::cout << "              | |__| | _| |_| |____ | |____             " << std::endl;
    std::cout << "              |_____/ |_____|\\_____||______|            " << std::endl;
    std::cout << "                                                        " << std::endl;
    std::cout << "                                                        " << std::endl;
    std::cout << "              __          _______ _______ _    _        " << std::endl;
    std::cout << "              \\ \\        / /_   _|__   __| |  | |       " << std::endl;
    std::cout << "               \\ \\  /\\  / /  | |    | |  | |__| |       " << std::endl;
    std::cout << "                \\ \\/  \\/ /   | |    | |  |  __  |       " << std::endl;
    std::cout << "                 \\  /\\  /   _| |_   | |  | |  | |       " << std::endl;
    std::cout << "                  \\/  \\/   |_____|  |_|  |_|  |_|       " << std::endl;
    std::cout << "                                                        " << std::endl;
    std::cout << "                                                        " << std::endl;
    std::cout << "              _____  ______          _______ _    _  _  " << std::endl;
    std::cout << "             |  __ \\|  ____|   /\\   |__   __| |  | || | " << std::endl;
    std::cout << "             | |  | | |__     /  \\     | |  | |__| || | " << std::endl;
    std::cout << "             | |  | |  __|   / /\\ \\    | |  |  __  || | " << std::endl;
    std::cout << "             | |__| | |____ / ____ \\   | |  | |  | ||_| " << std::endl;
    std::cout << "             |_____/|______/_/    \\_\\  |_|  |_|  |_|(_) " << std::endl;

    return 0;
}

 

 

캐릭터에 상태이상 스턴, 출혈을 추가하였다.

 

void Character::DoActive()
{
    // 액션 실행 전 상태 체크
    auto it = std::find_if(StatusEffects.begin(), StatusEffects.end(),
        [](const StatusEffect& effect) {
            return effect.kind == StateType::STUN
                && effect.turnsRemaining > 0;
        }
    );

    if (it != StatusEffects.end()) {
        cout << "스턴에 걸려 움직일 수 없습니다." << endl;
    }
     else
     {
        CurrentAction->DoActive();
     }
}

// 할당된 액션 실행
void Character::DoAction(vector<Character*> target)
{
    if (CurrentAction != nullptr)
    {
        // 본 객체의 주소를 vector에 넣고 타겟 캐릭터에 대해 액션 실행
        std::vector<Character*> self;
        self.push_back(this);

        CurrentAction->DoAciton(self, target);
    }
}

void Character::AddStatusEffect(StatusEffect Effect)
{
    bool found = false;

    for (auto& E : StatusEffects)
    {
        if (E.kind == Effect.kind)
        {
            // 기존 효과가 있으면 turnsRemaining 증가
            E.turnsRemaining += Effect.turnsRemaining;
            found = true;
            break;
        }
    }

    if (!found)
    {
        // 없으면 새로 추가
        StatusEffects.push_back(Effect);
    }

}

// 대미지 입음
void Character::TakeDamage(int Damage)
{
    // 실드 처리
    if (Damage >= Shield) {
        Damage -= Shield;
        Shield = 0;
    }
    else {
        Shield -= Damage;
        Damage = 0;
    }

    // 대미지 적용
    cout << Name << "의 총 피해량: " << Damage << endl;
    HP = max(0, HP - Damage); // max로 0 이하 방지
}

// 체력 회복
void Character::TakeHeal(int heal)
{
    if (heal <= 0) return;

    int prevHP = HP;
    HP = std::min(HP + heal, MaxHP);

    std::cout << Name
        << " 회복: " << (HP - prevHP)
        << " (현재 HP: " << HP << "/" << MaxHP << ")\n";
}

// 실드 적용
void Character::TakeShield(int Shield_)
{
    if (Shield_ <= 0) return; // 방어

    this->Shield += Shield_;

    std::cout << Name
        << " 방어도 증가: " << Shield_
        << " (현재 방어도: " << this->Shield << ")\n";

}

// 턴 종료시 호출하는 함수
void Character::EndTurn()
{

    // 출혈 체크
    auto it = std::find_if(StatusEffects.begin(), StatusEffects.end(),
        [](const StatusEffect& effect) {
            return effect.kind == StateType::BLEED
                && effect.turnsRemaining > 0;
        }
    );

    // 출혈 중이면 피해 적용
    if (it != StatusEffects.end())
    {
        int damage = this->MaxHP / 10;

        if (damage <= 0)
            damage = 1;

        this->HP -= damage;

        cout << "출혈 피해: " << damage << endl;
    }

    // 상태 이상 남은 턴 감소
    for (auto it = StatusEffects.begin(); it != StatusEffects.end(); )
    {
        if (it->turnsRemaining > 0)
        {
            --(it->turnsRemaining);
        }

        if (it->turnsRemaining == 0)
        {
            it = StatusEffects.erase(it);
        }
        else
        {
            ++it;
        }
    }

    this->Shield = 0;
    CurrentAction = nullptr;
}

 

게임 제목은 Dice With Death!이다

 

 

스토리 쓰기