이 게임은 서버가 무작위로 생성한 3자리 숫자를 플레이어들이 번갈아가며 추측하는 방식으로 진행된다. 각 플레이어는 최대 3번의 추측 기회를 가지며, 추측한 숫자에 대해 스트라이크(S)와 볼(B)을 계산해 결과를 받는다. 3번의 시도 내에 정답을 맞추면 승리하고, 양쪽 모두 맞추지 못하면 무승부로 게임이 리셋된다.
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)
{
// ... (유효성 검사 로직)
}
ANumberGameMode 클래스게임의 전체 흐름을 관리하는 게임 모드 클래스다. 주요 기능은 다음과 같다.
ProcessGuess()
플레이어의 추측을 처리한다. 턴을 확인하고, 추측 결과를 계산한 후 메시지를 broadcast한다. 또한, 승리 또는 무승부 조건을 확인해 게임을 리셋한다.
void ANumberGameMode::ProcessGuess(const FString& Guess, APlayerController* Player)
{
// ... (추측 처리 및 승패 판정 로직)
}
ResetGame()
게임을 초기 상태로 리셋한다. 새로운 숫자를 생성하고, 시도 횟수와 턴을 초기화한다.
SwitchTurn()
턴을 전환하고, 다음 플레이어에게 메시지를 보낸다.
BroadcastMessage()
모든 플레이어에게 메시지를 전달한다. 이 함수는 서버에서 호출되며, 클라이언트로 메시지를 전송한다.
void ANumberGameMode::BroadcastMessage(const FString& Message)
{
// ... (메시지 broadcast 로직)
}
ANumberPlayerController 클래스플레이어 컨트롤러 클래스다. 클라이언트 측에서 메시지를 수신하고 UI를 업데이트하는 역할을 한다.
ClientReceiveMessage()
서버로부터 메시지를 수신해 WBP_Chat 위젯의 UpdateChat 이벤트를 호출한다.
void ANumberPlayerController::ClientReceiveMessage_Implementation(const FString& Message)
{
// ... (UI 업데이트 로직)
}
WBP_Chat)게임의 UI를 담당하는 위젯 블루프린트다. 주요 구성 요소는 다음과 같다.
ChatInputEditable Text Box.ChatOutputText Block.SendButtonSendButton > OnClickedUpdateChatChatOutput에 표시한다./123과 같은 형식으로 추측을 입력하고 제출한다.BroadcastMessage 함수를 통해 서버에서 생성된 메시지를 모든 클라이언트로 전송해 동기화를 유지한다.ClientReceiveMessage를 통해 메시지를 수신하고, WBP_Chat의 UpdateChat 이벤트를 호출해 UI를 실시간으로 갱신한다.