오늘 추가한 기능
플레이어 회피율, 방어력 추가
일정확률로 몬스터의 공격 회피, 정해진 방어력만큼 몬스터의 데미지 감소(수치 조정 필요)
아이템 추가
- 스테이지 몬스터 처치하여 클리어 시 3가지 아이템중 1개 선택 가능
const item1 = new Item ("싸구려 회복 물약", "플레이어가 체력을 즉시 15 회복합니다.", (player) => {player.hp += 15;},0.3 )
const item2 = new Item ("쓸만한 체력 회복 물약", "플레이어가 체력을 즉시 30회복합니다.", function heal2(player) {player.hp += 30;},0.15 )
const item3 = new Item ("고성능 체력 회복 물약", "플레이어가 체력을 즉시 45회복합니다.", function heal3(player) {player.hp += 45;},0.1 )
const item4 = new Item ("무기 강화", "공격력을 5 증가시킵니다.", function weapon(player) {player.p_strong += 3;}, 0.2)
const item5 = new Item ("생명의 대가", "플레이어 체력을 30소모 하는 대신 공격력을 15 증가시킵니다.", function risk(player) {player.hp -= 30; player.p_strong +=15;}, 0.13)
const item6 = new Item ("재빠른 구두", "플레이어의 회피 확률이 5% 증가합니다.", function dodge(player) {player.dodge += 0.05;}, 0.07)
const item7 = new Item ("[epic] 신비한 반지", "체력 10 회복, 공격력 5 증가, 회피율이 5% 증가합니다.", function ring(player) {player.hp += 10; player.p_strong += 5; player.dodge += 0.05;}, 0.04)
총 7개 아이템 중 (추가 고려) 3개 선택 로직 구성
- 기존에는 for문을 통해 아이템 배열을 0번 부터 각자의 prob에 따라 선택되는 선착순 형태로 구성하는 것을 상상했고 적용해보았다.
다만 이를 적용했을 때 배열을 한번만 순회하기 때문에 원하는 3개의 아이템이 아닌 0~2개의 아이템이 출력되는 경우가 있어 기존에 익숙하지 않던 while문 강의, 웹 검색 자료를 다시 참고하여 코드를 다시 구성하였다.
이 과정을 통해 무한 반복이 필요할 때 while (true)를 사용하고, 반복문 탈출 조건을 잘 설정해주는 것이 중요하다는 것을 배웠다.
while (true) { // 무한 반복
const random = Math.random(); // 0~1 사이 값 출력
let randomchoice = Math.floor(Math.random() * list.length)
// 0부터 아이템리스트 길이 -1 까지, 소수정 제거 > 0~7까지의 정수 중 랜덤 출력
let selecteditem = list[randomchoice] // 랜던 출력된 정수를 아이템리스트 인덱스 숫자로 활용
if (random <= selecteditem.prob) { // 선택된 아이템의 Prob이 랜덤값보다 작아야
itemarr.push(selecteditem); // 3개 아이템 목록에 선택 = itemarr
} if (itemarr.length >= 3) { // itemarr 배열에 3개의 요소 추가 시
break; // 반복문 탈출
}
}
return itemarr; // itemarr 반환
}
if (choice === '1') { // 일반 공격 선택
player.attack(monster, logs); // 공격하기 선택 시 플레이어가 몬스터를 공격
if (monster.hp > 0) { // 공격받은 몬스터 체력이 아직 0 이상 > 몬스터가 플레이어 공격
monster.attack(player, logs);
} else { // 몬스터 hp 소진일 경우
console.log(`
| 스테이지 ${stage} 클리어! |`);
// ======== 아이템 테스트 ========
console.clear(); // 콘솔창 초기화 후
displayStatus(stage, player, monster); // 스태이터스 창 표시
let test = item.itemchoice(); // 아이템 리스트 test 변수에 할당
console.log(
chalk.green(
`\n1 : ${test[0].name} | ${test[0].explain}
\n2 : ${test[1].name} | ${test[1].explain}
\n3 : ${test[2].name} | ${test[2].explain}`
), // 1, 2, 3번에 로직에 따라 선택된 아이템 이름, 설명 표시
);
while (true) { // 무한 반복
const choice2 = readlineSync.question('\n당신의 선택은? '); // 아이템 선택 옵션
logs.push(chalk.green(`\n${choice2}번을 선택하셨습니다.`));
if (choice2 === '1') { // 아이템 1번 선택
test[0].effect(player); // 함수 효과 적용
logs.push(chalk.green(`\n${test[0].explain}`)); // 적용된 효과 표시
break; // 아이템 선택 시 탈출
} else if (choice2 === '2') {
test[1].effect(player);
logs.push(chalk.green(`\n${test[1].explain}`));
break;
} else if (choice2 === '3') {
test[2].effect(player);
logs.push(chalk.green(`\n${test[2].explain}`));
break;
} else { // 1, 2, 3 이외의 입력 시 루프 반복
console.log(chalk.red(`\n정확히 입력해주세요.`));
}
}
// ======== 아이템 테스트 ========
}
turnEnd = player.hp <= 0 || monster.hp <= 0;
}
- 추가 기능 고려
로비에 업적, 플레이 로그 확인 기능 추가
단순 부활, 턴을 고려한 아이템 등 복잡한 로직을 가진 아이템 추가
>> 데미지 로직 위치 변경 고려 필요
코드가 정상적으로 작동하는지 중간중간 console.log()를 통해 원하는 객체나 배열이 적절히 출력되고 있는지 확인하는 과정에서 코드를 정확하게 작성하는 법을 점점 배우고 있는 것 같다.
여기서 이함수를 호출하려면 이렇게, 매개변수는 이렇게 하는구나 등의 생각이 들면서 성장하고 있다는 생각이 든다
매일 아침 코드 카타와 베이직, 스탠다드 반 수업을 통해 좀더 기초를 다져가며 이번 프로젝트를 성공적으로 마쳐야 할 것 같다.
'TIL' 카테고리의 다른 글
내일배움캠프 2주차 목요일 (0) | 2024.11.14 |
---|---|
내일배움캠프 3주차 수요일 TIL (0) | 2024.11.13 |
내일배움캠프 3주차 월요일 TIL (0) | 2024.11.11 |
내일배움캠프 2주차 금요일 (1) | 2024.11.08 |
2주차 수요일 TIL (1) | 2024.11.06 |