이번 과제에서 고려해야 할 사항
◆ 트러블 슈팅
좋은 트러블 슈팅 사례, 형식을 찾아보고 트러블 슈팅을 작성하고 발표해 주세요
배경 : 어떤 현상을 발견해서
발단 : 이런 장애가 생길 수 있다는 것을 인지했고,
전개 : 장애를 대응, 해결하던 와중에
위기 : 또 다른 장애 발견 또는 간단하게 해결할 수 없다는 것을 알게되어서,
절정 : 근본적인 해결을 위해 이런 방법으로 접근하였다.
결말 : 따라서, 이런이런 방법을 통해 근본적으로 해결 및 앞으로 유지, 보수에 용이하게 개선하게 되었다.
◆ 과제 필수요건 채우기
완성도 | 필수 | 필수 기능 - 단순 행동 패턴 2가지 구현 - 클래스 문법 활용, 플레이어 스탯 관리 - 간단한 전투 로직 구현 - 스테이지 진행에 따른 이벤트 관리 |
도전 | 도전 기능 - 확률 로직 적용 - 복잡한 행동 패턴 구현 - 새로운 기능 구현- 전체적인 코드 흐름 | |
이해도 | 필수 | - TIL에 트러블슈팅 과정을 기록해보세요. (과제 제출란에 TIL 링크를 제출해주세요.) |
도전 | - 디렉토리 및 파일을 분리해보세요.- 변수명 등 코드를 직관적이고 이해하기 쉽게 작성해보세요.- 주석을 활용해 코드를 설명해보세요. | |
우수성 | 필수 | - ReadMe를 작성해 과제를 소개해보세요. |
도전 | - 특수 상황에 대한 예외 처리를 2가지 이상 구현해보세요.- 커밋 컨벤션을 지킨 커밋을 10회 이상 시행해보세요. |
필수 기능 구현을 우선적으로 완성한 후, 도전 기능에도 도전하여 실력을 더욱 강화해 주시기 바랍니다. 각 기능의 구현 상태에 따라 평가가 이루어지며, 이는 팀 구성과 추후의 팀 프로젝트 성공에 큰 영향을 미칠 수 있습니다. 최선을 다해 모든 기능을 완성해 주시기 바랍니다!
필수 기능 가이드
1. 단순 행동 패턴 2가지 구현
- 공격하기
- 도망치기
2. 플레이어 클래스에서 플레이어 스탯 (공격력, 체력 등) 관리하기
3. 간단한 전투 로직 구현
- 플레이어 공격, 몬스터 피격
4. 스테이지 클리어 시 유저 체력 회복
5. 스테이지의 진행과 비례해서 몬스터의 체력과 공격력 증가 시키기
필수 기능 공통 가이드
1. switch 분기문을 사용하여 유저의 각 행동에 대한 로직을 처리해보세요.
2. while 반복문을 사용할 때는 종료 조건이 무조건 있어야 합니다.
a. 스테이지 클리어 및 게임 종료 조건
b. 몬스터와의 전투 종료 조건
3. Math.random()메서드를 통해서 랜덤한 숫자를 얻을 수 있습니다.
4. 플레이어의 공격은 선택에 의해서 이루어지지만, 몬스터의 공격은 자동으로 처리가 된 뒤 해당 플레이어의 로그에 보여지게 됩니다.
5. 함수의 호출 순서에 따라서 각 변수, 객체들을 관리하는 것이 중요합니다.
도전 기능 가이드
1. 확률 로직 적용
- 연속 공격, 방어, 도망치기
- 스테이지 클리어시 유저 능력치 증가, 증가량
- 몬스터의 공격력, 체력 증가량
2. 복잡한 행동 패턴 구현
- 연속 공격
- 방어하기
그 외 다른 행동
도전 기능 공통 가이드
1.랜덤, 확률을 사용하는 것을 어렵게 생각하지 마세요.
a. Math.random() 메서드를 응용하여 0~5 사이의 정수가 랜덤으로 생성된다고 가정할 때, 우리는 [0,1,2,3,4,5]의 6가지 랜덤한 선택지를 가질 수 있게됩니다.
b. 확률의 경우도 마찬가지로 Math.random() 메서드를 응용하여 0~99 사이의 정수를 생성한다고 할 때, 10%의 확률은 0~9사이의 숫자가 생성될 확률이랑 같습니다.
2. 새로운 기능을 추가하는 것을 망설이지 마세요!
시나리오
산책하다 도와주는 북극곰 베르노( 따뜻함과 평온함을 상징하는 라틴어에서 유래된 이름.)
빙하기가 찾아온 지구. 심심해진 북극곰 베르노는 여행을 가기로 했습니다.
ex) 길 앞에 다람쥐 들이 얼음 속에서 도토리를 꺼내려 고생하고 있네요. 도와주시겠습니까?
1. 도와준다 2. 무시한다
도와주는 목적 : 음식, 아이템 얻기
◆주요 퀘스트 : 얼음에서 물건 꺼내기
▷사람의 경우 : 높은 확률로 공격, 완료 시 라이터, 라면 등 레어탬 지급
■사람을 만났다. 도와줄까 ? 피할까?
○ 자동 랜덤 이벤트( 접근만해도 공격 / 도와주고 공격당하기 / 도와주고 얻어먹기 )
- 사람이 공격함 : 1. 싸움, 2. 도망가기
- 사람 내구력 랜덤 설정, 스테이지 올라가면 증가
a. 싸움 : 1. 일반 공격 2. 양 팔로 때리기(쿨타임 만들기) ( 데미지 랜덤) 3. 방어하기(이번텀 공격있으면 데미지0) 4. 도망가기(아래 b.로 이동)
총을 맞았다/ 칼에 맞았다/주먹에 맞았다/ 차엿다 < 랜덤 hp 깎기
이기면 아이템 획득, 포만감 up
사망 시 패배. (지는 조건 : 포만감0 or 체력0)
스테이지 5 이후로 전투 자동 결과, 연속타격(3회?) 기능 만들기
- 사람이 공격함 : 1. 싸움, 2. 도망가기, 3. 전투 자동 진행
- 사람 내구력 랜덤 설정, 스테이지 올라가면 증가
a. 싸움 : 1. 3회 연속공격(3회차 랜덤 데미지 주고받기) 2. 일반 공격 3. 양 팔로 때리기(쿨타임 만들기) ( 데미지 랜덤) 4. 방어하기(이번텀 공격있으면 데미지0) 5. 도망가기(아래 b.로 이동)
총을 맞았다/ 칼에 맞았다/주먹에 맞았다/ 차엿다 < 랜덤 hp 깎기
b. 도망가기: 스테이지넘버 유지, 이벤트 새로 생성 전에 console.log('길을 따라 걷는다')같은거 출력
▷ 동물의 경우 : 다양한 음식 득탬. 소소한 포만감, 행복지수 up
■울버린/ 아기곰/ 다람쥐 를 만났다. (1. 도와준다, 2. 무시한다)
얼음 깨는 과정에서 랜덤으로 얼음에 의한 상처 받음-> 행복or Hp 깎기
음식에 따라 포만감 설정하기
1. 도와주자
-얼음 내구도 랜덤 설정, 스테이지 올라가면 내구도 올리기
- 얼음을 부수자 (1. 부수기) - 얼음 내구도 데미지 랜덤, 20번 안에 끝내자
1. 부수기 선택 할 때마다 얼음 깨는 과정에서 랜덤으로 얼음에 의한 상처 받음-> 행복or Hp 깎기
얼음 깨기 성공 시 얼음 안의 내용물 나눠받음 (음식에 따라 포만감 설정하기)
2. 무시한다 : 스테이지넘버 유지, 이벤트 새로 생성 전에 console.log('길을 따라 걷는다')같은거 출력
◆ 사이드 퀘스트 : 잠자리 만들기/ 불 피우기 / 공복- 받은거 먹기?
▷불 피우기( 1. O , 2. X)
■ 나뭇가지 모으기
■ 라이터여부로 불 붙이는 방법 차이.
-라이터 사용해서 불 붙이기(1. O , 2. X)
가방에 라이터 없으면 손으로 비비기
▷음식 먹기
소지한 아이템 중에 고르기. 라면은 불피우기 쿼스트 건너뛰면 사용못함
불피우기 건너뛰면 다음 스테이지로 넘어가기 전에 행복 깎기
◆ 게임 결과
행복도 기준으로
80~100 : 즐겨운 여행을 마친 베르노. 행복하게 집으로 돌아갑니다.
40~80 : 괜찮은 여행이었어요. 이번엔 어디로 여행을 가볼까요?
10~40 : 힘들어요 ㅠㅠ 어서 집으로 돌아가고 싶네요
0~10 : 괜히 나왔어. 집으로 돌아갈레요.
위에 끝나면 추가하기
■ 포만감이 일정값(200?) 이상이면 소비(10:1?)해서 체력 회복(체력이 100보다 작을 때)
■ 이동, 전투, 야영 시 도트 이미로 표현하기
■ 로그인,
■ 아이템 가방 관리
■ 저장한 부분부터 시작(슬롯 5개, 플레이어 상태, 스테이지 저장)
■ 지난번 기록부터 다시 시작( 최근 플레이한 새 스테이지 로드 될 때 마다 플레이어 현재 상태 저장)
■ 죽으면 (1.저장위치에서 다시 시작 2. 마지막 스테이지에서 다시 플레이(포만감, HP 5% 증가, 스테이지 넘버는 유지,다시 랜덤 이벤트 생성) 3. 종료)
진행할 과제
https://teamsparta.notion.site/Node-7-CH-2-Rogue-like-JAVASCRIPT-12e2dc3ef5148018a89ec34ffc718b2c
트러블 슈팅
배경 : 모든 전투 상황을 battle함수에 집어넣어 만들었습니다.
발단 : 여러 오류가 발생 했지만 가독성이 나빠 수정하기도 어려웠습니다.
전개 : 비동기함수의 사용이 생소하여 기존의 battle함수에 모든 것이 들어간 상태로 진행하려 했지만
위기 : while문에서 빠져나오지 못하는 등의 문제가 발생했습니다.
절정 : 튜터님께 여쭤보러 갔습니다.
비동기 함수의 사용에 관한 설명을 들었습니다.
비동기함수 bettle()에서 플레이어가 만나는 상황의 비동기 함수를 호출하는 방식으로 코드의 구조를 수정했습니다.
결말 : 비동기 함수를 사용하니 await덕에 이벤트나 사용자의 입력이 완료될 때까지 기다리고, 다음으로 넘어가서 다른 함수가 미리 끝나버리는 오류가 사라졌습니다.
복잡한 체인 형태의 코드에서는 어디에서 오류가 난 것인지 찾기도 어려웠지만 비동기 함수로 따로 빼어내어 관리하니 가독성이 좋아져 오류난 곳을 찾고 수정하기 쉬워졌습니다.
기능을 구현하려 처음부터 달려들기 전에 코드의 흐름을 어떤 식으로 만들 것인지 생각하는 시간을 가져야 하겠습니다.
배열의 마지막 요소 가져오기 : https://hiperzstudio.tistory.com/55
console.log(arr[arr.length - 1]);
console.log(...arr.slice(-1));
console.log(arr.pop());
반복 공격에 제귀함수 사용하기(연속 공격도)
// 예시 6: 재귀 함수
// 반복하여 자기자신을 호출하는 함수
function factorial(n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1); // 여기서 자기자신을 호출함
}
const factResult = factorial(5);
console.log("예시 6: 팩토리얼 결과 - " + factResult);
코드 내에서 프로그램 종료하기 :
https://velog.io/@hannabananah/JavaScript-Node.js-%EC%A6%89%EC%8B%9C-%EC%A2%85%EB%A3%8C%ED%95%98%EA%B8%B0#:~:text=%EC%A2%85%EB%A3%8C%20%EC%BD%94%EB%93%9C%EB%A5%BC%20%EC%A7%80%EC%A0%95%ED%95%98%EC%A7%80,%EC%BD%94%EB%93%9C%EB%A5%BC%20%EC%A7%80%EC%A0%95%ED%95%98%EB%A9%B4%20%EB%90%9C%EB%8B%A4.&text=%EC%A2%85%EB%A3%8C%20%EC%BD%94%EB%93%9C%EC%9D%98%20default%EB%8A%94,%EB%90%98%EA%B1%B0%EB%82%98%200%EC%9D%B4%EB%A9%B4%20%EC%84%B1%EA%B3%B5%EC%9D%B4%EB%8B%A4.
플레이어 사망조건 추가하기
문제1. 플레이어의 사망처리가 바로 되지 않음
1~2대 더 맞고 사망시 출력되는 문구가 나옴
문제2. 사망 시 선택지 추가
1.게임 다시 시작(여행을 떠나자부터)
2.이 스테이지 그대로 battle의 랜덤 돌리기
플레이어의 생존 기준이 되는 hp와 fullnees를 증가시키기
3.게임 종료
process.exit()
Node.js 프로세스를 동기적으로 즉시 종료시키는 메서드
◆ 문제1. 플레이어의 사망처리가 바로 되지 않음
문제파악1
while (iMonster.hp >0){}
얼음 부수기 while문에 얼음의 사망 조건만 걸려 있다.
해결하기 : 플레이어의 생존 조건도 추가하기
while (iMonster.hp > 0 && player.hp > 0 && player.fullness > 0) {}
테스트 결과 : 해결됨.
◆ 문제2. 사망 시 선택지 추가
현황
1.게임 다시 시작(여행을 떠나자부터)
case '1':
startGame();
break;
잘 동작함
2.이 스테이지 그대로 battle의 랜덤 돌리기
플레이어의 생존 기준이 되는 hp와 fullnees를 증가시키기
문제파악1 : 사망 후 스테이지에서 무시를 선택해도 도와주기가 뜹니다.
해결방안
무시하기 찾아보기: return 추가하기
문제 :포만감 저하로 사망하면 선택지가 아닌 게임종료로 감(스타트게임의 사망알림뜸)
해결방안 :사망 2번을 동일스테이지에서 한번더 도전으로 수정
◆ 3.게임 종료
process.exit()
결말 추가하기(player.happiness값으로)
switch (player.happiness) {
case player.happiness > 80:
console.log('즐겨운 여행을 마친 베르노. 행복하게 집으로 돌아갑니다.');
break;
case player.happiness > 40:
console.log('괜찮은 여행이었어요. 이번엔 어디로 여행을 가볼까요? ');
break;
case player.happiness > 10:
console.log('힘들어요 ㅠㅠ 어서 집으로 돌아가고 싶네요');
break;
default:
console.log('우울해요. 괜히 나왔어. 집으로 돌아갈레요');
}
플레이어, 몬스터의 hp, fullness, happiness, Attack 수정하기
현황
hp | fullness | happiness | attack | ||
Player | 100 | 80 | 20 | 10 + 2 * stage; | 초기값 |
Human | rand+ stage * 10 | 10 + stage * 2 | 공격 3% | ||
보상-H | +10 | 100 | -10 | 인간 | |
Ice | rand + stage * 5 | stage + 1 | 공격2% | ||
보상-H | +10 | +10 | +5 | 빵 | |
보상-W | +10 | +20 | +5 | 고기 | |
보상-R | +10 | +3 | +5 | 과일 | |
보상-O | +10 | +5 | +5 | 물고기 | |
사망 | stage * 3 + 10 | stage * 10 |
수정하기
의도 :
3번은 맞아야 몬스터 사망하게
사람 상대로 중간에 도망쳐도 2판정도는 버티게
공격비율 사람은 40%, 얼음은 30%
길이동시(베틀 while문) p.hp5씩 회복
허기로 ph 충전 추가하기
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ||
p.attack | 10+2*A4 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30 |
p.hp | 가정 | 50 | 50 | 50 | 50 | 50 | 50 | 50 | 50 | 50 | 50 |
h.attack | 10+A4*2 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30 |
h.hp | A4*30 | 30 | 60 | 90 | 120 | 150 | 180 | 210 | 240 | 270 | 300 |
i.attack | A4*2+3 | 5 | 7 | 9 | 11 | 13 | 15 | 17 | 19 | 21 | 23 |
i.hp | A4*20 | 20 | 40 | 60 | 80 | 100 | 120 | 140 | 160 | 180 | 200 |
p->h | A8/A5 | 2.5 | 4.3 | 5.6 | 6.7 | 7.5 | 8.2 | 8.8 | 9.2 | 9.6 | 10.0 |
p->i | A10/A5 | 1.7 | 2.9 | 3.8 | 4.4 | 5.0 | 5.5 | 5.8 | 6.2 | 6.4 | 6.7 |
h->p | A6/A7 | 4.2 | 3.6 | 3.1 | 2.8 | 2.5 | 2.3 | 2.1 | 1.9 | 1.8 | 1.7 |
i->p | A6/A9 | 10.0 | 7.1 | 5.6 | 4.5 | 3.8 | 3.3 | 2.9 | 2.6 | 2.4 | 2.2 |
허기h | A12*2 | 5.0 | 8.6 | 11.3 | 13.3 | 15.0 | 16.4 | 17.5 | 18.5 | 19.3 | 20.0 |
허기i | A13*2 | 3.3 | 5.7 | 7.5 | 8.9 | 10.0 | 10.9 | 11.7 | 12.3 | 12.9 | 13.3 |
보상 –
도망 1번쳐도 굶어죽지 않게 = 여유 20
빵 | 15 |
고기 | 20 |
과일 | 3 |
물고기 | 10 |
행복 : 모두 도와 줬을 때 100이상 나오도록 수정
초기값 40, 보상+7
무시하면 행복깎기
-3
// player 초기값
// hp 100
// 허기 40
// 행복 40;
// hp
h.hp = rand + stage * 30;
i.hp = rand + stage4 * 20;
// attack
player.attack = 10 + 2 * stage;
h.attack = 10 + stage * 2;
i.attack = 3 + stage * 2;
const hMonster = new HumanMonster(rand + stage * 30, 10 + stage * 2);
const iMonster = new IceMonster(rand + stage4 * 20, 3 + stage * 2);
// 길 걸을 때 마다
player.hp += 5;
player.happiness -= 2;
// 무시할 떄 마다
player.happiness -= 3;
// 보상
// 사람
player.hp += 10;
player.fullness = 100;
player.happiness -= 7;
// 빵
player.hp += 10;
player.fullness += 15;
player.happiness += 7;
// 고기
player.hp += 10;
player.fullness += 20;
player.happiness += 7;
// 과일
player.hp += 10;
player.fullness += 3;
player.happiness += 7;
//물고기
player.hp += 10;
player.fullness += 10;
player.happiness += 7;
player.fullness 수정 위치
선택지
길 걷기
player.fullness -= 2;
돕기 vs 무시 <- 빼기
공격/방어/도주
player.fullness -= 2;
텍스트 수정하기
글자색 바꾸기
출력문 수정
공격하는 대상 설명 파랑
chalk.blue(
선택지 하늘(블루 브라이트)
chalk.blueBright(
몬스터 hp 빨강
chalk.red(
플레이어 hp초록
chalk.green(
공격 등 노랑
chalk.yellow(
나머진 하양
'내일배움 과제 > CH 2 Rogue like JAVASCRIPT! 과제' 카테고리의 다른 글
텍스트 로그라이크 코드_2 (0) | 2024.11.13 |
---|---|
텍스트 로그라이크 코드_1 (0) | 2024.11.12 |
0 설계 (1) | 2024.11.12 |
1. 개발환경 세팅 (2) | 2024.11.11 |