본문 바로가기
공부

블랙잭 과제 (진행중)

by MY블로그 2022. 11. 15.

플레이어 인원수 입력 / 플레이어의 이름 입력.

다수의 플레이어 vs 딜러의 블랙잭 과제진행중.

A카드 획득시 A카드의 점수를 1점 or 11점 선택하는곳에서 막힘.

딜러버스트시 버스트되지않은 플레이어들 전원 승리로뜨나

특정조건에서는 플레이어 제일높은점수 1명만 승자로 나온다 ... ??

당장은 여기서마무리후 다음시간에 수정 진행하도록 해야겠다.

 

C++ 교재 읽고 복습하러 ㄱㄱ

 

#include<iostream>
#include<time.h>
#include<string>
#include<vector>
#define SET 3

using namespace std;


//카드의 구성 (숫자)
enum Num
{
	A = 1,
	J = 11,
	Q,
	K
};
// 카드의 구성 (모양)
enum Shape
{
	DIA,
	CLOVER,
	HEART,
	SPADE
};
//Card = 숫자 & 모양
struct Card 
{
	int num;
	string shape;

	void Print()
	{
		switch(num)
		{
			case A:
				cout << shape << "A" << "\t";
				break;
			case J:
				cout << shape << "J" << "\t";
				break;
			case Q:
				cout << shape << "Q" << "\t";
				break;
			case K:
				cout << shape << "K" << "\t";
				break;
			default:
				cout << shape << num << "\t";
				break;
		}
	}
};

struct Player //플레이어의 구조체(돈 이름 카드 점수)
{
	int money;
	string name;
	vector<Card>card;
	int jokbo = 0;
	bool win; 

	void MakeJokbo()
	{
		jokbo = 0;
		for (int i = 0; i < card.size(); i++)
		{
			if (card[i].num > 10) jokbo += 10;
			else jokbo += card[i].num; 
		}
	}
	void Print(bool dealer = 0)
	{
		cout <<"["<< name<<"]" << "\t";
		for (int i = 0; i < card.size(); i++)
		{
			card[i].Print();
		}

		cout << "점수 : " << jokbo << "\t";

		if (!dealer)
		{
			cout << "소지금 : " << money << "\t";
		}
		cout << endl;
	}
};

Card MakeDeck(int num, string shape)
{
	Card temp;
	temp.num = num;
	temp.shape = shape;

	return temp;
}

void Shuffle(vector<Card>& deck)
{
	for (int i = 0; i < 1000; i++)
	{
		int sour = rand() % (52 * SET);
		int dest = rand() % (52 * SET);

		Card temp = deck[sour];
		deck[sour] = deck[dest];
		deck[dest] = temp;
	}
}
//=======================================================메인 시작
int main()
{
	srand(time(NULL));

	vector<Card>deck;
	Player dealer;

	int cardCount = 0;
	int input;
	int size;

	while(true)
	{
		cout << "[블랙 잭 게임 입니다.]" << endl;
		cout << "몇분이 플레이 하시겠습니까 ? "; cin >> size;
		if (size < 1)
		{
			cout << "최소 1명이상의 숫자를 입력해 주세요." << endl;
			cout << "다시 입력해 주세요." << endl;
			continue;
		}
		else
		{
			break;
		}
	}

	Player* player;
	player = new Player[size];

	for (int i = 0; i < size; i++)
	{
		cout << "["<< i + 1<<"]" << " 번 참가자의 이름 : ";
		cin >> player[i].name;
		player[i].money = 50000;
	}

	dealer.name = "딜러";
	dealer.money = 50000;


	for (int i = 0; i < 52*SET; i++)
	{
		string temp;
		int cut = i % 52;

		switch (cut / 13)
		{
		case DIA:
			temp = "◆";
				break;
		case CLOVER:
			temp = "♣";
				break;
		case HEART:
			temp = "♥";
				break;
		case SPADE:
			temp = "♠";
				break;
		}
		deck.push_back(MakeDeck(i % 13 + 1, temp));
	}

	
	//============================================================================게임시작

	while (true)
	{
		for (int i = 0; i < size; i++)
		{
			cardCount = 0;
			Shuffle(deck);
			player[i].win = true;
			player[i].money -= 1000;

			player[i].card.clear();
			player[i].card.push_back(deck[cardCount]);
			cardCount++;
			player[i].card.push_back(deck[cardCount]);
			cardCount++;
			cout << endl;
			cout << "==============================="<<"["<<player[i].name<<"]" << "님 차례 입니다." << endl;
			cout << endl;
			player[i].MakeJokbo();
			player[i].Print();
			
			while (true)
			{
				cout << endl;
				cout << "[1]새카드 추가 / [2]승부" <<"\t";
				cin >> input;

				if (input == 2) break;

				player[i].card.push_back(deck[cardCount]);
				cardCount++;
				player[i].MakeJokbo();
				player[i].Print();

				if (player[i].jokbo > 21)
				{
					cout << player[i].name <<"버스트" << endl;
					player[i].win = false;
					break;
				}
				else player[i].win = true;
			}
		}
		
		//===============================================================================딜러
		dealer.win = true; 
		dealer.card.clear();
		dealer.card.push_back(deck[cardCount]);
		cardCount++;
		dealer.card.push_back(deck[cardCount]);
		cardCount++;
		cout << endl;
		cout << "===============================" << "게임 딜러의 차례 입니다." << endl;
		cout << endl;
		dealer.MakeJokbo(); 
		dealer.Print();
		for (int i = 0; i < size; i++)
		{
			while (dealer.jokbo < 17)
			{
				dealer.card.push_back(deck[cardCount]);
				cardCount++;
				dealer.MakeJokbo();
				dealer.Print(true);

				if ((dealer.jokbo > 21) && (player[i].jokbo <=21))
				{
					cout << "딜러의 버스트!!" << endl;
					cout << player[i].name << "의 승리" << endl;
					player[i].money += 3000;
					dealer.win = false;
					break;
				}
				else dealer.win = true;
			}
		}
		//====================================플레이어와 딜러의 상태 세팅이 끝난후 승패비교 시작
		for (int i = 0; i < size; i++)
		{
			if (dealer.win && player[i].win)
			{
				if (dealer.jokbo < player[i].jokbo)
				{
					cout <<"["<< player[i].name<<"]" << " 님의 승리" << endl;
					player[i].money += 3000;
				}
				else if (dealer.jokbo == player[i].jokbo)
				{
					cout << "동점은 딜러의 승리" << endl;
				}
				else cout << "딜러의 승리" << endl;
			}
		}
	}
	return 0;
}

'공부' 카테고리의 다른 글

C++ 블랙잭 게임 복습  (1) 2022.11.16
C++ OOP 조사  (0) 2022.11.15
C++ 블랙잭(1:1) 코드 복습  (0) 2022.11.14
시험 오답 노트(복습용/비공개)  (0) 2022.11.13
22.11.09 복습  (0) 2022.11.09

댓글