어제에 이어서, 과제를 계속 진행했다.
사실상, 목표로 했던 부분은 다 완성을 했다고 볼 수 있다 !
시작 화면은 어제와 같지만 !
1. 등산 시작을 통해 첫 스테이지로 진입 할 수 있다.
보이는 기능들은 전부 구현이 된 상태이다.
1. 등반하기 (평타) 를 통해, 스테이지를 클리어한 모습
스테이지를 클리어 할 시, 랜덤보상이 3개 주어진다 !
// 랜덤 뽑기 보상 ~~ !
function RandomReward(player, monster, stage) {
// Math.random()*100 // 80이상~ 60이상~ 40이상~ 20이상~ 0이상~
let Reward = Math.random()*100+1
// 일부 보상에 0.8 ~ 2.0 배율 적용
let RewardMulty = ((Math.random()*1.2)+0.8).toFixed(1);
// 보상 종류 1 : 회복
if ( Reward >= 80) {
let playerHpRestoration = Math.floor(RewardMulty*(stage*12+70))
player.hp += playerHpRestoration
console.log(chalk.yellowBright(`산바람이 시원하다. 체력이 [${playerHpRestoration}] 회복되었다 !`));
//보상 종류 2 : 공격력
} else if ( Reward >= 60) {
let playerPowerInc = Math.floor(RewardMulty*(stage*2+5))
player.power += playerPowerInc
console.log(chalk.yellowBright(`근육이 늘었다. 등산력이 [${playerPowerInc}] 증가했다 !`));
//보상 종류 3 : 공격 배율
} else if ( Reward >= 40) {
let playerPowerMulty = Math.floor(RewardMulty*(stage*2+7))
player.powerMore += playerPowerMulty
console.log(chalk.yellowBright(`산에 버려진 무공비법을 찾았다. 최대배율이 [${playerPowerMulty}] 증가했다 !`));
//보상 종류 4 : 필살 충전
} else if ( Reward >= 20) {
if( player.specialMovePoint < 3) {
player.specialMovePoint++
console.log(chalk.yellowBright(`필살 ! 암벽등반 ! 충전이 1회 증가했다 ! 현재 충전[${player.specialMovePoint}]`));
} else { console.log(chalk.yellowBright(`필살 ! 암벽등반 충전 ! 하지만, 이미 최대 충전 상태다... `)); }
//보상 종류 5 : 꽝으로 마무리?-> 축지법 성공률로 대체했다.
} else {
player.skillChance += Math.floor(4*RewardMulty)
console.log(chalk.yellowBright(`보법이 달라졌다. 축지법 성공률이 ${Math.floor(4*RewardMulty)}% 증가했다 !`));
}
};
랜덤 뽑기 함수가 현재 구현한 함수중에 길이가 가장 길다...
심지어 호출부, 인터페이스 부분은 따로있음
2. 축지법 스킬은 기본 20%확률 밖에 안되기 때문에
보상을 통해 확률이 늘어난게 아니라면 개 손해인 선택지이다.
1. 오늘의 첫번째 문제 발생
전투 진행상황을 알려주는 초록색 로그 부분이 길어지면, 상태창이 밀려 올라가게 된다.
현재 상태를 알기가 어렵게 되고,
스크롤을 올려서 위를 보면
뭔가 의도되지 않는 로그가 보이는 등, 문제가 발생한다.
콘솔창을 최대로 키운상태로 진행하면 덜 할 수 있지만, 밀려올라가는건 마찬가지 !
해결 방법
로그를 출력하는 battle 함수에서
로그 출력 전 while 문을 달아서 로그가 너무 많을 경우,
0번 index 를 날려버리는 shift() 메서드를 반복하게 했다.
로그가 일정량 쌓이면, 먼저 들어갔던 로그부터 제거된다.
해결!
2. 두번째 문제 !
이건 간단한 문제로 빠르게 해결했다.
오늘의 목표였던
충전식 필살 스킬 !
충전을 모아서 사용해야 하는데, 이 충전 변수를 어디어 두어야 할지 모르겠다.
함수 안에서 선언하면 어느 함수에서? 호출도 힘들텐데?
전역에 둘까..
전역에 두자니, 허허 벌판에서 혼자 떨고있는 변수가 안쓰럽기도 하고
"코딩 그렇게 하는거 아닌데" 하는 목소리가 계속 들려온다.
생각보다 답은 간단했다.
어차피 여기저기 불려다녀야하는 player의 형성자에 넣어주면 되는것이었다.
위에서 본 랜덤보상에서 해당 포인트를 얻을 수 있고,
3포인트를 모아서 사용하면
잘 작동하는 모습이다..
사실 이 장면에 오늘의 가장 큰 문제가 된 사항이 포함되어있다.
그건 바로..
3. 필살 이후 나오는 문구에 딜레이를 줘 볼까?
5~10회나 공격하는 기술인데, 텍스트가 한번에 출력되는 것보다
두두두두두두 하고 딜레이에 맞춰서 드드등장하면?
완전 개 간지 !
당장 해보자.
강의 시간에 배운 setTimeout 이라던가.. async promise await ?? 같은걸 쓰면
간단한 문제라고 생각했다...
시간이 이렇게 되기 전까지는 !
그런 생각으로인해, TIL을 이 시간에 작성하게 되었다
setTimeout 을 아무리 써봐도,
promise ...await 를 이쁘게 넣어봐도
코드가 작동이 되지 않는다.
error 가 발생하는것도 아니고, 해당 함수에서 delay 부분 코드만 실행이 안되고 넘어가버린다.
이건 분명 기다려주지 않는것이다... !!!
기다려준다고 promise 했자나요!!
이번에도 답은 간단했다.......
해당 함수에 async 달고~ setTimeout 세팅해준다고 끝나는 것이 아니라,
해당 함수를 호출하는 친구또한 await를 달아줘야 한다.
즉, 필살기 끝나기 전까지 비-동기 진행하지마 ! 를 입구부터 걸어놓고 와야한다.
playerSpecialMove 내부 코드도 동기 처리가 되어야겠지만,
playerSpecialMove 밖에서는 안에서 동기처리가 되든말든 알 바가 아니기 때문에, 진행해버리기 때문이다.
허무해 !! 내 시간 !!
잘 작동한다 !
'내일배움캠프' 카테고리의 다른 글
[내일배움캠프] 24.08.27 TIL (1) | 2024.08.27 |
---|---|
[내일배움캠프] 24.08.23 TIL (0) | 2024.08.23 |
[내일배움캠프] 24.08.21 TIL (0) | 2024.08.21 |
[내일배움캠프] 24.08.20 TIL (0) | 2024.08.20 |
[내일배움캠프] 24.08.19 TIL (0) | 2024.08.19 |