3-2. 판정 로직
Ctrl + M + O > 코드 내용 접기
세 자리 난수 생성 로직과 판정 로직 작성
// CXGameModeBase.h
...
class CHATX_API ACXGameModeBase : public AGameModeBase
{
...
public:
...
FString GenerateSecretNumber();
bool IsGuessNumberString(const FString& InNumberString);
FString JudgeResult(const FString& InSecretNumberString, const FString& InGuessNumberString);
};
// CXGameModeBase.cpp
...
FString ACXGameModeBase::GenerateSecretNumber()
{
TArray<int32> Numbers;
for (int32 i = 1; i <= 9; ++i)
{
Numbers.Add(i);
}
FMath::RandInit(FDateTime::Now().GetTicks());
Numbers = Numbers.FilterByPredicate([](int32 Num) { return Num > 0; });
FString Result;
for (int32 i = 0; i < 3; ++i)
{
int32 Index = FMath::RandRange(0, Numbers.Num() - 1);
Result.Append(FString::FromInt(Numbers[Index]));
Numbers.RemoveAt(Index);
}
return Result;
}
bool ACXGameModeBase::IsGuessNumberString(const FString& InNumberString)
{
bool bCanPlay = false;
do {
if (InNumberString.Len() != 3)
{
break;
}
bool bIsUnique = true;
TSet<TCHAR> UniqueDigits;
for (TCHAR C : InNumberString)
{
if (FChar::IsDigit(C) == false || C == '0')
{
bIsUnique = false;
break;
}
UniqueDigits.Add(C);
}
if (bIsUnique == false)
{
break;
}
bCanPlay = true;
} while (false);
return bCanPlay;
}
FString ACXGameModeBase::JudgeResult(const FString& InSecretNumberString, const FString& InGuessNumberString)
{
int32 StrikeCount = 0, BallCount = 0;
for (int32 i = 0; i < 3; ++i)
{
if (InSecretNumberString[i] == InGuessNumberString[i])
{
StrikeCount++;
}
else
{
FString PlayerGuessChar = FString::Printf(TEXT("%c"), InGuessNumberString[i]);
if (InSecretNumberString.Contains(PlayerGuessChar))
{
BallCount++;
}
}
}
if (StrikeCount == 0 && BallCount == 0)
{
return TEXT("OUT");
}
return FString::Printf(TEXT("%dS%dB"), StrikeCount, BallCount);
}
GameMode에 로직 적용
// CXGameModeBase.h
...
class ACXPlayerController;
UCLASS()
class CHATX_API ACXGameModeBase : public AGameModeBase
{
GENERATED_BODY()
public:
...
virtual void BeginPlay() override;
void PrintChatMessageString(ACXPlayerController* InChattingPlayerController, const FString& InChatMessageString);
protected:
FString SecretNumberString;
TArray<TObjectPtr<ACXPlayerController>> AllPlayerControllers;
};
// CXGameModeBase.cpp
...
#include "Player/CXPlayerController.h"
#include "EngineUtils.h"
void ACXGameModeBase::OnPostLogin(AController* NewPlayer)
{
...
ACXPlayerController* CXPlayerController = Cast<ACXPlayerController>(NewPlayer);
if (IsValid(CXPlayerController) == true)
{
AllPlayerControllers.Add(CXPlayerController);
}
}
...
void ACXGameModeBase::BeginPlay()
{
Super::BeginPlay();
SecretNumberString = GenerateSecretNumber();
}
void ACXGameModeBase::PrintChatMessageString(ACXPlayerController* InChattingPlayerController, const FString& InChatMessageString)
{
int Index = InChatMessageString.Len() - 3;
FString GuessNumberString = InChatMessageString.RightChop(Index);
if (IsGuessNumberString(GuessNumberString) == true)
{
FString JudgeResultString = JudgeResult(SecretNumberString, GuessNumberString);
for (TActorIterator<ACXPlayerController> It(GetWorld()); It; ++It)
{
ACXPlayerController* CXPlayerController = *It;
if (IsValid(CXPlayerController) == true)
{
FString CombinedMessageString = InChatMessageString + TEXT(" -> ") + JudgeResultString;
CXPlayerController->ClientRPCPrintChatMessageString(CombinedMessageString);
}
}
}
else
{
for (TActorIterator<ACXPlayerController> It(GetWorld()); It; ++It)
{
ACXPlayerController* CXPlayerController = *It;
if (IsValid(CXPlayerController) == true)
{
CXPlayerController->ClientRPCPrintChatMessageString(InChatMessageString);
}
}
}
}
// CXPlayerController.cpp
...
#include "Kismet/GameplayStatics.h"
#include "Game/CXGameModeBase.h"
...
void ACXPlayerController::ServerRPCPrintChatMessageString_Implementation(const FString& InChatMessageString)
{
// for (TActorIterator<ACXPlayerController> It(GetWorld()); It; ++It)
// {
// ACXPlayerController* CXPlayerController = *It;
// if (IsValid(CXPlayerController) == true)
// {
// CXPlayerController->ClientRPCPrintChatMessageString(InChatMessageString);
// }
// }
AGameModeBase* GM = UGameplayStatics::GetGameMode(this);
if (IsValid(GM) == true)
{
ACXGameModeBase* CXGM = Cast<ACXGameModeBase>(GM);
if (IsValid(CXGM) == true)
{
CXGM->PrintChatMessageString(this, InChatMessageString);
}
}
}'개인 강의 > Unreal Engine 멀티플레이어 게임 개발' 카테고리의 다른 글
| Unreal Engine 멀티플레이어 게임 개발 3-1 (0) | 2026.07.29 |
|---|---|
| Unreal Engine 멀티플레이어 게임 개발 2-2 (0) | 2026.07.29 |
| Unreal Engine 멀티플레이어 게임 개발 2-1 (0) | 2026.07.29 |
| Unreal Engine 멀티플레이어 게임 개발 1-5 (0) | 2026.07.29 |
| Unreal Engine 멀티플레이어 게임 개발 1-4 (0) | 2026.07.29 |