TIL

2024년 9월 19일 TIL(+ 등급별 뽑기 구현 방법)

kagan-draca 2024. 9. 20. 23:35

주말과 오늘을 이용해 SSR, SR, R 등급별 ( 4%, 26% 50%)로 뽑히게 구현했고,

 

그 확률 안에서 SSR의 총 개수, SR의 총 개수, R의 총 개수 별로 확률이 나오게 만들었다.

 

gambling_router.get('/gambling', authMiddleware, async (req, res) => {
  let { account_id, cash } = req.user;

  if (cash < 1000) return res.status(402).json('케쉬가 부족합니다.');

  const rarity = await rarityOutputPrint(randomNumber01());

  const rarity_player_list = await rarityPlayerList(rarity);

  const random_number = randomNumber01();

  let name = null;
  for (let i = 0; i < rarity_player_list.length; i++) {
    let start_range = 0;
    let end_range = rarity_player_list[i].range;

    if (start_range <= random_number && random_number < end_range) {
      name = rarity_player_list[i].name;
      break;
    }
    start_range = rarity_player_list[i].range;
  }
  console.log(
    '레어 등급 : ' + rarity + '등급 선수 확률 범위 : ' + random_number + '뽑힌 선수 : ' + name,
  );

  cash -= 1000;
  // 유저 캐쉬 1000원 감소

  const exist_hold_player = await table_findFirst(process.env.HOLD_PLAYERS, {
    account_id,
    name,
  });

  await prisma.$transaction(
    async (tx) => {
      if (exist_hold_player) {
        await row_update(
          process.env.HOLD_PLAYERS,
          {
            id: exist_hold_player.id,
          },
          {
            count: {
              increment: 1, // count를 1 증가
            },
          },
          tx,
        );
      } else await row_create(process.env.HOLD_PLAYERS, { account_id, name }, tx);
      await row_update(process.env.ACCOUNTS, { account_id }, { cash }, tx);
    },
    {
      isolationLevel: Prisma.TransactionIsolationLevel.ReadCommitted,
    },
  );

  const add_last_korean = checkBatchimEnding(name) ? '이' : '가';
  return res.status(200).json(`${rarity} 등급의 ${name}${add_last_korean} 나왔습니다!!`);
});

 

const randomNumber01 = () => {
  return Math.random(0, 1);
};

const rarityOutputPrint = (value) => {
  if (0 <= value && value < 0.33) return 'SSR';
  // 4%
  else if (0.33 <= value && value < 0.66) return 'SR';
  // 26%
  else return 'R';
  // 50%

  //로 줄 예정 입니다.
  //현재는 테스트를 위해 위와 같이 적용
};

export { randomNumber01, rarityOutputPrint };

 

먼저 rarityOutputPrint 함수를 바탕으로 0 ~ 1 사이 난수의 의해

무슨 등급인지 결정 시켜 줍니다.

 

그리고, DB에 저장된 range 값을 이용해 어떤 선수가 나올지 결정 합니다.

 

ex) 0 ~ range이면, row의 1번 선수

이전 range ~ 현재 range이면,

현재 row의 선수가 나오게 만들어줍니다.

 

 

'TIL' 카테고리의 다른 글

2024년 9월 23일 TIL(+ 풋살 온라인 게임 로직)  (0) 2024.09.25
2024년 9월 20일 TIL (+동적 테이블 사용)  (0) 2024.09.20
2024년 9월 13일 TIL  (0) 2024.09.13
2024년 9월 12일 TIL  (0) 2024.09.12
2024년 9월 11일 TIL  (0) 2024.09.12