오늘은 "연속 공격", "방어 + 반격(일정 확률로 발동)", "능력치 상승"을 만들어 봤다.
연속 공격 같은 경우
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에서 기능을 더 효율적으로 생성하고,
유지 보수할 수 있게 만드는 방식이었다.
팀원 분의 코드 리뷰를 바탕으로
앞으로는 좁은 시아로 목표 달성만을
위해 바로 기능을 구현하는 것이 아닌
넓은 시아를 가져 필요한 라이브러리를 먼저 만드는
개발자가 되고 싶다.
'Challenge' 카테고리의 다른 글
3-1 Challenge 두산이 안타를 몇 개 쳐야 이기는가? (0) | 2024.08.26 |
---|---|
CMD 게임 만들기 3Days (0) | 2024.08.23 |
CMD 게임 만들기 1Days (0) | 2024.08.21 |
2-5 Challenge 유효한 괄호 (0) | 2024.08.20 |
2-4 Challenge 두 수 선택 합 존재? (0) | 2024.08.20 |