TIL

내일배움캠프 3주차 금요일 TIL

news0516 2024. 11. 15. 20:17

server.js에 추가한  printReport 함수

function printReport(reportData) {
    if (!reportData) {
        console.log(chalk.red(`기록이 없습니다.`));
        return;
    } 
    console.log(chalk.yellowBright(`=== 게임 기록 ===`));
    console.log(`마지막 클리어 스테이지: ${reportData.clearStage}`);
    console.log(`총 게임 횟수: ${reportData.totalTry}`);
    console.log(`게임 클리어 : ${reportData.allClears}`);
    console.log(`클리어 실패 : ${reportData.totalFails}`);
    console.log(`===================`);
}



- case2에 추가하여 업적 확인 용 printReport 함수를 사용
- 1을 선택해 gamestart 시 저장되어잇던 reportData를 불러 새로운 플레이 기록과 합쳐지도록 구성

export function handleUserInput() {
    const choice = readlineSync.question('입력: ');

    switch (choice) {
        case '1':
            {
            console.log(chalk.green('게임을 시작합니다.'));
            // 여기에서 새로운 게임 시작 로직을 구현
            const reportData = loadReport();
            startGame(reportData);
            }
            break;
        case '2':
            {
            console.log(chalk.yellow('누적 기록.'));
            // 업적 확인하기 로직을 구현
            const reportData = loadReport();
            printReport(reportData);
            handleUserInput();
            }
            break;
        case '3':
            console.log(chalk.red('게임을 종료합니다.'));
            // 게임 종료 로직을 구현
            process.exit(0); // 게임 종료
            break;
        default:
            console.log(chalk.red('올바른 선택을 하세요.'));
            handleUserInput(); // 유효하지 않은 입력일 경우 다시 입력 받음
    }
}



- chooseItem 함수를 따로 만들어 battle 함수에서 아이템 관련 로직 분리
chooseItem 아이템 함수 없이 battle 함수 내에서 아이템 관련 로직을 그대로 적용하여 사용하다
종료 관련 코드가 중복되어 원하는 순서대로 출력이 어려웠다.
코드 구상 과정에서 최대한 생각나는대로 구성을 하다 생긴 문제라 더 직관적이고 보기 편할 수 있도록 함수를 따로 구성하였다. 이함수를 battle함수 내 스테이지 클리어 조건하에 호출하여 사용중 

 

const chooseItem = async (stage, player) => {
  if (stage < 10) {
    console.clear();
    displayStatus(stage, player, new Monster(stage)); //현재 상태를 보여주기 위해 호출
    let itemChoices = new Item().itemchoice(); 
    console.log(chalk.green(
      `\n1 : ${itemChoices[0].name} | ${itemChoices[0].explain} 
      \n2 : ${itemChoices[1].name} | ${itemChoices[1].explain} 
      \n3 : ${itemChoices[2].name} | ${itemChoices[2].explain}`
    ));

    while (true) {
      const choice2 = readlineSync.question('\n당신의 선택은? ');
      if (choice2 === '1') {
        itemChoices[0].effect(player);
        console.log(chalk.green(`\n${itemChoices[0].explain}`));
        break;
      } else if (choice2 === '2') {
        itemChoices[1].effect(player);
        console.log(chalk.green(`\n${itemChoices[1].explain}`));
        break;
      } else if (choice2 === '3') {
        itemChoices[2].effect(player);
        console.log(chalk.green(`\n${itemChoices[2].explain}`));
        break;
      } else {
        console.log(chalk.red(`\n정확히 입력해주세요.`));
      }
    }
  } 
};




- startGame 실행 시 기존 reportData 로드
- totalTry, allClear, totalFails 가 플레이 결과에 따라 기존 데이터에 추가되도록 설정하여 업적 옵션 구성 

export async function startGame(reportData) {
  console.clear(); // console.clear()를 호출하여 콘솔 화면 지우기
  const player = new Player(); // 플레이어 객체를 생성
  let stage = 1; // 스테이지를 1로 초기화
  let totalTry = reportData.totalTry; 
  let allClears = reportData.allClears; 
  let totalFails = reportData.totalFails;
  totalTry++;

  while (stage <= 10) {
    // 루프를 시작하여 최대 10단계까지 진행
    console.clear();
    const monster = new Monster(stage); // 현재 스테이지에 해당하는 몬스터 객체 생성
    const item = new Item();
    await battle(stage, player, monster, item); // 호출하여 전투를 시작

    // 플레이가 죽으면(player.hp가 0 이하가 되면) 게임종료
    if (player.hp <= 0) {
      console.log(`체력이 고갈되었습니다.`);
      if (player.reviveitem === true) {
        player.revive();
        continue;
      } else {
        totalFails++;
        report(totalTry, stage, allClears, totalFails);
        console.log(`게임 오버`);
        readlineSync.question('로비로 이동합니다. 아무키나 입력하세요.');
        displayLobby();
        handleUserInput();
        
      }
    } else if (stage === 10 && monster.hp <= 0) {
      console.log(`모든 스테이지를 클리어했습니다.`);
      allClears++;
      report(totalTry, stage, allClears, totalFails);
      readlineSync.question('로비로 이동합니다. 아무키나 입력하세요.');
      displayLobby();
      handleUserInput();
    }
    stage++;

    // 그 외 모든 상황은 스테이지 증가

    // 이후 10스테이지까지 루프 반복
  }
}



오늘은 텍스트 로그라이크 게임 프로젝트를 완료했다. 이번 프로젝트에서는 이전 프로젝트에서 느꼈던 도적전인 자세의 중요성을 잘 적용했다. 주어진 기한 내에 내가 할 수 있는 수준의 기능들을 최대한 추가했다.

이번 한 주 동안 같은 코드를 반복적으로 관찰하고 수정하는 과정을 통해 코딩에 익숙해지는 데 큰 도움이 되었다. 특히, 코드의 각 부분을 이해하고 개선하는 데 중점을 두었기에 문제 해결 능력이 많이 향상되었다.

또한, 저번 주부터 계획한 대로 학습과 프로젝트를 비교적 수월하게 진행할 수 있었다.


프로젝트를 진행하면서 도전적인 태도를 유지하는 것이 얼마나 중요한지를 다시 한 번 깨달았다. 문제를 해결하기 위해 다양한 접근 방식을 시도하고, 실패를 두려워하지 않는 것이 성장의 밑바탕이 된다는 것을 느꼈다.

같은 코드를 반복적으로 관찰하고 수정하는 과정이 나의 코딩 실력을 향상시키는 데 큰 도움이 되었다. 코드의 흐름과 구조를 이해하고, 더 나은 방법으로 개선할 수 있는 기회를 제공해 주었다.

이러한 경험을 통해 오늘도 한 발 더 나아간 것 같아 뿌듯함을 느꼈다. 앞으로도 꾸준히 기록하여 성장을 확인하고싶다.