Challenge

CMD 게임 만들기 2Days

kagan-draca 2024. 8. 22. 21:21

오늘은 "연속 공격", "방어  + 반격(일정 확률로 발동)", "능력치 상승"을 만들어 봤다.

 

연속 공격 같은 경우

  doubleAttack(turn, enemy) {
    if (this.#Gambling(this.#doubleAttackProbability)) {
      LogClass.push(chalk.yellow(`\n[${turn}] 연속 공격을 성공했습니다!!\n`));
      this.attack(turn, enemy);
      this.attack(turn, enemy);
    } else {
      LogClass.push(chalk.yellow(`\n[${turn}] 연속 공격을 실패했습니다...\n`));
    }
  }

private 메서드 Gambling 통해

확률에 성공할 경우

기존 공격을 2번 호출하는 식으로

구현했다.

 

방어는

  defense(turn, enemy) {
    if (this.#Gambling(this.#defenseProbability)) {
      if (this.#Gambling(this.revengeProbability)) {
        LogClass.push(chalk.yellow(`\n[${turn}] 방어와 반격에 성공했습니다!!\n`));
        this.attack(turn, enemy);
      } else LogClass.push(chalk.yellow(`\n[${turn}] 방어에 성공했습니다!!\n`));
      return true;
    } else {
      LogClass.push(chalk.yellow(`\n[${turn}] 방어에 실패했습니다...\n`));
      return false;
    }
  }

확률적으로 성공할 경우

 

다시 카운터를 위한 확률을 바탕으로

성공하면 몬스터에게 공격을

실패하면 방어만 하는 식으로 구현했다.

 

물론 방어에 실패한 경우에는

return false를 전달해

전달 받는 쪽에서 유저의 턴을

강제 종료할 수 있게 만들어줬다.

  #Gambling(probability) {
    return Math.floor(Math.random() * 100) < probability;
  }

 

  #Gambling(probability) {
    return Math.floor(Math.random() * 100) < probability;
  }
  Upgrade() {
    let min, max;

    do {
      min = this.#elementUpgrade(1, 5);
      max = this.#elementUpgrade(1, 5);
    } while (min + this.minDamage >= max + this.maxDamage);

    this.minDamage += min;
    this.maxDamage += max;

    LogClass.print(chalk.cyan(`최소 공격력이 ${min} 증가 했습니다!!\n`));
    LogClass.print(chalk.cyan(`최대 공격력이 ${max} 증가 했습니다!!\n`));

    // 현재 증가 범위 수치가 하드 코딩 상태라
    // 라운드를 더 늘릴 경우 최소 ~ 최대 증가 값을
    // 변경해야 합니다.
    const upgradeOptions = [
      { range: [3, 7], prop: `doubleAttackProbability`, message: '연속 공격 성공 확률이' },
      { range: [3, 10], prop: `defenseProbability`, message: '방어 성공 확률이' },
      { range: [3, 5], prop: `revengeProbability`, message: '반격 성공 확률이' },
      { range: [1, 3], prop: `runAwayProbability`, message: '도망 성공 확률이' },
    ];

    const upgradeChoice = Math.floor(Math.random() * upgradeOptions.length);
    const { range, prop, message } = upgradeOptions[upgradeChoice];
    const temp = this.#elementUpgrade(range[0], range[1]);
    this[prop] += temp;
    LogClass.print(chalk.cyan(`${message} ${temp} 증가 했습니다!!\n`));
  }
  #elementUpgrade(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
  }

Upgrade에서는

공격의 최소, 최대 범위 값을 증가시켜줬고

 

확률성 기술들을 배열로 만들어

확률성 기술이 향후 더 생길 경우

배열에 추가하면 기존 코드에서

정상 작동 될 수 있도록 만들어줬다.

 

마지막으로, 팀 내에 팀원분들과 코드 리뷰 시간을 가졌는데

 

과제 수행을 위해 먼저 라이브러리를 만들어

유지보수 및 확장성을 갖춰 나가는 모습을 보았다.

 

자세히 설명하면 라이브러리로

 

유저의 정보만을 담을 .js 파일,

몬스터의 정보만을 담을 .js파일, 

유저의 입력에 대한 반응을 만들 .js파일,

서버와의 통신을 위한 .js 파일 등

 

을 만들어

 

game.js에서 기능을 더 효율적으로 생성하고,

유지 보수할 수 있게 만드는 방식이었다.

 

팀원 분의 코드 리뷰를 바탕으로

앞으로는 좁은 시아로 목표 달성만을

위해 바로 기능을 구현하는 것이 아닌

 

넓은 시아를 가져 필요한 라이브러리를 먼저 만드는

개발자가 되고 싶다.