#include<iostream>
#include<time.h>
#include<cstdlib>
#include<cstdio>
using namespace std;
enum CardSuit{CLUBS=1,DIAMONDS,HEARTS,SPADES};
enum CardRank{ONE=1,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,
QUEEN,KING,ACE};
class PlayingCard{
private:
CardSuit suit;
CardRank rank;
public:
PlayingCard(){
suit=CLUBS;
rank=ONE;
}
PlayingCard(CardSuit s,CardRank r){
suit=s;
rank=r;
}
void get_input(){
int choice=0;
do{
cout<<CLUBS<<". CLUBS"<<endl;
cout<<DIAMONDS<<". DIAMONDS"<<endl;
cout<<HEARTS<<". HEARTS"<<endl;
cout<<SPADES<<". SPADES"<<endl;
cout<<"Enter the suit of the card:("<<CLUBS<<"-"<<SPADES<<")";
cin>>choice;
switch(choice){
case CLUBS:suit=CLUBS;
break;
case DIAMONDS:suit=DIAMONDS;
break;
case SPADES:suit=SPADES;
break;
case HEARTS:suit=HEARTS;
break;
default:cout<<"Incorrect choice!"<<endl;
}
}while(choice>SPADES||choice<CLUBS);
do{
cout<<ONE<<". ONE"<<endl;
cout<<TWO<<". TWO"<<endl;
cout<<THREE<<". THREE"<<endl;
cout<<FOUR<<". FOUR"<<endl;
cout<<FIVE<<". FIVE"<<endl;
cout<<SIX<<". SIX"<<endl;
cout<<SEVEN<<". SEVEN"<<endl;
cout<<EIGHT<<". EIGHT"<<endl;
cout<<NINE<<". NINE"<<endl;
cout<<TEN<<". TEN"<<endl;
cout<<JACK<<". JACK"<<endl;
cout<<QUEEN<<". QUEEN"<<endl;
cout<<KING<<". KING"<<endl;
cout<<ACE<<". ACE"<<endl;
cout<<"Enter the suit of the card:("<<ONE<<"-"<<ACE<<")";
cin>>choice;
switch(choice){
case ONE:rank=ONE;
break;
case TWO:rank=TWO;
break;
case THREE:rank=THREE;
break;
case FOUR:rank=FOUR;
break;
case FIVE:rank=FIVE;
break;
case SIX:rank=SIX;
break;
case SEVEN:rank=SEVEN;
break;
case EIGHT:rank=EIGHT;
break;
case NINE:rank=NINE;
break;
case JACK:rank=JACK;
break;
case QUEEN:rank=QUEEN;
break;
case KING:rank=KING;
break;
case ACE:rank=ACE;
break;
case TEN:rank=TEN;
break;
default:cout<<"Incorrect choice!"<<endl;
}
}while(choice>ACE||choice<ONE);
}
const CardRank get_rank(){
return rank;
}
const CardSuit get_suit(){
return suit;
}
void set_rank(CardRank r){
if(r>ACE||r<ONE){
cout<<"rank does not exist"<<endl;
return;
}
rank=r;
}
void set_suit(CardSuit s){
if(s>SPADES||s<CLUBS){
cout<<"suit does not exist"<<endl;
return;
}
suit=s;
}
void printCard(){
switch(rank){
case ONE:cout<<"ONE";
break;
case TWO:cout<<"TWO";
break;
case THREE:cout<<"THREE";
break;
case FOUR:cout<<"FOUR";
break;
case FIVE:cout<<"FIVE";
break;
case SIX:cout<<"SIX";
break;
case SEVEN:cout<<"SEVEN";
break;
case EIGHT:cout<<"EIGHT";
break;
case NINE:cout<<"NINE";
break;
case TEN:cout<<"TEN";
break;
case JACK:cout<<"JACK";
break;
case QUEEN:cout<<"QUEEN";
break;
case KING:cout<<"KING";
break;
case ACE:cout<<"ACE";
break;
}
cout<<" of ";
switch(suit){
case SPADES:cout<<"SPADES";
break;
case HEARTS:cout<<"HEARTS";
break;
case DIAMONDS:cout<<"DIAMONDS";
break;
case CLUBS:cout<<"CLUBS";
break;
}
cout<<endl;
}
};
void shuffle(PlayingCard deck[],const int num){
srand(time(NULL));
int n;
int chance;
n=rand()%15+3;
//cout<<"n ="<<n<<endl;
PlayingCard d1[num],d2[num];
int d1counter=0,d2counter=0;
for(int i=0;i<n;i++){
d1counter=0;
d2counter=0;
for(int j=0;j<num;j++){
chance=rand()%2;
if(chance)
d1[d1counter++]=deck[j];
else
d2[d2counter++]=deck[j];
}
//cout<<"Shuffling\n";
chance=rand()%2;
if(chance){
//cout<<"d1 first\n";
for(int j=0;j<d1counter;j++){
deck[j]=d1[j];
}
for(int j=0;j<d2counter;j++){
deck[d1counter+j]=d2[j];
}
}else{
//cout<<"d2 first\n";
for(int j=0;j<d2counter;j++){
deck[j]=d2[j];
}
for(int j=0;j<d1counter;j++){
deck[d2counter+j]=d1[j];
}
}
//cout<<"shuffled\n";
}
}
void printDeck(PlayingCard deck[],int size){
for(int i=0;i<size;i++){
deck[i].printCard();
}
}
int main(){
PlayingCard deck[52];
PlayingCard player[4][13];
char ch;
int hand;
CardSuit s;
CardRank r;
int x;
for(int i=0;i<52;i++){
x=(i/13)+1;
s=(CardSuit)x;
x=(i%13)+2;
r=(CardRank)x;
deck[i].set_suit(s);
deck[i].set_rank(r);
}
cout<<"Original Deck:"<<endl;
printDeck(deck,52);
cout<<"Press enter to shuffle:";
ch=getchar();
shuffle(deck,52);
cout<<"Deck after shuffling:"<<endl;
printDeck(deck,52);
cout<<"How many cards in one hand?(1-13):";
cin>>hand;
for(int i=0;i<4;i++){
cout<<"\n\nPlayer "<<i+1<<"'s hand:"<<endl;
for(int j=0;j<hand;j++){
player[i][j]=deck[i*hand+j];
player[i][j].printCard();
}
}
cout<<"Press Enter to Exit"<<endl;
ch=getchar();
ch=getchar();
return 0;
}