Unreal Engine으로 만든 숫자 야구 게임 코드 해석

정완훈·2025년 3월 27일

1. 게임 개요

이 게임은 서버가 무작위로 생성한 3자리 숫자를 플레이어들이 번갈아가며 추측하는 방식으로 진행된다. 각 플레이어는 최대 3번의 추측 기회를 가지며, 추측한 숫자에 대해 스트라이크(S)와 볼(B)을 계산해 결과를 받는다. 3번의 시도 내에 정답을 맞추면 승리하고, 양쪽 모두 맞추지 못하면 무승부로 게임이 리셋된다.


2. 주요 클래스와 기능

2.1. UNumberGameLibrary 클래스

이 클래스는 게임의 핵심 로직을 담당하는 블루프린트 함수 라이브러리다. 주요 함수는 다음과 같다.

  • GenerateRandomNumber()
    1부터 9까지의 숫자 중 중복 없이 3자리를 무작위로 생성한다. Fisher-Yates 셔플 알고리즘을 수동으로 구현해 난수를 생성한다.

    FString UNumberGameLibrary::GenerateRandomNumber()
    {
        TArray<int32> Digits = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        FRandomStream RandomStream(FDateTime::Now().GetTicks());
        ShuffleArray(Digits, RandomStream);
        return FString::Printf(TEXT("%d%d%d"), Digits[0], Digits[1], Digits[2]);
    }
  • CalculateResult()
    서버의 숫자와 플레이어의 추측을 비교해 스트라이크와 볼을 계산한다. 또한, 추측이 유효하지 않거나 서버 숫자가 3자리가 아니면 아웃(OUT)으로 처리한다.

    void UNumberGameLibrary::CalculateResult(const FString& ServerNumber, const FString& Guess, int32& Strikes, int32& Balls, bool& bIsOut)
    {
        // ... (스트라이크와 볼 계산 로직)
    }
  • IsValidGuess()
    추측한 숫자가 유효한지 확인한다. 3자리여야 하며, 중복된 숫자가 없고 0을 포함하지 않아야 한다.

    bool UNumberGameLibrary::IsValidGuess(const FString& Guess)
    {
        // ... (유효성 검사 로직)
    }

2.2. ANumberGameMode 클래스

게임의 전체 흐름을 관리하는 게임 모드 클래스다. 주요 기능은 다음과 같다.

  • ProcessGuess()
    플레이어의 추측을 처리한다. 턴을 확인하고, 추측 결과를 계산한 후 메시지를 broadcast한다. 또한, 승리 또는 무승부 조건을 확인해 게임을 리셋한다.

    void ANumberGameMode::ProcessGuess(const FString& Guess, APlayerController* Player)
    {
        // ... (추측 처리 및 승패 판정 로직)
    }
  • ResetGame()
    게임을 초기 상태로 리셋한다. 새로운 숫자를 생성하고, 시도 횟수와 턴을 초기화한다.

  • SwitchTurn()
    턴을 전환하고, 다음 플레이어에게 메시지를 보낸다.

  • BroadcastMessage()
    모든 플레이어에게 메시지를 전달한다. 이 함수는 서버에서 호출되며, 클라이언트로 메시지를 전송한다.

    void ANumberGameMode::BroadcastMessage(const FString& Message)
    {
        // ... (메시지 broadcast 로직)
    }

2.3. ANumberPlayerController 클래스

플레이어 컨트롤러 클래스다. 클라이언트 측에서 메시지를 수신하고 UI를 업데이트하는 역할을 한다.

  • ClientReceiveMessage()
    서버로부터 메시지를 수신해 WBP_Chat 위젯의 UpdateChat 이벤트를 호출한다.

    void ANumberPlayerController::ClientReceiveMessage_Implementation(const FString& Message)
    {
        // ... (UI 업데이트 로직)
    }

3. 블루프린트 위젯 (WBP_Chat)

게임의 UI를 담당하는 위젯 블루프린트다. 주요 구성 요소는 다음과 같다.

  • ChatInput
    플레이어가 추측을 입력하는 Editable Text Box.
  • ChatOutput
    게임 진행 상황을 표시하는 Text Block.
  • SendButton
    추측을 제출하는 버튼.

주요 이벤트

  • SendButton > OnClicked
    버튼 클릭 시 추측을 처리하고, UI를 업데이트한다.
  • UpdateChat
    서버로부터 메시지를 받아 ChatOutput에 표시한다.

4. 게임 플레이 시나리오

  1. 게임 시작
    서버가 무작위 3자리 숫자를 생성하고, 호스트부터 추측을 시작한다.
  2. 추측 제출
    호스트가 /123과 같은 형식으로 추측을 입력하고 제출한다.
  3. 결과 처리
    서버는 추측을 분석해 스트라이크와 볼을 계산하고, 결과를 모든 플레이어에게 broadcast한다.
  4. 턴 전환
    추측 후 턴이 전환되어 게스트가 추측할 차례가 된다.
  5. 승패 판정
    3번의 시도 내에 정답을 맞추면 승리 메시지를 표시하고 게임을 리셋한다. 양쪽 모두 맞추지 못하면 무승부로 리셋한다.

5. 기술적 세부 사항

  • C++와 블루프린트의 연동
    게임의 핵심 로직은 C++로 작성해 성능을 최적화하고, UI와 이벤트 처리는 블루프린트로 구현해 개발 효율성을 높였다.
  • 네트워크 동기화
    BroadcastMessage 함수를 통해 서버에서 생성된 메시지를 모든 클라이언트로 전송해 동기화를 유지한다.
  • UI 업데이트
    클라이언트 측에서 ClientReceiveMessage를 통해 메시지를 수신하고, WBP_ChatUpdateChat 이벤트를 호출해 UI를 실시간으로 갱신한다.

0개의 댓글