/************************************
카드덱을 컴퓨터와 사용자가 따로 사용 한다고 가정한다.
************************************/
#include<iostream>
#include<cstdlib>
#include<time.h>
using namespace std;
class Rnd {
private:
int start;
int end;
public:
Rnd()
{
start =1;//52장의 카드 받음
end = 52;
srand((unsigned)time(NULL));
}
void setRange(int pStart, int pEnd)
{
start = pStart;
end = pEnd;
}
int getRNumber()
{
int rn = (int)((rand() % (end-start+1)) + start );
return rn;
}
};
class BlackJack{
private:
int card[7]; //카드는 최대 7장까지 받을수 있음.
int money;
int win,draw,lose;
public:
BlackJack()
{
money=100000;
win=0;
draw=0;
lose=0;
}
void SetCard(int a,int Rn)
{
card[a] = Rn;
}
int GetCard(int i)
{
return card[i];
}
int switching(int card)
{
int temp;
switch(card){
case 1: case 14: case 27: case 40: temp = 11; break;
case 2: case 15: case 28: case 41: temp = 2; break;
case 3: case 16: case 29: case 42: temp = 3; break;
case 4: case 17: case 30: case 43: temp = 4; break;
case 5: case 18: case 31: case 44: temp = 5; break;
case 6: case 19: case 32: case 45: temp = 6; break;
case 7: case 20: case 33: case 46: temp = 7; break;
case 8: case 21: case 34: case 47: temp = 8; break;
case 9: case 22: case 35: case 48: temp = 9; break;
case 10: case 11: case 12: case 13: case 23: case 24:
case 25: case 26: case 36: case 37: case 38: case 39:
case 49: case 50: case 51: case 52: temp = 10; break; //A~k까지 숫자로 변환하여 받음.A는 Acount를 통해 따로 제어함
}
return temp;
}
void LoseMoney()
{
money -= 15000;
cout<<"현재 돈 :"<<money<<endl;
}
void GetMoney()
{
money += 10000;
cout<<"현재 돈 :"<<money<<endl;
}
void ShowMoney()
{
cout<<"현재 돈 :"<<money<<endl;
}
void rate(int a)
{
switch(a){
case 1: win++; break;
case 2: draw++; break;
case 3: lose++; break;
default: break;
}
}
void Result()
{
cout<<win<<"번 승리 \n";
cout<<draw<<"번 무승부 \n";
cout<<lose<<"번 패배 \n";
}
};
void Deck(int Rn)
{
switch(Rn){
case 1: cout<<"A♠"; break; case 14: cout<<"A♡"; break; case 27: cout<<"A♣"; break; case 40: cout<<"A◇"; break;
case 2: cout<<"2♠"; break; case 15: cout<<"2♡"; break; case 28: cout<<"2♣"; break; case 41: cout<<"2◇"; break;
case 3: cout<<"3♠"; break; case 16: cout<<"3♡"; break; case 29: cout<<"3♣"; break; case 42: cout<<"3◇"; break;
case 4: cout<<"4♠"; break; case 17: cout<<"4♡"; break; case 30: cout<<"4♣"; break; case 43: cout<<"4◇"; break;
case 5: cout<<"5♠"; break; case 18: cout<<"5♡"; break; case 31: cout<<"5♣"; break; case 44: cout<<"5◇"; break;
case 6: cout<<"6♠"; break; case 19: cout<<"6♡"; break; case 32: cout<<"6♣"; break; case 45: cout<<"6◇"; break;
case 7: cout<<"7♠"; break; case 20: cout<<"7♡"; break; case 33: cout<<"7♣"; break; case 46: cout<<"7◇"; break;
case 8: cout<<"8♠"; break; case 21: cout<<"8♡"; break; case 34: cout<<"8♣"; break; case 47: cout<<"8◇"; break;
case 9: cout<<"9♠"; break; case 22: cout<<"9♡"; break; case 35: cout<<"9♣"; break; case 48: cout<<"9◇"; break;
case 10: cout<<"10♠"; break; case 23: cout<<"10♡"; break; case 36: cout<<"10♣"; break; case 49: cout<<"10◇"; break;
case 11: cout<<"J♠"; break; case 24: cout<<"J♡"; break; case 37: cout<<"J♣"; break; case 50: cout<<"J◇"; break;
case 12: cout<<"Q♠"; break; case 25: cout<<"Q♡"; break; case 38: cout<<"Q♣"; break; case 51: cout<<"Q◇"; break;
case 13: cout<<"K♠"; break; case 26: cout<<"K♡"; break; case 39: cout<<"K♣"; break; case 52: cout<<"K◇"; break;
default: break;//카드덱 출력.
}
}
int main(void)
{
Rnd obj;
BlackJack user,com;
int i,j,k,l; //반복 통제
int usercount,comcount,Acount=0,temp; //반복 통제 및 카드 장수확인 A카드는 별도 확인
int usersum=0,comsum=0;
char answer; //유저카드 추가 확인 변수
int play; //실행할 횟수
cout<<"몇번 실행 하시겠습니까?";
cin>>play;
for(l=0;l<play;l++)
{
usercount=2;
comcount=2;
//유저의 카드 받기
do{
user.SetCard(0,obj.getRNumber());
user.SetCard(1,obj.getRNumber());
}while(user.GetCard(0)==user.GetCard(1));
usersum = user.switching(user.GetCard(0))+user.switching(user.GetCard(1));
//a카운트.
if(user.GetCard(0)==1||user.GetCard(0)==14||user.GetCard(0)==27||user.GetCard(0)==40)
{
Acount++;
}
if(user.GetCard(1)==1||user.GetCard(1)==14||user.GetCard(1)==27||user.GetCard(1)==40)
{
Acount++;
}
for(i=1;i<usercount;i++)
{
cout<<"Player Card :";
for(j=0;j<usercount;j++)
{
cout<<" ";
Deck(user.GetCard(j));
}
cout<<endl;
cout<<"한장 더 받으시겠습니까?(y/n)";
cin>>answer;
if(answer=='y')
{
usercount++;//usercount값을 증가시켜 반복횟수 1회 증가
if(usercount==8)
{
cout<<"더이상 받을수 없습니다."<<endl;
break;
}
else
{
user.SetCard(j,obj.getRNumber());
}
for(k=j;k>=0;k--)
{
if(user.GetCard(j)==user.GetCard(k-1))//겹치는 경우를 모두 조사
{
user.SetCard(j,obj.getRNumber());
k=j+1;//겹치는 경우가 생겨 다시 뽑았을때 초기화시켜 처음부터 겹치는 경우 조사
}
}
//새로 뽑은 카드에 대한 A 카운트
if(user.GetCard(j)==1||user.GetCard(j)==14||user.GetCard(j)==27||user.GetCard(j)==40)
{
Acount++;
}
usersum += user.switching(user.GetCard(j));
//21넘엇을때 A가 있는지 조사하여 A가 있을경우 10을 빼준다.
if(usersum>21)
{
usersum =0;
temp = Acount;
for(j=0;j<usercount;j++)
{
usersum += user.switching(user.GetCard(j));
}
do{
if(temp!=0)
{
usersum -= 10;
}
temp--;
}while(temp>0&&usersum>21);
}
if(usersum>21)
{
cout<<"21을 넘었습니다."<<endl;
cout<<"Player Card :";
for(j=0;j<usercount;j++)
{
cout<<" ";
Deck(user.GetCard(j));//카드덱 출력
}
cout<<endl;
break;
}
}
else
{
break;
}
}
//컴퓨터 카드 받기 (유저가 받는 방식 그대로 사용.)
do{
com.SetCard(0,obj.getRNumber());
com.SetCard(1,obj.getRNumber());
}while(com.GetCard(0)==com.GetCard(1));
comsum = com.switching(com.GetCard(0))+com.switching(com.GetCard(1));
//a카운트.
if(com.GetCard(0)==1||com.GetCard(0)==14||com.GetCard(0)==27||com.GetCard(0)==40)
{
Acount++;
}
if(com.GetCard(1)==1||com.GetCard(1)==14||com.GetCard(1)==27||com.GetCard(1)==40)
{
Acount++;
}
for(i=1;i<comcount;i++)
{
cout<<"Dealer Card :";
for(j=0;j<comcount;j++)
{
cout<<" ";
Deck(com.GetCard(j));
}
cout<<endl;
if(comsum<=14)
{
comcount++;
if(comcount==8)
{
break;
}
else
{
com.SetCard(j,obj.getRNumber());
}
for(k=j;k>=0;k--)
{
if(com.GetCard(j)==com.GetCard(k-1))
{
com.SetCard(j,obj.getRNumber());
k=j+1;//겹치는 경우가 생겨 다시 뽑았을때 초기화시켜 처음부터 겹치는 경우 조사
}
}
//새로 뽑은 카드에 대한 A 카운트
if(com.GetCard(j)==1||com.GetCard(j)==14||com.GetCard(j)==27||com.GetCard(j)==40)
{
Acount++;
}
comsum += com.switching(com.GetCard(j));
//21넘엇을때 A가 있는지 조사하여 A가 있을경우 10을 빼준다.
if(comsum>21)
{
comsum =0;
temp = Acount;
for(j=0;j<comcount;j++)
{
comsum += com.switching(com.GetCard(j));
}
do{
if(temp!=0)
{
comsum -= 10;
}
temp--;
}while(temp>0&&comsum>21);
}
if(comsum>21)
{
cout<<"Dealer Card :";
for(j=0;j<comcount;j++)
{
cout<<" ";
Deck(com.GetCard(j));
}
cout<<endl;
break;
}
}
else
{
break;
}
}
cout<<"\nPlayer "<<usersum<<" Dealer : "<<comsum<<"\n\n";
//둘다 카드 받음 비교 후 출력
if((usersum<=21&&comsum>21)||(usersum<=21&&comsum<=21&&usersum>comsum))
{
cout<<"You Win"<<endl;
cout<<"Player ";
user.GetMoney();
cout<<"Dealer ";
com.LoseMoney();
user.rate(1);
}
else if(usersum==comsum||(usersum>21&&comsum>21))
{
cout<<"Draw"<<endl;
cout<<"Player ";
user.ShowMoney();
cout<<"Dealer ";
com.ShowMoney();
user.rate(2);
}
else
{
cout<<"You Lose"<<endl;
cout<<"Player ";
user.LoseMoney();
cout<<"Dealer ";
com.GetMoney();
user.rate(3);
}
}
//승패 결과 출력
user.Result();
return 0;
}
C++로 만들어본 블랙잭 게임 입니다. 이 과제를 할때 제 기억상 이걸 만들때 조금 강제적으로 class를 사용한 기억이 있네요.
컴퓨터는 14가 넘지 않을때 카드를 한장 더 받는걸로 프로그래밍 해놨습니다.
======================================
혹시 설명중에 틀린게 있다면 댓글에 남겨주세요~ 최대한 수정해서 올바른 글을 쓰도록 노력하겠습니다.
공감한번 꾹 눌러주세요~ 혹시라도 필요한 과제가 있으면 댓글에 써주세요. 할 수 있는 선에서 올려드리겠습니다.
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 여러가지 정렬과 검색 (0) | 2019.01.03 |
---|