부트캠프
Nalgangdoo_Project 5일차
한우종
2024. 9. 24. 23:04
랭크 게임 티어 로직 추가
변경내용 : 랭크 포인트가 일정 지점에 도달할 경우 티어를 변경시킴
1.티어를 부여해 주기위해 Account 모델에 tier 컬럼을 추가했다.
model Account { accountId Int @id @default(autoincrement()) userId String @unique userName String @unique password String userCash Int @default(5000) winCount Int @default(0) loseCount Int @default(0) drowCount Int @default(0) rankPoint Int @default(100) super Boolean @default(false) createAt DateTime @default(now()) ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ tier String @default("Bronze") ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ characters CharacterList[] @@map("Account") }
기본값을 Bronze로 설정
2.게임 종료시 해당 유저의 rankPoint가 얼마인지 조회
//현재 사용자 체크 const currentUser = await prisma.account.findUnique({ where: { userId: currentUserId }, }); //상대 사용자 체크 const enemyUser = await prisma.account.findUnique({ where: { userId: enemyUserId.userId }, });
//현재 사용자의 랭크 포인트 const newCurrentRankPoint = currentUser.rankPoint; //상대 사용자의 랭크 포인트 const newEnemyRankPoint = enemyUser.rankPoint;
3.해당 유저의 rankPoint가 일정 수치 이상이면 티어를 결정
4. DB에 티어 업데이트//현재 사용자 티어 결정 let currentTier; if (newCurrentRankPoint < 400) { currentTier = "Bronze"; } else if (newCurrentRankPoint < 600) { currentTier = "Silver"; } else if (newCurrentRankPoint < 800) { currentTier = "Gold"; } else if (newCurrentRankPoint < 1000) { currentTier = "Diamond"; } else if (newCurrentRankPoint >= 1000) { currentTier = "Chalienger"; } //상대 사용자 티어 결정 let enemyTier; if (newEnemyRankPoint < 400) { enemyTier = "Bronze"; } else if (newEnemyRankPoint < 600) { enemyTier = "Silver"; } else if (newEnemyRankPoint < 800) { enemyTier = "Gold"; } else if (newEnemyRankPoint < 1000) { enemyTier = "Diamond"; } else if (newEnemyRankPoint >= 1000) { enemyTier = "Chalienger"; }
Promise.all을 사용해 두 유저의 업데이트를 동시에 작업을 시작하여 효율성+
await Promise.all([ //현재 사용자 티어 업데이트 prisma.account.update({ where: { userId: currentUserId }, data: { tier: currentTier }, }), //상대 사용자 티어 업데이트 prisma.account.update({ where: { userId: enemyUserId.userId }, data: { tier: enemyTier }, }), ]);
일정 티어를 달성할 경우 날강두 선수 지급
변경내용: 티어를 업데이트할 경우 사용자의 rankPoint가 1000점에 도달하여 챌린저를 달성할 경우 올스탯999를 가진 날강두를 지급한다.
1.해당 유저의 rankPoint 조회
// 현재 사용자의 rankPoint 가져오기 const userAccount = await prisma.account.findUnique({ where: { userId: currentUserId }, select: { accountId: true, rankPoint: true }, });
해당 유저의 계정안에 캐릭터가 있는지 확인하고 어떤 계정에 날강두를 지급할지 명시하기 위해 accountId또한 가져온다.//상대 사용자의 rankPoint 가져오기 const enemyAccount = await prisma.account.findUnique({ where: { userId: enemyUserId.userId }, select: { accountId: true, rankPoint: true }, });
2.해당 유저의 캐릭터 리스트에 날강두가 없는지 체크하고 없다면 추가한다.
// 현재 사용자의 rankPoint가 1000점에 도달했는지 확인 if (userAccount.rankPoint >= 1000) { // 캐릭터 ID 찾기 const character = await prisma.character.findUnique({ where: { name: "날강두" }, }); // 캐릭터가 있으면 실행 if (character) { const userCharacterAdd = await prisma.characterList.findFirst({ where: { accountId: userAccount.accountId, characterId: character.characterId, }, }); if (!userCharacterAdd) { await prisma.characterList.create({ data: { accountId: userAccount.accountId, characterId: character.characterId, // characterId 사용 }, }); } } }
//상대 사용자의 rankPoint가 1000점에 도달했는지 확인 if (enemyAccount.rankPoint >= 1000) { // CharacterList에 추가 여부 확인 const character = await prisma.character.findUnique({ where: { name: "날강두" }, }); if (character) { const enemyCharacterAdd = await prisma.characterList.findFirst({ where: { accountId: enemyAccount.accountId, characterId: character.characterId, }, }); // 캐릭터가 없으면 추가 if (!enemyCharacterAdd) { await prisma.characterList.create({ data: { accountId: enemyAccount.accountId, characterId: character.characterId, }, }); } } }