#include #include "deck.h" #include "dealer.h" #include #include const int NumberOfCards = 52; Deck *Deck::my_deck = 0; Deck::Deck( Dealer* parent, int m, int s ) : Pile( 0, parent ), mult( m ) { _deck = new Card * [mult*NumberOfCards]; TQ_CHECK_PTR (_deck); // only allow 1, 2, or 4 suits if ( s == 1 || s == 2 ) suits = s; else suits = 4; makedeck(); addToDeck(); shuffle(); setAddFlags(Pile::disallow); setRemoveFlags(Pile::disallow); } Deck::~Deck() { for (uint i=0; i < mult*NumberOfCards; i++) { delete _deck[i]; } m_cards.clear(); delete [] _deck; } // ---------------------------------------------------------------- Deck *Deck::new_deck( Dealer *parent, int m, int s ) { my_deck = new Deck(parent, m, s); return my_deck; } void Deck::makedeck() { int i=0; show(); for ( uint m = 0; m < mult; m++) { for ( int r = Card::Ace; r <= Card::King; r++) { for ( int s = Card::Spades-1; s >= Card::Clubs-1 ; s--) { _deck[i] = new Card(static_cast(r), static_cast(Card::Spades - (s % suits)), dealer()->canvas()); _deck[i]->move(x(), y()); i++; } } } } void Deck::collectAndShuffle() { addToDeck(); shuffle(); } Card* Deck::nextCard() { CardList::Iterator c; c = m_cards.fromLast(); // Dealing from bottom of deck .... if ( c != m_cards.end() ) { return *c; } else return 0; } // ---------------------------------------------------------------- static long pseudoRandomSeed = 0; static void pseudoRandom_srand(long seed) { pseudoRandomSeed=seed; } // Documented as in // http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q28150 // static long pseudoRandom_random() { pseudoRandomSeed = 214013*pseudoRandomSeed+2531011; return (pseudoRandomSeed >> 16) & 0x7fff; } // Shuffle deck, assuming all cards are in m_cards void Deck::shuffle() { assert(m_cards.count() == uint(mult*NumberOfCards)); assert(dealer()->gameNumber() >= 0); pseudoRandom_srand(dealer()->gameNumber()); kdDebug(11111) << "first card " << m_cards[0]->name() << " " << dealer()->gameNumber() << endl; Card* t; long z; int left = mult*NumberOfCards; for (uint i = 0; i < mult*NumberOfCards; i++) { z = pseudoRandom_random() % left; t = m_cards[z]; m_cards[z] = m_cards[left-1]; m_cards[left-1] = t; left--; } } // add cards in deck[] to Deck // FIXME: Rename to collectCards() void Deck::addToDeck() { clear(); for (uint i = 0; i < mult*NumberOfCards; i++) { _deck[i]->setTakenDown(false); add( _deck[i], true, false ); } }