코딩
블랙잭
찬이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;
}