[내일배움캠프 Day59] 숫자 야구 게임 과제

2025. 3. 14. 22:33·내일배움캠프/TIL

[9번 과제] 숫자 야구 게임

 

판정과 난수 생성 로직은 별도의 C++ 라이브러리로 분리해서 구현하고 그 외는 블루프린트로 구현하라고 하셔서 그렇게 과제를 진행했는데 오히려 블루프린트가 더 미숙해 생각보다 시간이 좀 걸렸습니다.

 

참고로 2주차 강의 채팅 따라 하기에 추가로 구현한 과제입니다. 해당 내용은 아래 블로그에 정리해 놓았습니다. 

https://dev0404.tistory.com/68

 

[내일배움캠프 Day58] 채팅 따라하기

Listen Server를 이용해 RPC를 호출해서 채팅을 만드는 강의를 듣고 정리해보았습니다. 전체 Flow서버 사용자가 Host, 클라이언트 사용자는 Guest로 UserID를 할당한다.채널에 참가하면 사용자의 ID를 출

dev0404.tistory.com

 

 

일단 판정과 난수 생성 로직은 아래와 같습니다.

#include "BullsAndCows.h"

FString UBullsAndCows::GenerateRandomNumber()
{
	TArray<int32> Numbers;
	for (int32 i = 1; i <= 9; i++)
	{
		Numbers.Add(i);
	}

	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;
}

FString UBullsAndCows::CheckBullsAndCows(const FString& ServerNumber, const FString& PlayerNumber)
{
	int32 Strikes = 0;
	int32 Balls = 0;

	for (int32 i = 0; i < 3; i++)
	{
		if (ServerNumber[i] == PlayerNumber[i]) // 자리와 값이 같으면 S 증가
		{
			Strikes++;
		}
		else if (ServerNumber.Contains(FString::Chr(PlayerNumber[i]))) // 값만 포함되면 B 증가
		{
			Balls++;
		}
	}
    
	return FString::Printf(TEXT("%dS%dB"), Strikes, Balls);
}

bool UBullsAndCows::ValidatePlayerNumber(const FString& PlayerNumber)
{
	// 3자리 숫자인지 체크
	if (PlayerNumber.Len() != 3)
	{
		return false;
	}

	// 중복된 숫자 있는지 체크 
	TSet<TCHAR> UniqueNumbers;
	for (TCHAR Char : PlayerNumber)
	{
		if (UniqueNumbers.Contains(Char))
		{
			return false; 
		}
		UniqueNumbers.Add(Char);
	}

	return true;
}

 

블루프린트 내용은 전부 설명하기보다는 핵심 내용만 설명하면

 

 

Rule에서 "/"가 있어야 응답 패턴으로 간주하므로 채팅을 입력할 때

Left 를 통해 첫 글자를 가져와서 “/”와 비교해서 true라면 문자열의 왼쪽에서 N개의 문자를 제거한 나머지 부분을 반환하는 함수 Right Chop 를 사용해서 “/”를 뺀 나머지를 보냈습니다.

만약 “/” 로 시작하지않으면 응답 패턴으로 간주하지 않고, 입력창 비웠습니다.

 

현재 턴인 경우, ValidatePlayerNumber 를 통해 올바른 숫자인지 체크하고, false라면 OUT을 출력하고 true라면 CheckBullsAndCows 를 통해 정답과 비교하고 출력하도록 구현했습니다.

 

턴이 시작되면, 기존 타이머를 정리하고, 새 타이머를 설정한 뒤, 모든 플레이어에게 현재 턴 정보를 알려줍니다.

 

구현 결과 아래와 같이 출력됩니다.

 

턴이 10초마다 넘어가도록 구현하였으며, 승리/패배할 경우 각 플레이어의 스코어도 출력하도록 구현하였습니다.

 

 

'내일배움캠프 > TIL' 카테고리의 다른 글

[내일배움캠프 Day85] Unreal Engine AI 기초  (5) 2025.04.21
[내일배움캠프 Day75] 1주차 멀티플레이 팀플  (0) 2025.04.07
[내일배움캠프 Day58] 채팅 따라하기  (0) 2025.03.13
[내일배움캠프 Day56] 브루트포스 과제  (1) 2025.03.11
[내일배움캠프 Day55] GGF 프로젝트 1주차 WIL  (0) 2025.03.10
'내일배움캠프/TIL' 카테고리의 다른 글
  • [내일배움캠프 Day85] Unreal Engine AI 기초
  • [내일배움캠프 Day75] 1주차 멀티플레이 팀플
  • [내일배움캠프 Day58] 채팅 따라하기
  • [내일배움캠프 Day56] 브루트포스 과제
개발자 밍
개발자 밍
dev0404 님의 블로그 입니다.
  • 개발자 밍
    Developer
    개발자 밍
  • 전체
    오늘
    어제
    • 분류 전체보기 (88)
      • 강의 (8)
        • UE Climbing System (3)
        • UE Dungeon (1)
        • HCI (4)
      • 책 (18)
        • 객체지향의 사실과 오해 (5)
        • Effective C++ (3)
        • 이득우의 게임 수학 (4)
        • 이것이 취업을 위한 컴퓨터 과학이다 (4)
        • 리뷰 (2)
      • C++ (2)
      • 알고리즘 (2)
      • 자료구조 (1)
      • Unreal (4)
      • 내일배움캠프 (52)
        • TIL (52)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    그래픽스
    게임수학
    자료구조
    내일배움캠프
    알고리즘
    객체지향
    컴퓨터구조
    c++
    Effective
    언리얼
    컴퓨터 구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
개발자 밍
[내일배움캠프 Day59] 숫자 야구 게임 과제
상단으로

티스토리툴바