본문 바로가기
게임 개발

Text Dungeon - 세나몬 잡기 (2)

by chobbo 2024. 5. 1.

 

오늘은 스테이지 구현을 담당했다.

 

스테이지 별 난이도 설정

// 몬스터 확률
int[] percent = { 0, 50 };

Random random = new Random();

if (stageNum == 1)
{
    // 1층 -  3마리, 미니언 & 공허충
    monsterCount = 3;
}
else if (stageNum == 2)
{
    // 2층 -  3~4마리, 미니언 & 공허충 & 대포미니언
    monsterCount = random.Next(3, 5);
    percent[0] = 40;
    percent[1] = 80;
}
else if (stageNum == 3)
{
    // 3층 - 4~5마리, 공허충, 대포 미니언 나올 확률 up
    monsterCount = random.Next(4, 6);
    percent[0] = 50;
    percent[1] = 90;
}

 

- 1층, 2층, 3층 각각에 대해 난이도를 설정하였다.

- random 사용하여 몬스터 마리 수 설정

- percent는 미니언, 공허충, 대포 미니언 스폰 확률 배열이다.

 

for (int i = 0; i < monsterCount; i++)
{
    int randomMonsterNum = random.Next(0, 100);

    // percent[0] 확률로 대포미니언
    if (randomMonsterNum < percent[0])
    {
        monsters.Add(new Monster("대포미니언 ", 5, 8, 20, false));
    }
    // percent[1] - percent[0] 확률로 공허충
    else if (randomMonsterNum < percent[1])
    {
        monsters.Add(new Monster("공허충", 3, 6, 10, false));
    }
    // 100 - percent[1] - percent[0] 확률로 미니언
    else
    {
        monsters.Add(new Monster("미니언", 2, 5, 15, false));
    }
}

 

- 설정된 몬스터 마리 수 만큼 for문을 돌며 0~99 사이의 난수를 뽑는다.

- 1층에선 대포미니언이 스폰되지 않는다.

    -> percent[0] = 0, percent[1] = 50

    -> 즉 미니언과 공허충이 반반의 확률로 스폰

- 2층에선 대포미니언도 스폰될 수 있다.

    -> percent[0] = 40, percent[1] = 80

    -> 즉 미니언 20%, 공허충 40%, 대포미니언 40% 확률로 스폰되는 코드

- 3층은 공허충과 대포미니언의 스폰 확률이 올라간다. 구현은 위와 같다

 

보스 스테이지

public static void BossInit()
{
    BattleManager.monsters.Clear();
    BattleManager.monsters.Add(new Monster("세나몬", 10, 10, 100, false));
    BossStage();
}

 

- 4층이면 BossInit() 함수 실행

- BossStage() 함수에선 세나몬이 콘솔에 등장한다

public static void BossPhase()
{ 
    Console.Clear();
    Console.WriteLine("보스 턴\n");

    // 광폭화 - 한 번만 발생
    if (BattleManager.monsters[0].HP < 30)
    {
        BossBerserk(isFirst);
        isFirst = false;
    }
    BossAttack();
}

 

- 플레이어의 턴이 끝나고 보스의 턴이 되면 실행

- 보스의 Hp가 30 이하면 광폭화한다.

    -> 보스 Hp가 풀로 차고 공격력이 오른다.

public static void BossAttack()
{
    // 보스 패턴 2개
    Random random = new Random();
    int attackType = random.Next(0, 2);
    float monsterDamage = BattleManager.monsters[0].AttackDamage(BattleManager.monsters[0].AttackPower);

    Console.WriteLine($"{BattleManager.monsters[0].Name}의 공격!");
    switch(attackType)
    {
        case 0:
            // 기본 공격
            Console.WriteLine($"LV.{BattleManager.monsters[0].Level} {BattleManager.monsters[0].Name}의 펀치!\n");
            break;
        case 1:
            // 스킬 공격 데미지 1.5배
            Console.WriteLine($"LV.{BattleManager.monsters[0].Level} {BattleManager.monsters[0].Name}의 파이어볼!\n");
            monsterDamage *= 1.5f;
            break;
        default:
            break;
    }

    Console.WriteLine($"{GameManager.user.Name}을(를) 맞췄습니다. [데미지 : {monsterDamage}]\n");
    Console.WriteLine($"LV.{GameManager.user.Level} {GameManager.user.Name}");

    float nowHp = GameManager.user.HP;
    GameManager.user.TakeDamage(monsterDamage);
    Console.WriteLine($"HP {nowHp} -> {GameManager.user.HP}\n");

    if (GameManager.user.IsDead)
    {
        Console.WriteLine($"당신은 {BattleManager.monsters[0].Name}에게 패배했습니다..");
        Thread.Sleep(2000);
    }

    Console.WriteLine("0. 다음\n");
    BattleInput.EnemyPhaseInput();

    // 전투 종료 조건
    if (BattleManager.BattleEnd())
    {
        Thread.Sleep(1000);
        Village.ShowVillage();
    }
    else
    {
        //플레이어 턴 실행
        Battle.ShowBattle(false);
    }
}

 

- 지금까지 구현한 내용으로는 보스 패턴이 2개이다.

- 보스 HP가 한 번에 0이되어 광폭화가 발생하지 않는 경우나

  세부적인 보스 패턴에 대한 고민 등이 필요한 상태이다.

 

 

내일은 개인 프로젝트 때 진행했던 상점 기능, 게임 저장 기능을 추가하고

팀원들과 함께 코드 리팩토링 및 우리 팀만의 추가 기능에 대해 논의해보아야겠다!