다 대 일 전투 시스템
오늘은 기존 과제의 전투 시스템을 수정했습니다. 기존에는 플레이어와 몬스터가 1 대 1 형태로 전투를 진행하는 방식이었습니다.
이번에는 전투의 다양성을 높이기 위해, 몬스터를 선택하는 monsterSelect 로직을 수정했습니다. 이제 monsterSelect는 전투 시작 시 랜덤으로 몬스터들을 생성하고, 생성된 몬스터들을 배열 형태로 반환하도록 변경했습니다.
monsterSelect(stage) {
const name = ['Orc', 'Goblin', 'Skeleton', 'Orge'];
let monsters = [];
let randomCount = parseInt(Math.random() * 4)+1;
for (let i = 0; i < randomCount; i++) {
let randomName = parseInt(Math.random() * 3);
let randomInit = parseInt(Math.random() * 9) + stage;
let monsterHp = 10 * stage + (stage - 1) + randomInit;
let monsterDamage = 5 + (stage - 1) + randomInit + 2;
let monsterDefence = 1 + (stage - 1) + randomInit;
let monserAgile = stage - 1 + randomInit;
let newMonster = new Monster(
name[randomName],
monsterHp,
monsterDamage,
monsterDefence,
monserAgile
);
monsters.push(newMonster);
}
return monsters;
}
그리고 플레이어가 공격하기 버튼을 누르면 공격할 몬스터를 선택 할 창이 뜨도록 displayStatus() 메서드를 추가하였습니다.
// 배틀 정보창
static displayStatus(stage, player, monsters) {
console.log(chalk.magentaBright(`\n=== Current Status ===`));
console.log(
chalk.cyanBright(`| Stage: ${stage} `) +
chalk.blueBright(
`| 플레이어 정보 HP: ${player.hp}, DMG: ${player.damage} DFS: ${player.defence} `
)
);
console.log(chalk.magentaBright(`=====================\n`));
for (let i = 0; i < monsters.length; i++) {
const name = `<${monsters[i].name}>`.padEnd(10);
const hp = `HP: ${monsters[i].hp}`.padEnd(10);
const dmg = `DMG: ${monsters[i].damage}`.padEnd(10);
const def = `DFS: ${monsters[i].defence}`.padEnd(10);
console.log(chalk.redBright(`${name} | ${hp} ${dmg} ${def} |`));
}
}
그 결과 아래와 같이 잘 출력되는 것을 확인 할 수 있었습니다.
플레이어 업그레이드 시스템 수정
처음에는 플레이어가 스테이지를 클리어할 때마다 자동으로 레벨업하여 전체 스탯이 상승하는 방식으로 구현했었습니다.
하지만 이렇게 하니 플레이할 때 뱀서라이크와 같은 로그라이크 특유의 선택과 성장의 재미가 잘 느껴지지 않았습니다.
그래서 방식을 바꿔, 스테이지를 클리어할 때마다 여러 스탯 중 하나를 직접 선택해 업그레이드하도록 수정했습니다.
또한, 단순히 고정된 수치가 오르는 것이 아니라 스테이지가 올라갈수록 업그레이드되는 스탯 수치가 점점 커지도록, 매번 업그레이드 시 랜덤한 상승 값을 부여하는 방식으로 개선했습니다
.
let randomhp = parseInt(Math.random() * 50) + stage;
let randomDamage = parseInt(Math.random() * 9) + stage;
let randomDefence = parseInt(Math.random() * 9) + stage;
let randomAgility = parseInt(Math.random() * 9) + stage;
그리고 스테이지를 클리어하고 나오는 화면을 다음과 같이 구현하였습니다.
이번 수정으로 전투가 단순한 1:1 구조에서 벗어나 다양한 몬스터 조합을 상대할 수 있게 되어, 게임 플레이가 훨씬 다채로워졌습니다.
앞으로는 몬스터 배치나 난이도 조절 같은 부분도 함께 고민하면서 전투 시스템을 더욱 확장해 나가야겠습니다.
'이노베이션캠프 > TIL' 카테고리의 다른 글
이노베이션 캠프 10일차_AWS에 Node.js 서버 배포 (0) | 2025.07.17 |
---|---|
이노베이션 캠프 9일차_스킬을 구현해보자 (0) | 2025.07.16 |
이노베이션 캠프 7일차_서버 문이 안 열려요?! (0) | 2025.07.14 |
이노베이션 캠프 6일차_JSON 데이터가 정상 로드 안 되는 현상 (0) | 2025.07.12 |
이노베이션 캠프 5일차_무한 루프 로비 화면 (0) | 2025.07.11 |