Object.keys를 이용한 랜덤으로 객체의 key-value 접근

김동욱·2024년 11월 18일
  1. 보상을 저장할 자료구조
    key - value 쌍을 갖는 reward_type 객체로 생성
    각 속성의 키 값은 변수명처럼, value에는 id와 출력할 내용과 보상 갯수
    count는 0보다 크면 보상을 획득할 때마다 1씩 감소
    count가 0이 되면 보상 선택지에 등록 불가
    count가 -1이면 제한 없음
let reward_type = {
  heal: { id: 1, text: '체력 회복', count: -1 },
  increase_hp: { id: 2, text: '체력 증가', count: -1 },
  increase_atk: { id: 3, text: '공격력 증가', count: -1 },
  increase_escape: { id: 4, text: '도망 성공 확률 증가', count: -1 },
  get_multi_attack: { id: 5, text: '스킬-연속공격', count: 1 },
  get_counter_attack: { id: 6, text: '스킬-반격', count: 1 },
  get_auto_heal: { id: 7, text: '회복력 증가', count: -1 },
  blank: { id: 8, text: '꽝', count: -1 },
  increase_avoid: { id: 9, text: '회피율 증가', count: -1 },
  increase_critical_rate: { id: 10, text: '치명타 확률 증가', count: 4 },
  increase_critical_dmg: { id: 11, text: '치명타 데미지 증가', count: -1 }
}

key를 id로 만드는 것도 좋았을 것 같다.
나는 reward_type[0].id 처럼 쓰는게 더 직관적이라고 생각했다.


  1. 보상 선택 함수 (스테이지 클리어하면 실행됨)
  • 객체의 키를 배열로 가져오는 함수 Object.keys(객체명)를 사용해서 키 값 가져오기
  • 4개의 보상을 랜덤으로 선택
  • 한 번 선택지에 추가된 보상의 키 index 값은 저장했다가
    Array.includes(value)를 이용해서 선택지에 중복되지 않도록 확인함.
  • 보상개수가 0보다 크거나 -1(무한)이면 해당 키를 갖는 reward_type 속성을 배열에 추가
  • 보상개수가 0이거나 중복 선택된 보상이면 i-- 후 반복문을 다시 실행
    (i--하지않고 while문을 쓰는게 더 보기 좋음)
  • rewards 배열에 추가한 reward_type의 출력문을 목록에 보여줌, 반은 가려서 출력.
  • 보상을 선택하면 플레이어 객체에 전달
function selectReward(stage, player, monster) {
  const reward_keys = Object.keys(reward_type);
  let rewards = [];
  let exist_nums = [];
  const reward_len = 4;
  //보상중복방지 부분
  for (let i = 0; i < reward_len; i++) {
    let rand = Math.floor(Math.random() * reward_keys.length);
    if (!exist_nums.includes(rand)) {
      let randomKey = reward_keys[rand];
      if (reward_type[randomKey].count !== 0) {
        rewards[i] = reward_type[randomKey];
        exist_nums.push(rand);
      } else if (reward_type[randomKey].count === 0) {
        i--;
        continue;
      }
    } else {
      i--;
      continue;
    }
  }

  let reward_text = `보상목록 : `;
  for (let i = 0; i < reward_len; i++) {
    if (i < reward_len / 2) reward_text += `${i + 1}. ${rewards[i].text} `;
    else reward_text += `${i + 1}. ???? `;
  }
  console.log(reward_text);

  let reward_choice = readlineSync.question('보상 선택: ');
  if (reward_choice < 1 || reward_choice > rewards.length) {
    console.log('1번부터 4번 중에 골라주세요.');
    reward_choice = readlineSync.question('보상 선택: ');
  } else {
    console.log(`획득 보상 : `, rewards[reward_choice - 1].text);
    console.log(player.getReward(rewards[reward_choice - 1], stage));
    if (rewards[reward_choice - 1].count > 0) reward_type[reward_choice - 1].count--;
  }
}

🎁🪽🏥

profile
갓겜만들어야지

0개의 댓글