본문 바로가기

이노베이션캠프/TIL

이노베이션 캠프 8일차_과제 전투시스템 개선


다 대 일 전투 시스템

 

오늘은 기존 과제의 전투 시스템을 수정했습니다. 기존에는 플레이어와 몬스터가 1 대 1 형태로 전투를 진행하는 방식이었습니다.

 

이번에는 전투의 다양성을 높이기 위해, 몬스터를 선택하는 monsterSelect 로직을 수정했습니다. 이제 monsterSelect는 전투 시작 시 랜덤으로 몬스터들을 생성하고, 생성된 몬스터들을 배열 형태로 반환하도록 변경했습니다.

  monsterSelect(stage) {
    const name = ['Orc', 'Goblin', 'Skeleton', 'Orge'];
    let monsters = [];

    let randomCount = parseInt(Math.random() * 4)+1;

    for (let i = 0; i < randomCount; i++) {
      let randomName = parseInt(Math.random() * 3);
      let randomInit = parseInt(Math.random() * 9) + stage;
      let monsterHp = 10 * stage + (stage - 1) + randomInit;
      let monsterDamage = 5 + (stage - 1) + randomInit + 2;
      let monsterDefence = 1 + (stage - 1) + randomInit;
      let monserAgile = stage - 1 + randomInit;

      let newMonster = new Monster(
        name[randomName],
        monsterHp,
        monsterDamage,
        monsterDefence,
        monserAgile
      );
      monsters.push(newMonster);
    }

    return monsters;
  }

 

 

그리고 플레이어가 공격하기 버튼을 누르면 공격할 몬스터를 선택 할 창이 뜨도록 displayStatus() 메서드를 추가하였습니다.

 

  // 배틀 정보창
  static displayStatus(stage, player, monsters) {
    console.log(chalk.magentaBright(`\n=== Current Status ===`));
    console.log(
      chalk.cyanBright(`| Stage: ${stage} `) +
        chalk.blueBright(
          `| 플레이어 정보 HP: ${player.hp}, DMG: ${player.damage} DFS: ${player.defence} `
        )
    );
    console.log(chalk.magentaBright(`=====================\n`));

    for (let i = 0; i < monsters.length; i++) {
      const name = `<${monsters[i].name}>`.padEnd(10);
      const hp = `HP: ${monsters[i].hp}`.padEnd(10);
      const dmg = `DMG: ${monsters[i].damage}`.padEnd(10);
      const def = `DFS: ${monsters[i].defence}`.padEnd(10);

      console.log(chalk.redBright(`${name} | ${hp} ${dmg} ${def} |`));
    }
  }

 

 

그 결과 아래와 같이 잘 출력되는 것을 확인 할 수 있었습니다.

 


플레이어 업그레이드 시스템 수정

처음에는 플레이어가 스테이지를 클리어할 때마다 자동으로 레벨업하여 전체 스탯이 상승하는 방식으로 구현했었습니다.


하지만 이렇게 하니 플레이할 때 뱀서라이크와 같은 로그라이크 특유의 선택과 성장의 재미가 잘 느껴지지 않았습니다.

 

그래서 방식을 바꿔, 스테이지를 클리어할 때마다 여러 스탯 중 하나를 직접 선택해 업그레이드하도록 수정했습니다.


또한, 단순히 고정된 수치가 오르는 것이 아니라 스테이지가 올라갈수록 업그레이드되는 스탯 수치가 점점 커지도록, 매번 업그레이드 시 랜덤한 상승 값을 부여하는 방식으로 개선했습니다

.

    let randomhp = parseInt(Math.random() * 50) + stage;
    let randomDamage = parseInt(Math.random() * 9) + stage;
    let randomDefence = parseInt(Math.random() * 9) + stage;
    let randomAgility = parseInt(Math.random() * 9) + stage;

 

그리고 스테이지를 클리어하고 나오는 화면을 다음과 같이 구현하였습니다.

 

 

이번 수정으로 전투가 단순한 1:1 구조에서 벗어나 다양한 몬스터 조합을 상대할 수 있게 되어, 게임 플레이가 훨씬 다채로워졌습니다.


앞으로는 몬스터 배치나 난이도 조절 같은 부분도 함께 고민하면서 전투 시스템을 더욱 확장해 나가야겠습니다.