TIL 240825 (로그라이크 기능 추가 2)
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}의 피해를 입혔습니다.`));
}
}
그 밖에 많은 기능들이 있는데 아직 다 구현하지 못했다. 서서히 구현해 볼 생각이다.