클라이언트가 입력한 숫자와 서버에서 만든 랜덤숫자를 비교하여 스트라이크, 볼의 판정을 하여 다시 클라이언트로 결과를 뿌려주는게 과제물이다.
위젯은 처음받은 상태 그대로이다. TextBox에 입력된 값을 Controller로 보내고 TextBox를 지우게 된다.
맨위에 로그인 바인딩은 뭔소린지 모르겠는데 대충 컨트롤러랑 연결된 상태라는 것 같다.
컨트롤러 전체 모습이다.
C++로 하면 더 편했을텐데 강의에서 C++ 어떻게 쓰는지도 안알려주고 인터넷 뒤지기도 어려워서 그냥 BP로 구현했다.
그래서 하는 내내 짜증이 개많이 났다.
위젯으로부터 받은 메시지를 서버로 보낸다. User ID는 로그인할 때 같이받아서 세팅된다. (따로 안보여주겠다)
Controller로부터 메시지를 받으면 이제 판정을 시작한다.
make_Rand() 함수는 랜덤수를 만들어 String타입으로 반환하고
HandleMessageFromClient()함수는 만들어진 랜덤수와 Client로부터 받은 수를 비교하여 Ball, Strike판정을 한 뒤 구조체로 반환한다. 이렇게 반환된 수는 다시 클라이언트로 뿌려준다.
struct FStrikeBallResult
{
GENERATED_BODY()
UPROPERTY(BlueprintReadOnly)
int32 Strike;
UPROPERTY(BlueprintReadOnly)
int32 Ball;
UPROPERTY(BlueprintReadOnly)
FString Master_Num;
};
구조체 형태이다.
Strike, Ball, 생성한 랜덤수를 묶고 있다.
FString ASibalGameMode::make_Rand()
{
int32 RandomNum = FMath::RandRange(1, 999);
FString StringNumber = FString::FromInt(RandomNum);
while (StringNumber.Len() < 3)
{
StringNumber = TEXT("0") + StringNumber;
}
return StringNumber;
}
FStrikeBallResult ASibalGameMode::HandleMessageFromClient
(const FString& Message, const FString& Master_Num)
{
int32 Strike = 0;
int32 Ball = 0;
int32 count = 0;
for (auto c : Message)
{
int32 FoundIndex; // 더미 변수
bool bb = Master_Num.FindChar(c, FoundIndex); // 숫자 존재 여부 확인
if (bb)
{
if (FoundIndex == count) // 같은 자리 여부 확인
{
Strike++;
}
else
{
Ball++;
if (Ball >= 3)
{
Ball = 0;
Strike++;
}
}
}
count++; // 자리 인덱스 증가
}
return FStrikeBallResult{ Strike, Ball, Master_Num };
}
랜덤수 생성함수와 판정 함수이다.
이제 받은 데이터를 처리하는 컨트롤러 로직이다.
받은 Strike와 Ball값을 자신이 가지고 있는 값에 더하고 만약 3이상이 되면 Strike를 늘리거나 게임을 끝낸다.
'UE5' 카테고리의 다른 글
AI(2): Behavior tree (0) | 2025.04.04 |
---|---|
AI (1) (0) | 2025.04.01 |
Delegate, Mode-State-Instance (0) | 2025.03.05 |
2.27 작업목록 (0) | 2025.02.27 |
Portal 마무리 (0) | 2025.02.26 |