주말과 오늘을 이용해 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 |