코딩

블랙잭

찬이2 2022. 11. 10. 01:20

벡터를 활용해서 만들어봤는데 아직 좀 쓰기 어색하다...

#include<iostream>
#include<string>
#include<vector>
#include<time.h>

using namespace std;

//문양 열거형
enum SHAPE
{
	SPADE,
	HEART,
	CLOVER,
	DIA
};

//카드 구조체
struct Card
{
	int number;
	string shape;
};

//플레이어 구조체
struct Player
{
	string name;
	vector<Card> hand;
	int add = 0;
	int money = 10000;
};

//셔플 함수
void Shuffle(Card* deck)
{
	for (int i = 0; i < 1000; i++)
	{
		int sour = rand() % 52;
		int dest = rand() % 52;
		Card temp = deck[sour];
		deck[sour] = deck[dest];
		deck[dest] = temp;
	}
}

//void GiveCard(Player& player,Card* deck)
//{
//	player.hand.push_back(deck[player.hand.size()]);
//	player.hand.push_back(deck[player.hand.size()]);
//	player.money -= 1000;
//}

//카드 출력 함수
void PrintCard(Player player)
{
	cout << "덱 : ";
	for (int i = 0; i < player.hand.size(); i++)
	{
		cout << player.hand[i].shape;
		switch (player.hand[i].number)
		{
		case 1:
			cout << "A" << "\t";
			break;
		case 11:
			cout << "J" << "\t";
			break;
		case 12:
			cout << "Q" << "\t";
			break;
		case 13:
			cout << "K" << "\t";
			break;
		default:
			cout << player.hand[i].number << "\t";
			break;
		}
	}
}

//카드 합 계산 함수
void AddCard(Player& player)
{
	player.add = 0;
	for (int i = 0; i < player.hand.size(); i++)
	{
		if (player.hand[i].number > 10)
		{
			player.add += 10;
		}
		else
		{
			player.add += player.hand[i].number;
		}
	}
}

int main()
{
	srand(time(NULL));
	Player me, dealer;
	Card deck[52];
	//트럼프 카드 생성
	for (int i = 0; i < 52; i++)
	{
		deck[i].number = i % 13 + 1;
		switch (i/13)
		{
		case SPADE:
			deck[i].shape = "♠";
			break;
		case HEART:
			deck[i].shape = "♥";
			break;
		case CLOVER:
			deck[i].shape = "♣";
			break;
		case DIA:
			deck[i].shape = "◆";
			break;
		}
	}
		
	//사용자 이름 입력
	cout << "사용자의 이름을 입력해주세요!" << endl << "입력 : ";
	cin >> me.name;
	dealer.name = "딜러";
	
	int input, size = 0;
	bool myturn = true; //현재 차례 구분용
	
	while (true)
	{
		//다음판 시작 시 카드 초기화
		me.hand.clear();
		dealer.hand.clear();

		//카드 셔플
		Shuffle(deck);
		
		//내 차례
		//카드 분배
		me.hand.push_back(deck[me.hand.size()]);
		me.hand.push_back(deck[me.hand.size()]);
		me.money -= 1000; //판돈 차감
				
		cout << "==============내 차례==============" << endl;
		cout << "플레이어 이름 : " << me.name << endl;
		cout << "소지금 : " << me.money << endl;

		//내 차례인지 확인 조건의 반복문
		while (myturn == true)
		{
			PrintCard(me); //카드 출력 함수
			AddCard(me); //카드 합 계산 함수
			cout << "합 : " << me.add << endl;
			
			//합이 21이 넘어 버스트일 경우
			if (me.add > 21)
			{
				cout << me.name << " 버스트!!!" << endl;
				myturn = false;
				break;
			}

			//히트 스탠드 입력
			cout << "1.히트! / 2.스탠드! -> ";
			cin >> input;
			
			//스탠드 입력 시
			if (input == 2)
			{
				myturn = false;
			}
			//히트 입력 시
			else
			{
				//카드 한장 추가
				me.hand.push_back(deck[me.hand.size()]);
			}
		}
		//내 차례에 덱에서 뽑은 카드 수
		size = me.hand.size();

		//=================================================================
		//딜러차례
		//카드 분배
		dealer.hand.push_back(deck[size++]);
		dealer.hand.push_back(deck[size++]);
		dealer.money -= 1000; //판돈 차감
				
		cout << "==============딜러 차례==============" << endl;
		cout << "플레이어 이름 : " << dealer.name << endl;
		cout << "소지금 : " << dealer.money << endl;

		//딜러 차례인지 확인 조건의 반복문
		while (myturn == false)
		{
			PrintCard(dealer); //카드 출력 함수
			AddCard(dealer); //카드 합 계산 함수
			cout << "합 : " << dealer.add << endl;
			
			//딜러 카드합이 16이하면 무조건 히트
			if (dealer.add < 17)
			{
				dealer.hand.push_back(deck[size++]);
			}
			//딜러 카드합이 21초과면 버스트 후 종료
			else if (dealer.add > 21)
			{
				cout << dealer.name << " 버스트!!!" << endl;
				myturn = true;
				break;
			}
			//그 외 턴 종료
			else
			{
				myturn = true;
			}
		}

		//=================================================================

		//결과값으로 승패 판별
		if (me.add > 21 || dealer.add > 21)
		{
			if (dealer.add < 21)
			{
				cout << "※※※※※※※※" << dealer.name << " 승리※※※※※※※※" << endl;
				dealer.money += 2000;
			}
			else if (me.add < 21)
			{
				cout << "※※※※※※※※" << me.name << " 승리※※※※※※※※" << endl;
				me.money += 2000;
			}
			else
			{
				cout << "※※※※※※※※비겼습니다.※※※※※※※※" << endl;
				me.money += 1000;
				dealer.money += 1000;
			}
		}
		else if (me.add == 21 || dealer.add == 21)
		{
			if (dealer.add != 21)
			{
				cout << "※※※※※※※※" << me.name << "블랙잭※※※※※※※※" << endl;
				me.money += 2000;
			}
			else if (me.add != 21)
			{
				cout << "※※※※※※※※" << dealer.name << "블랙잭※※※※※※※※" << endl;
				dealer.money += 2000;
			}
			else
			{
				cout << "※※※※※※※※비겼습니다.※※※※※※※※" << endl;
				me.money += 1000;
				dealer.money += 1000;
			}
		}
		else
		{
			if (21 - me.add > 21 - dealer.add)
			{
				cout << "※※※※※※※※" << dealer.name << " 승리※※※※※※※※" << endl;
				dealer.money += 2000;
			}
			else if (me.add == dealer.add)
			{
				cout << "※※※※※※※※비겼습니다.※※※※※※※※" << endl;
				me.money += 1000;
				dealer.money += 1000;
			}
			else
			{
				cout << "※※※※※※※※" << me.name << " 승리※※※※※※※※" << endl;
				me.money += 2000;
			}
		}
		
		//현재판 종료 구분용
		cout << "=========================================" << endl;
		cout << "=================턴 종료=================" << endl;
		cout << "=========================================" << endl << endl;
	}

	return 0;
}