Skip to main content
GameDev.net gamedev.net

PRO Tired of ads? Read GameDev.net ad-free and help keep the community independent with GameDev Pro — $3/month.

More on twenty-one

More on twenty-one

mozie
Not your journal. · · 4 min read
1,088 1
Building this deck of cards is pretty fun. I have what I consider to be a pretty good foundation thus far. I spent some time today playing with what I wanted to do to my code. I do not have a compiler with me at work, so I always have errors when I get home and try to build. I always rely on the compiler to remember the syntax of things I am new to. What that means is I spent most of the evening fixing my code to work, and now it works. The thing I like the most, is the Deck::operator/ that I added. It takes the current deck and returns a vector(n). I had to fix alot of the crap I had in my other operators, I wasn't using them so they didn't get tested. Until tonight, and they didn't work correctly. I know you dont like it when I talk alot, so here are the goodies.

deck.h
#ifndef _DECK_H_#define _DECK_H_#include "card.h"using namespace std;class	Deck{public:	unsigned int numCards;	vector Cards;	Deck() { numCards = 0; }	Deck(int ds) 	{		numCards = ds;		Cards.resize(numCards);	}	Deck(const Deck & d)	{		Cards = d.Cards;		numCards = d.numCards;	}	~Deck() {};	bool	Generate(unsigned int n);	void	Display();	void	Shuffle();	Card	TakeBottom();	Card	TakeTop();	void	AddTop(const Card & c)	{		++numCards;		vector::iterator e = Cards.end();		Cards.insert(e,c);	}	void	AddBottom(const Card & c)	{		++numCards;		vector::iterator b = Cards.begin();		Cards.insert(b,c);	}	void	ShiftUp()	{		Card C = TakeBottom();		AddTop(C);	}	void	ShiftDown()	{		Card C = TakeTop();		AddBottom(C);	}	const Deck	operator<<  ( unsigned int n )	{		for(unsigned int i = 0;i < n; ++i)			ShiftUp();		return *this;	}	const Deck	operator>>  ( unsigned int n )	{		for(unsigned int i = 0;i < n; ++i)			ShiftDown();		return *this;	}	/*==============================		equality operator, copy	==============================*/	const Deck	operator= ( const Deck & a)	{		Cards = a.Cards;		numCards = a.numCards;		return *this;	}	/*==============================		adds deck 'a' to the end of 'this' deck	==============================*/	const Deck	operator+ ( const Deck & a)	{		vector::const_iterator b = a.Cards.begin();		vector::const_iterator e = a.Cards.end();		for(;b != e; ++b)		{			AddTop(*b);		}		return *this;	}	const Deck	operator+= ( const Deck & a)	{		vector::const_iterator b = a.Cards.begin();		vector::const_iterator e = a.Cards.end();		for(;b != e; ++b)		{			AddTop(*b);		}		return *this;	}	const Deck	operator+ ( const Card & a )	{		AddTop(a);		return *this;	}	vector	operator/ ( unsigned int n )	{		vector d (n);		if( n % 2 )			return d;		if( n > Cards.size() )			return d;		unsigned int i=0,j=0,s=(unsigned int)(Cards.size() / n);		for(; i < n; ++i)		{			for(j=0; j < s; ++j)				d.AddBottom(TakeTop());		}		return d;	}};// Display Suit and Valuevoid	DisplaySV(unsigned char sample);#endif


deck.cpp
#include "stdafx.h"#include "deck.h"using namespace std;void	DisplaySV(unsigned char sample){	unsigned char sh = sample & 0xF0;	unsigned char sl = sample & 0x0F;	switch(sh)	{	case S_SPADE:		cout << "S";		break;	case S_DIMON:		cout << "D";		break;	case S_CLUBS:		cout << "C";		break;	case S_HEART:		cout << "H";		break;	default:		break;	}	switch(sl)	{	case 0x01:		cout << "A";		break;	case 0x0B:		cout << "J";		break;	case 0x0C:		cout << "Q";		break;	case 0x0D:		cout << "K";		break;	default:		cout << (int)sl;		break;	}	cout << " ";}bool	Deck::Generate(unsigned int n){	if( (n > 1) && (n % 2) )		return false;	Cards.resize( n * 52 );	vector::iterator b = Cards.begin();	unsigned char suitn = 0x10;	for(unsigned int a=0;a < (n * 4);++a)	{		for(unsigned char i=1;i<0x0E;++i)		{			b->value = (unsigned char)(suitn + i);			++b;		}		suitn = suitn << 1;		if(!(suitn & 0xF0))			suitn = 0x10;	}	numCards = 52 * n;	return true;}void	Deck::Display(){	vector::iterator B = Cards.begin();	vector::iterator E = Cards.end();	for(;B != E; ++B)		DisplaySV(B->value);}void	Deck::Shuffle(){	unsigned int sz = numCards;	vector D;	srand((unsigned)time(NULL));	unsigned int ra = 5 + (rand() % 3);	unsigned int rn;	Display(); cout << endl;	for(unsigned int h = 0;h < ra; ++h)	{		*this = *this << (1 + (rand() % (sz/4)));		D = *this / 2;		D[0].Display(); cout << endl;		D[1].Display(); cout << endl;		for(unsigned int i = 0; i < sz ;)		{				rn = 1 + (rand() % 3);			for(unsigned int j=0;(j < rn && i < sz);++j)			{				unsigned int tmpD = D[0].numCards;				if(tmpD > 0)				{					Card C = D[0].TakeBottom();					AddTop(C);					++i;				}			}			rn = 1 + (rand() % 3);			for(unsigned int k=0;(k < rn && i < sz);++k)			{				unsigned int tmpD = D[1].numCards;				if(tmpD > 0)				{					Card C = D[1].TakeBottom();					AddTop(C);					++i;				}			}		}	}	Display(); cout << endl;}Card	Deck::TakeBottom(){	Card c;	vector::iterator i = Cards.begin();	c = *i;	Cards.erase(i,i + 1);	--numCards;	return c;}Card	Deck::TakeTop(){	Card c;	vector::iterator i = Cards.end() - 1;	c = *i;	Cards.erase(i,i + 1);	--numCards;	return c;}


Even poof I can use it!

Quote:

Dealer: S6 S7 Points: 13
layer: S4 D3 Points: 7
Dealer takes a card..
S6 S7 H2 Points: 15
Dealer takes a card..
S6 S7 H2 SJ Points: 25
layer wins
layer Funds: 290
Press any key to continue . . .

I broke the player name somehow, and I still have not looked into it.

Discussion

Loading comments...