TIL

TIL 240825 (로그라이크 기능 추가 2)

j-coder 2024. 8. 25. 03:29

1. 단순 행동 패턴 4가지 구현 (공격, 연속 공격, 방어, 도망) + 확률 로직 추가

저번에 추가 했던 단순 행동 패턴 2가지(공격, 방어)를 4가지(공격, 연속 공격, 방어, 도망)로 늘려서 선택했을 때
실행이 될지 안될지 확률 로직을 추가해 보았다.

// 배틀 비동기 함수

const battle = async (stage, player, monster) => {

  let logs = [];


  while (player.hp > 0 && monster.hp > 0) {

    console.clear();

    displayStatus(stage, player, monster);


    logs.forEach((log) => console.log(log));


    console.log(

      chalk.green(

        // 1. 단순 행동 패턴 4가지 구현 (공격, 연속공격, 방어, 도망)

        `\n1. 공격한다 2. 연속 공격(30%) 3. 방어한다(70%) 4. 도망친다(10%).`,

      ),

    );

    const choice = readlineSync.question('당신의 선택은? ');


    // 사용자의 선택에 따라 다른 행동을 수행

    switch (choice) {

      case '1':

        // 플레이어가 몬스터를 공격

        player.attack(monster);

        logs.push(chalk.green(`몬스터에게 ${player.AP}의 피해를 입혔습니다.`));

        break;


      case '2':

        // 연속 공격 시도 (30% 확률로 성공)

        if (Math.random() < 0.3) {

          player.attack(monster);

          player.attack(monster);

          logs.push(chalk.green('플레이어가 연속 공격에 성공했습니다!'));

        } else {

          console.log(chalk.red('연속 공격에 실패했습니다.'));

          logs.push(chalk.red('연속 공격에 실패했습니다.'));

        }

        break;


      case '3':

        // 방어 시도 (50% 확률로 다음 몬스터의 공격 피해 50% 감소)

        if (Math.random() < 0.5) {

          console.log(chalk.blue('방어에 성공하여 다음 공격의 피해를 절반으로 줄였습니다!'));

          player.defense = true; // 방어 성공 시 플래그 설정

          logs.push(chalk.blue('방어에 성공했습니다.'));

        } else {

          console.log(chalk.red('방어에 실패했습니다.'));

          logs.push(chalk.red('방어에 실패했습니다.'));

        }

        break;


      case '4':

        // 도망 시도 (10% 확률로 성공)

        if (Math.random() < 0.1) {

          console.log(chalk.blue('플레이어가 도망쳤습니다.'));

          logs.push(chalk.blue('플레이어가 도망쳤습니다.'));

          return; // 도망치면 전투 종료

        } else {

          console.log(chalk.red('도망에 실패했습니다.'));

          logs.push(chalk.red('도망에 실패했습니다.'));

        }

        break;


      default:

        // 잘못된 선택을 했을 때

        console.log(chalk.red('다시 선택하세요.'));

        logs.push(chalk.red('다시 선택하세요.'));

        continue; // 다시 입력을 받음

    }

 

    // 몬스터가 살아있을 때

    if (monster.hp > 0) {

      const damage = monster.attack(player); // 실제 공격한 데미지 값을 반환

      logs.push(chalk.red(`몬스터가 ${damage}의 피해를 입혔습니다.`));


      // 방어에 성공한 경우

      if (player.defense) {

        const recoveredHP = Math.floor(damage / 2);

        player.hp += recoveredHP;

        player.defense = false;


        console.log(chalk.green(`방어에 성공하여 ${recoveredHP}의 HP를 회복했습니다.`));

        logs.push(chalk.green(`방어에 성공하여 ${recoveredHP}의 HP를 회복했습니다.`));

      }

    } else {

      console.log(chalk.yellow('몬스터를 처치했습니다')); // 몬스터가 죽었을 때

      logs.push(chalk.yellow('몬스터를 처치했습니다'));

      break; // 몬스터가 죽으면 전투 종료

    }

  };


  // 전투 종료 후, 플레이어가 죽었을 경우

  if (player.hp <= 0) {

    console.log(chalk.red('플레이어가 죽었습니다. 게임 오버!'));

    process.exit(0); // 게임 종료

  }

};

 

2. 스테이지의 진행과 비례해서 몬스터의 체력과 공격력 증가 시키기

몬스터 클래스에 다음 스테이지로 넘어가면 체력과 공격력이 증가 하도록 코드를 추가해 보았다.

class Monster {

  // 5. 스테이지의 진행과 비례해서 몬스터의 체력과 공격력 증가 시키기

  constructor(stage) {

    this.hp = 100 + (stage - 1) * 10; // 초기 체력 100, 다음스테이지 : 초기 체력 + (스테이지 * 10)

    this.AP = 10 + (stage - 1) * 2; // 초기 공격력 10, 다음스테이지 : 초기 공격력 + (스테이지 * 2)

  }


  attack(player) {

    // 몬스터의 공격

    // 몬스터 공격력의 0.8배 ~ 1.2배 랜덤 적용 후
    // 플레이어에게 그 공격력 만큼 피해 적용

    const damage = Math.floor(this.AP * (0.8 + Math.random() * 0.4));

    player.hp -= damage;

    return damage;

    // console.log(chalk.red(`몬스터가 ${damage}의 피해를 입혔습니다.`));

  }

}

 

그 밖에 많은 기능들이 있는데 아직 다 구현하지 못했다. 서서히 구현해 볼 생각이다.