부트캠프

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가 일정 수치 이상이면 티어를 결정

//현재 사용자 티어 결정
      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";
      }​
4. DB에 티어 업데이트
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 },
      });​
//상대 사용자의 rankPoint 가져오기
const enemyAccount = await prisma.account.findUnique({
        where: { userId: enemyUserId.userId },
        select: { accountId: true, rankPoint: true },
      });
해당 유저의 계정안에 캐릭터가 있는지 확인하고 어떤 계정에 날강두를 지급할지 명시하기 위해 accountId또한 가져온다.


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,
              },
            });
          }
        }
      }