디아블로와 같은 게임의 랭킹 시스템은 플레이어들의 성과를 바탕으로 순위를 매겨 경쟁을 유도하는 중요한 요소입니다. 이 시스템은 보통 다음과 같은 구조와 요소로 구성됩니다.

랭킹 시스템의 주요 요소 및 구조

  1. 플레이어 프로필 및 점수:

    • 각 플레이어는 고유한 ID와 점수, 레벨, 달성 시간 등의 정보를 기록합니다.
    • 점수는 게임 내에서 얻은 경험치, 스테이지 클리어 시간, 보스 처치 횟수 등에 따라 가중치를 두고 계산됩니다.
  2. 랭킹 리스트:

    • 플레이어의 점수를 기준으로 순위를 매긴 리스트입니다.
    • 보통 상위 랭킹만 공개되며, 실시간으로 순위가 갱신될 수 있습니다.
  3. 실시간 업데이트 및 동기화:

    • 플레이어가 새로운 점수를 기록하면, 기존 랭킹에 반영되고 즉시 갱신됩니다.
    • 주로 데이터베이스와 연결되어, 효율적으로 순위를 저장하고 불러옵니다.
  4. 필터링 및 범위 지정:

    • 특정 조건에 따라 필터링된 랭킹을 볼 수 있는 기능도 포함됩니다. 예를 들어, 특정 클래스별, 주간/월간 랭킹, 국가별 등으로 필터링됩니다.

파이썬 예제 코드

다음은 간단한 랭킹 시스템을 파이썬으로 구현한 예제입니다. 여기서는 Player 클래스를 사용하여 플레이어 정보를 생성하고, RankingSystem 클래스를 통해 랭킹을 관리합니다.

class Player:
    def __init__(self, player_id, name, score):
        self.player_id = player_id
        self.name = name
        self.score = score

    def __repr__(self):
        return f"Player({self.name}, Score: {self.score})"


class RankingSystem:
    def __init__(self):
        self.players = []  # 플레이어 리스트 (점수 기준 정렬되지 않음)

    def add_player(self, player):
        """플레이어를 리스트에 추가하고 점수 기준으로 정렬"""
        self.players.append(player)
        self.players.sort(key=lambda p: p.score, reverse=True)  # 점수 기준 내림차순 정렬

    def update_score(self, player_id, new_score):
        """플레이어의 점수를 업데이트하고 정렬"""
        for player in self.players:
            if player.player_id == player_id:
                player.score = new_score
                break
        self.players.sort(key=lambda p: p.score, reverse=True)

    def get_top_players(self, limit=10):
        """상위 랭킹의 플레이어 반환"""
        return self.players[:limit]

    def get_player_rank(self, player_id):
        """특정 플레이어의 현재 순위를 반환"""
        for rank, player in enumerate(self.players, start=1):
            if player.player_id == player_id:
                return rank
        return None  # 플레이어가 랭킹에 없을 경우

    def __repr__(self):
        return "\n".join(f"{rank+1}: {player}" for rank, player in enumerate(self.players))


# 사용 예시
if __name__ == "__main__":
    # 랭킹 시스템 초기화
    ranking_system = RankingSystem()

    # 플레이어 추가
    ranking_system.add_player(Player(player_id=1, name="Hero1", score=1500))
    ranking_system.add_player(Player(player_id=2, name="Hero2", score=2000))
    ranking_system.add_player(Player(player_id=3, name="Hero3", score=1800))

    # 랭킹 출력
    print("Initial Ranking:\n", ranking_system)

    # 점수 업데이트 및 랭킹 재정렬
    ranking_system.update_score(player_id=1, new_score=2100)
    print("\nUpdated Ranking:\n", ranking_system)

    # 상위 플레이어 조회
    top_players = ranking_system.get_top_players(limit=2)
    print("\nTop 2 Players:", top_players)

    # 특정 플레이어 순위 조회
    player_rank = ranking_system.get_player_rank(player_id=3)
    print("\nRank of Player ID 3:", player_rank)

코드 설명

  1. Player 클래스:

    • player_id, name, score 속성을 가진 간단한 플레이어 클래스입니다.
    • 플레이어 이름과 점수를 확인할 수 있습니다.
  2. RankingSystem 클래스:

    • add_player: 새로운 플레이어를 랭킹 시스템에 추가하고, 점수 기준으로 내림차순 정렬합니다.
    • update_score: 특정 플레이어의 점수를 업데이트하고, 업데이트된 점수를 기준으로 랭킹을 다시 정렬합니다.
    • get_top_players: 상위 몇 명의 플레이어를 반환합니다. 기본적으로 상위 10명만 보여줍니다.
    • get_player_rank: 특정 플레이어의 현재 순위를 반환합니다.
  3. 사용 예시:

    • 랭킹 시스템을 초기화하고, 세 명의 플레이어를 추가합니다.
    • 특정 플레이어의 점수를 업데이트하고, 이를 기반으로 재정렬합니다.
    • 상위 2명의 플레이어를 출력하고, 특정 플레이어의 현재 순위를 조회합니다.

확장 가능성

실제 게임 서버에서는 데이터를 데이터베이스에 저장하고, API를 통해 실시간으로 순위를 업데이트하고 조회할 수 있습니다. 또한 다중 서버 간의 동기화를 통해 플레이어가 많아져도 순위 변동이 정확하고 빠르게 이루어질 수 있습니다.

+ Recent posts