package com.abl.PlayingCards; import java.util.*; //Vector and Random //DeckOfCards: /** the container responsible for keeping track of the Cards @version 11/29/2000 @author I made this. -- prie, 5/8/99 */ final public class DeckOfCards { private Vector deck = null; private int numberOfCards = 0; private int numberDrawn = 0; private Random rng = null; //pseudo-random-number generator (for shuffling) public DeckOfCards(CardLabels cardLabels) { deck = cardLabels.makeCards(); numberOfCards = deck.size(); numberDrawn = 0; } public int size() { return numberOfCards; } public void restart() { numberDrawn = 0; } public void stack(long rngSeed, int shuffles) { //arrange the deck in a random yet repeatable way rng = new Random(rngSeed); //specify seed to make pseudo-random-number generator's ordering repeatable for (int n = 0; n < shuffles; n++) this.shuffle(); } public void shuffle() { //after Core Java example if (rng == null) rng = new Random(); //create generic pseudo-random-number generator for (int next = 0; next < numberOfCards-1; next++) { int r = this.randomInteger(next, numberOfCards - 1); Object swap = deck.elementAt(next); deck.setElementAt(deck.elementAt(r), next); deck.setElementAt(swap, r); } } public Card draw() { if (numberDrawn > (numberOfCards - 1) ) return null; else return (Card)deck.elementAt(numberDrawn++); } public Card draw(int number) { if (number > (numberOfCards - 1) ) return null; else return (Card)deck.elementAt(number); } public int positionOf(Card card) { return deck.indexOf(card); } public void swapCards(Card card, int withNext) { int firstIndex = deck.indexOf(card); int otherIndex = firstIndex + withNext; if (otherIndex > (numberOfCards - 1) ) otherIndex -= numberOfCards; deck.setElementAt(deck.elementAt(otherIndex), firstIndex); deck.setElementAt(card, otherIndex); } public void countCut() { //cut deck at position equal to rank of bottom card Card bottom = (Card)deck.elementAt(numberOfCards - 1); int position = bottom.getRank(); Vector temp = new Vector(numberOfCards); //create a new deck from the segments of the old for (int i = position; i < numberOfCards-1; i++) temp.addElement( deck.elementAt(i) ); for (int i = 0; i < position; i++) temp.addElement( deck.elementAt(i) ); temp.addElement( deck.elementAt(numberOfCards-1) ); //leave last card in place for "reversibility" deck = temp; } public void tripleCut(int low, int high) { //swap cards on "outside" of low and high Vector temp = new Vector(numberOfCards); //create a new deck from the segments of the old for (int i = high+1; i < numberOfCards; i++) temp.addElement( deck.elementAt(i) ); for (int i = low; i <= high; i++) temp.addElement( deck.elementAt(i) ); for (int i = 0; i < low; i++) temp.addElement( deck.elementAt(i) ); deck = temp; } private int randomInteger(int low, int high) { int r = low + (int)( (high - low + 1) * rng.nextFloat() ); if (r > high) r = high; return r; } }