프로그래밍/C++

[C++] 블랙잭 게임 만들기.

RYMIN 2019. 1. 3. 16:23
/************************************

카드덱을 컴퓨터와 사용자가 따로 사용 한다고 가정한다.

************************************/

#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