오늘은 Unreal C++을 이용하여 블랙잭 게임을 만들어보도록 하겠습니다.
우선 각 문양(스페이스, 클로버, 다이아, 하트)를 나타낼 수 있도록 Enum Type을 선언해줍니다.
enum EPATTERNTYPE
{
SPACE,
CLOVA,
DIAMOND,
HEART
}
언리얼에서는 Enum형의 경우 앞에 E를 붙여주어야 합니다.
Enum의 경우 사실 숫자와 다르지 않으며, 내가 따로 기재하지 않는다면 첫번째 Enum의 값은 0이 됩니다.
이후로는 1씩 증가합니다.(저장되는 것은 결국 숫자로 저장되기 때문에 처리 과정이 훨씬 빠르고 보는 입장에서는 글자로 인식하기 때문에 가독성이 증가합니다.)
내가 시작을 100으로 하고 싶다거나, 중간에 다른 값부터 시작하게 하고 싶은 경우 직접 숫자를 기재해주면 됩니다.
또한, 안전한 사용을 위해 최소값인 None과 Max를 추가해주는 것이 좋습니다.
enum EPATTERNTYPE
{
None,
SPACE = 3,
CLOVA,
DIAMOND = 100,
HEART,
Max
}
위와 같이 바꾼 경우 SPACE는 3, CLOVA는 4, DIAMOND는 100, HEART는 101이 됩니다.
내가 만든 Enum을 쓰고 싶은 경우 해당 Enum의 이름::사용할 Enum 값으로 사용합니다.
EPARTTERNTYPE A = EPARTTERNTYPE::SPACE;
//또는
int a = EPARTTERNTYPE::SPACE;
출력을 할때는 어떨까?
a를 출력하는 경우 숫자로, A를 출력하는 경우 Enum형으로 출력된다.
cout << static_cast<EPARTTERNTYPE>(a);
아니면 이렇게 형변환을 통해 a를 Enum 형으로 출력할 수도 있다.
static_cast란?
C++로 오면서 형변환하는 키워드를 추가하였다.
일반 형변환을 사용하면 실제 해당 주소 값이 내가 변환한 자료형이 아니더라도 들어간다.(어차피 주소 값이므로)
이로 인한 오류 발생을 막기 위해 만든 키워드로 아예 다른 자료형으로 변환하는 형변환을 막는 방식이다.
예를 들어
int -> double (O)
부모* class -> 자식* class (O)
int* -> float* (X)
또한, 아래와 같이 코드를 보면 해당 class의 멤버 변수로 Enum Class의 객체를 받아오고 이를 반복문에서 설정하기 위해 해당 반복문의 변수 i를 형변환하여 enum class로 변환한 후 그 값을 멤버 변수의 set 값으로 받아오고 있다.
추가로 이 카드를 여러개 들고 있을 덱 Class를 만들어주도록 한다.
enum class EPARTTERNTYPE
{
None = -1,
Clova = 0,
Spade,
Heart,
Diamond,
Max
};
class FCard
{
public:
FCard();
virtual ~FCard();
void SetType(EPARTTERNTYPE NewCardType);
int GetNumber();
protected:
EPARTTERNTYPE Type;
int Number;
};
void FCard::SetType(EPARTTERNTYPE NewCardType)
{
Type = NewCardType;
}
void FCard::SetNumber(int NewNumber)
{
Number = NewNumber;
}
int FCard::GetNumber()
{
return Number;
}
class FDeck
{
public:
FDeck();
~FDeck();
FCard* Draw();
private:
std::vector<FCard*> Cards;
int CurrentPosition;
};
FDeck::FDeck()
{
for (int Type = 0; Type < 4; ++Type)
{
for (int Number = 1; Number <= 13; ++Number)
{
FCard* Temp = new FCard();
Temp->SetType(static_cast<EPARTTERNTYPE>(Type));
Temp->SetNumber(Number);
Cards.push_back(Temp);
}
}
CurrentPosition = Cards.size() - 1;
std::random_shuffle(Cards.begin(), Cards.end());
}
FDeck::~FDeck()
{
for(FCard* card : Cards)
{
delete card;
}
}
FDeck::Draw()
{
FCard* ChoseCard = nullptr;
ChoseCard = Cards.back();
Cards.pop_back();
return ChoseCard;
}
또한, class내 멤버 변수를 출력할때 해당 변수가 enum class인 경우 해당 변수의 값을 출력할때 string 배열을 만들어서 숫자에 맞게 표출해줄 문자를 넣어주고, 넣어준 문자가 출력될 수 있도록 string 배열 내 인덱스 값을 class 내 멤버 변수의 값으로 가져오고 가져온 값을 다시 int으로 변환해 해당 int를 배열 문자에 맞춰서 출력하도록 설정한 것이다.
다음으로는 Enum값에 맞춰 실제로는 특수문자와 숫자를 출력할 함수를 추가해주도록 한다.
void FCard::Show()
{
string CardType[4] = {
"♣", "♠", "♥", "◆"
};
cout << CardType[static_cast<int>(Type)] << " ";
ShowNumber();
cout << endl;
}
void FCard::ShowNumber()
{
if(Number < 11 && Number > 1)
{
std::cout << Number;
}
else
{
if(Number == 11)
std::cout << 'J';
else if(Number == 12)
std::cout << 'Q';
else if(Number == 13)
std::cout << 'K';
else if(Number == 1)
std::cout << 'A';
}
}
이제 이 Class들을 이용하여 블랙잭 게임을 완성하면 다음과 같다.
int main()
{
FDeck Deck;
std::vector<FCard*> Player;
std::vector<FCard*> Dealer;
Player.push_back(Deck.Draw());
Dealer.push_back(Deck.Draw());
std::cout << "플레이어의 패 : " << Player[0].Show() << std::endl;
std::cout << "딜러의 패 : " << Dealer[0].Show() << std::endl;
char Input;
bool GameEnd = false;
int PlayerCount = 0;
int DealerCount = 0;
while(!GameEnd)
{
std::cout << "카드를 더 뽑으시겠습니까?(Y/N)" << std::endl;
std::cin >> Input;
if(Input == 'Y')
{
Player.push_back(Deck.Draw());
Dealer.push_back(Deck.Draw());
}
else
{
std::cout << "게임 종료" << std::endl;
GameEnd = true;
}
}
std::cout << "플레이어의 패" << std::endl;
for(int i = 0; i < Player.size(); ++i)
{
Player[i]->Show();
PlayerCount += Player[i]->GetNumber()
}
std::cout << "딜러의 패" << std::endl;
for(int j = 0; j < Dealer.size(); ++j)
{
Dealer[j]->Show();
DealerCount += Dealer[j]->GetNumber();
}
if(PlayerCount == 21)
std::cout << "Player 승리" << std::endl;
else if(PlayerCount > 21)
std::cout << "Player 패배" << std::endl;
else if(PlayerCount < 21 && DealerCount > PlayerCount)
std::cout << "Player 패배" << std::endl;
else if(PlayerCount < 21 && DealerCount < PlayerCount)
std::cout << "Player 승리" << std::endl;
};
'Engine > Unreal' 카테고리의 다른 글
언리얼 Enhanced Input System (3) | 2025.07.17 |
---|---|
Unreal Dedicated Server 설정하기 (4) | 2025.07.10 |
언리얼의 기초 2 (0) | 2025.01.06 |
언리얼 엔진의 기초 (0) | 2024.11.27 |
언리얼 엔진에 fbx 파일 임포트 하기 (0) | 2024.11.22 |