부트캠프

12일차 TIL

ohs020105 2024. 11. 12. 20:27

오늘은 어제에 이어 과제를 진행했다.

그래도 뭔가 아무것도 없는 거에서 하나씩 천천히 발전 해 나가지는게 보여서 되게 기분이 좋다.

우선 오늘 진행한 건 저번에 만들다가 버그(?) 같은게 좀 있어서 좀 만져봤다.

첫번째로 

몬스터에 맞아 죽으면 플레이어의 피가 0 이 아니라 -3 이런식으로 떨어지는 문제가 발생했었다.

이걸 보안 하기 위해선

// 몬스터의 hp가 0 이하로 떨어지지 않도록
  // amount : 알아보기 쉽게 지은 이름
  takeDameage(amount) {
    this.hp = Math.max(this.hp - amount, 0);
  }

처음에는 몬스터에 지어준 이 함식을 사용 해봤다. 바로 해결 할 줄 알았지만 결과는 땡.

어떤게 문제 일까 곰곰히 생각하는 와중 if문을 사용해볼까? 라는 생각이 들어 곧바로 실행 해 봤다.

if (player.hp <= 0) {
      player.hp = 0; // 플레이어의 체력을 0으로 고정
      console.log(
        chalk.red(`당신의 몸은 더이상 싸울 수 있는 몸이 아닙니다...
        게임 오버!`),
      );
      return 'gameOver';
    }

두 번째로 만든게 요놈이다.

우선 생각한대로 작동은 잘 된다! 하지만 또 다른 문제가 있다.

몬스터에 맞아서 죽으면 작동은 잘 되지만... 다른 요소로 죽으면 작동이 안된다는 것 이다.

왜일까 곰곰히 생각해보고 막 diehp 이런 변수에 class 를 만들어 주고 아주 난리를 쳤다.

그런데도 안되길래 차라리 쉽게 생각해보는 게 좋을 것 같아서 저걸 하나하나 다 각 변수마다 옮겨주었다.

if (choice === '3') {
      // 도망치기 선택지.
      // 다음 스테이지로 이동
      // 하지만 도망가면 대미지를 입는 형식
      let escapeDamage = 50; // 도망칠때 입는 데미지
      player.hp -= escapeDamage; // hp 감소
      if (player.hp < 0) {
        player.hp = 0; // 체력이 0 이하로 떨어지지 않도록 고정
      }
      // 도망쳤지만 도망치면서 피해 를 입었다는 걸 출력
      console.log(
        chalk.green(`플레이어는 도망쳤지만 그 과정중에 ${escapeDamage}의 피해를 입었습니다!`),
      );
      console.log(chalk.yellow(`플레이어가 도망쳤습니다!`)); // 도망쳤다는 메시지 추가
      readlineSync.question('계속할려면 엔터 렛츠고'); // 계속할건지 확인
      return; // 도망쳤으니 루프를 끝낸다.

이런식으로 적용을 해봤는데,,, 놀랍게도 잘 된다...?

애써 어렵게 해야된다..! 라고 생각하면서 진행했는데 그 생각이 무안해질 정도로 너무 잘 작동한다...ㅋㅋㅋ

이번기회로 깨달은게 있다면,, 너무 돌아가지말고 쉬운방법도 있으니 우선 쉬운방법 부터 진행한다음 점점 다른 방법을 구해 사용하는게 좋다고 느꼈다.ㅋㅋㅋ

그 다음으로는 2번째 선택지에는 아무것도 안한다 선택지가 있는데 이거에 아무것도 안하기에는 좀 그래서 회피공격 이라는 시스템을 만들어 보았다. 회피공격이란 몬스터의 공격을 일정 확률로 피하고 기본 공격력 보다 랜덤한 배수가 붙어 더 강력하게 공격할 수 있게 만들었다. 물론 회피를 못하면 공격도 못하고 몬스터에게 맞기만 한다. 나중에 스테이지를 올라가다 보면 몬스터가 점점 강해지는 걸 볼 수가 있는데 그때마다 도박을 좋아하는 성격이라면 가끔씩 사용해 적을 물리치는 것도 좋은 것 같다. 이거에 대해서는 아직 개발 단계이고 새로운 아이디어도 구성중이다. 우선 이 친구의 코드는 

 // 회피 공격하는 선택지.
      logs.push(chalk.yellow(`당신은 회피 공격을 실행했습니다!`));
      if (Math.random() < 0.4) {
        // 40% 확률
        const bonusDamage = Math.floor(player.attackPower * 1.2); // 20% 강한 데미지
        monster.takeDameage(bonusDamage);
        logs.push(
          chalk.green(`회피 성공! 회피한 다음 몬스터에게 ${bonusDamage}의 대미지를 입혔습니다!`),
        );
      } else {// flase 면 회피에 실패하여 몬스터에 공격을 허용해준다.
        logs.push(chalk.yellow(`회피에 실패하셨습니다!`));
        monster.attack(player);
        logs.push(chalk.red.bold(`몬스터가 플레이어를 공격했습니다!`));
        if (player.hp < 0) {
          player.hp = 0; // 체력이 0 이하로 떨어지지 않도록 고정
        }
      }

이 친구도 만약에 이 선택으로 인해 죽게 될 시 체력이 0밑으로 안떨어지게 고정해 놨다. 이젠 뭔가 느껴지는게 있다면 하나의 함수를 만들어 놓으면 그 다음엔 복사 붙혀넣기를 이용해 편리하게 코드를 작성 할 수있다...!

그리고 제일 큰 문제였던 캐릭터가 죽으면 게임이 클리어 되는 버그가 있었다...ㅋㅋㅋㅋㅋㅋ

이걸 알게 된 계기가 직접 게임을 플레이 해 보면서 도망치기 선택지를 선택해서 죽었는데 갑자기 게임이 클리어가 되었다는 것이다...?

얼른 바로 작업에 다시 들어갔다. 

이녀석의 문제점은 순서다.

이런식으로 gameOver 이란 변수를 지정해주지 않고 그냥 stage++ 밑에다가 "죽었습니다!" 라고 콘솔에 나오게 지정해놔서였다...ㅋㅋㅋㅋ

지금 돌이켜보면 되게 바보같다...

그래도 문제점을 알고 바로 변수를 지정해 사진처럼 작성하니 죽으면 게임이 아예 끝난다.

여기서는 다시 처음부터 게임을 이어 나가야 한다. 만약 게임을 클리어 하게 된다면

이런식으로 화면이 나오게 된다.

(참고로 게임 난이도가 좀 어려워서 난이도 조정을 진행하고 클리어했다...ㅋㅋ)

스테이지가 너무 짧아 게임이 바로 끝나고 난이도도 너무 쉬운것 같아 스테이지도 늘려놨다.

오늘은 여기까지 진행이 되었고 내일은 다시 새로운 기능들을 추가할 예정이다.

오늘 하루도 잘 지냈고

내일 하루도 잘 지낼 수 있기를!

'부트캠프' 카테고리의 다른 글

14일차 TIL  (0) 2024.11.14
13일차 TIL  (0) 2024.11.13
11일 TIL  (0) 2024.11.11
2주차 WIL  (4) 2024.11.08
10일 TIL  (0) 2024.11.08