UE5

Chat Base Ball 과제물

개발꼬순내 ㅣ 2025. 3. 28. 21:19

클라이언트가 입력한 숫자와 서버에서 만든 랜덤숫자를 비교하여 스트라이크, 볼의 판정을 하여 다시 클라이언트로 결과를 뿌려주는게 과제물이다.

 

BP_Widget

 

위젯은 처음받은 상태 그대로이다. TextBox에 입력된 값을 Controller로 보내고 TextBox를 지우게 된다.

맨위에 로그인 바인딩은 뭔소린지 모르겠는데 대충 컨트롤러랑 연결된 상태라는 것 같다.

 

BP_Controller

컨트롤러 전체 모습이다.

C++로 하면 더 편했을텐데 강의에서 C++ 어떻게 쓰는지도 안알려주고 인터넷 뒤지기도 어려워서 그냥 BP로 구현했다.

그래서 하는 내내 짜증이 개많이 났다.

 

Send To Server

위젯으로부터 받은 메시지를 서버로 보낸다. User ID는 로그인할 때 같이받아서 세팅된다. (따로 안보여주겠다)

 

BP_GameMode

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