Video Poker By Mark
<< Josh's Tug of Word | OldProjectsTrailIndex | Find the Box by Nick >>
VideoPoker.java
import java.applet.Applet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class VideoPoker extends Applet implements MouseListener { private PokerHand hand; private Deck deck; private Card[] cards; private Rectangle[] cardLoc; private Rectangle dealBox; private Rectangle Bet50Box; private Rectangle Bet25Box; public static final int WIDTH = 800, HEIGHT = 600; String message; private Image imgBuffer; private Graphics gBuffer; private int payoutAmount; private int bet=25; private int bank = 500; private int moneyWon=-1; private int betAdded; private boolean newHand = true; public void bet() { bet=betAdded+bet; if(bank>=bet) ; else bet=bank; bank = bank - bet; } public void newDeal() { deck = new Deck(); for (int i = 0; i < 5; i++) { cards[i] = deck.deal(); cards[i].turnUp(); } hand = new PokerHand(cards); } public void init() { imgBuffer = createImage(WIDTH, HEIGHT); gBuffer = imgBuffer.getGraphics(); message = "Video Poker"; deck = new Deck(); cards = new Card[5]; cardLoc = new Rectangle[5]; for (int i = 0; i < 5; i++) { cardLoc[i] = new Rectangle(20 + i * 70, 80, 60, 80); } newDeal(); dealBox = new Rectangle(120, 175, 120, 30); Bet50Box= new Rectangle(300,175,180,30); Bet25Box= new Rectangle(500,175,180,30); this.addMouseListener(this); repaint(); } public void paint(Graphics g) { gBuffer.setColor(Color.BLACK); gBuffer.fillRect(0, 0, WIDTH, HEIGHT); gBuffer.setColor(Color.WHITE); gBuffer.setFont(new Font("Helvetica", Font.BOLD, 12)); gBuffer.drawString(message, 20, 20); gBuffer.drawString(hand.display(), 20, 40); gBuffer.drawString(hand.getInfo(), 20, 60); gBuffer.drawString("Your current bet is: " + bet, 400, 20); gBuffer.drawString("You have " + bank + " dollars left", 200, 20); if(moneyWon>0) gBuffer.drawString("You won " + moneyWon + " dollars!", 200, 50); if(moneyWon==0) gBuffer.drawString("You LOSE!", 200, 50); for (int i = 0; i < 5; i++) cards[i].draw((Graphics2D) gBuffer, cardLoc[i]); gBuffer.setColor(Color.WHITE); gBuffer.fillRect(dealBox.x, dealBox.y, dealBox.width, dealBox.height); gBuffer.fillRect(Bet50Box.x, Bet50Box.y, Bet50Box.width, Bet50Box.height); gBuffer.fillRect(Bet25Box.x, Bet25Box.y, Bet25Box.width, Bet25Box.height); gBuffer.setColor(Color.BLACK); gBuffer.setFont(new Font("Script MT Bold", Font.BOLD, 30)); gBuffer.drawString("Deal", dealBox.x + 20, dealBox.y + 20); gBuffer.drawString("Bet 50", Bet50Box.x + 20, Bet50Box.y + 20); gBuffer.drawString("Bet 25", Bet25Box.x + 20, Bet25Box.y + 20); g.drawImage(imgBuffer, 0, 0, this); } public void update(Graphics g) { paint(g); } @Override public void mouseClicked(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { int x = e.getX(); int y = e.getY(); if (Bet25Box.contains(x, y)&&bank>25){ bet=25; } if (Bet50Box.contains(x, y)&& bank>50){ bet=50; } if (newHand) { bet(); newDeal(); newHand=false; } else{ for (int i = 0; i < 5; i++) { if (cardLoc[i].contains(x, y)) { cards[i].turnOver(); } } if (dealBox.contains(x, y)) { for (int i = 0; i < 5; i++) { if (!cards[i].isFaceUp()) { cards[i] = deck.deal(); cards[i].turnUp(); } } // user wants new cards... hand = new PokerHand(cards); payout(); betAdded=0; newHand = true; } } repaint(); } public void payout() { int mult = (int) hand.computeScore(); moneyWon=mult*bet; bank = bank +moneyWon; } }
PokerHand.java
package poker; import java.util.ArrayList; /** * PokerHand evaluates poker hands. * it requires the Card class. * * @author Chris Thiel, OFMCap * @version 28 Nov 2009 */ public class PokerHand { private Card[] hand; private Card highCard; private double score; /** * Constants * */ final String[] r={"High Card","One Pair", "Two Pair", "Three of a Kind","Straight", "Flush", "Full House", "Four of a Kind", "Straight Flush", "Royal Flush"}; /** * Constructors */ public PokerHand(Card c1, Card c2, Card c3, Card c4, Card c5) { hand = new Card[5]; hand[0]=c1; hand[1]=c2; hand[2]=c3; hand[3]=c4; hand[4]=c5; highCard=hand[0]; for (int i=1; i<5;i++) if (highCard.isLessThanAceHigh(hand[i])) highCard=hand[i]; sortAceHigh(); score=computeScore(); } public PokerHand(ArrayList<Card> list) { hand = new Card[5]; highCard=list.get(0); for (int i=0;i<5;i++) { hand[i]=list.get(i); if (highCard.isLessThanAceHigh(hand[i]) ) highCard=hand[i]; } sortAceHigh(); score=computeScore(); } public PokerHand(Card[] h) { hand = new Card[5]; highCard=h[0]; for (int i=0;i<5;i++) { hand[i]=h[i]; if (highCard.isLessThanAceHigh(hand[i]) ) highCard=hand[i]; } sortAceHigh(); score=computeScore(); } /** * Accessor method that returns the high card * (Ace is considered the highest card, * suit is ignored) * @return the highest card of the hand */ public Card getHighCard() { return highCard; } public double getScore() { return score; } public String toString() { String result=""; for(Card c:hand) result+=c.toString()+"\n"; return result; } /** * mutator method that will arrage the hand in * descending order, Ace high */ public void sortAceHigh() { for (int i=0;i<4;i++) { for(int j=i;j<5;j++) if (hand[i].isLessThanAceHigh(hand[j]) ) { Card h=hand[j]; hand[j]=hand[i]; hand[i]=h; } } } /** * mutator method that will arrange the hand in * descending order, Ace low * */ public void sortAceLow() { for (int i=0;i<4;i++) { for(int j=i;j<5;j++) if (hand[i].isLessThan(hand[j]) ) { Card h=hand[j]; hand[j]=hand[i]; hand[i]=h; } } } public boolean hasPair() { int i=0; while (i<4) { if (hand[i].comparePips(hand[i+1])==0 ) return true; i++; } return false; } public boolean hasTwoPair() { int i=0; int pairCount=0; while(i<4) { if(hand[i].comparePips(hand[i+1])==0){ pairCount++; i=i++; } i++; } if (pairCount>1) return true; return false; } public boolean hasThreeOfAKind() { int i=0; while (i<3) { if(hand[i].comparePips(hand[i+1])+hand[i+1].comparePips(hand[i+2])==0) return true; i++; } return false; } public boolean hasFourOfAKind() { int left = hand[0].comparePips(hand[1])+ hand[1].comparePips(hand[2])+ hand[2].comparePips(hand[3]); int right= hand[1].comparePips(hand[2])+ hand[2].comparePips(hand[3])+ hand[3].comparePips(hand[4]); if (left==0 || right==0) return true; return false; } public boolean hasFlush() { int i=0; while(i<4) { if(hand[i].getSuit()!=hand[i+1].getSuit() ) return false; i++; } return true; } public boolean hasStraight() { boolean inOrder=true; sortAceLow(); for(int i=0;i<4;i++) if(hand[i].comparePips(hand[i+1])!=1) inOrder=false; if (inOrder) return true; sortAceHigh(); inOrder=true; for(int i=0;i<4;i++) if(hand[i].comparePipsAceHigh(hand[i+1])!=1) inOrder=false; return inOrder; } public boolean hasStraightFlush() { if (hasFlush()&&hasStraight()) return true; return false; } public boolean hasRoyalFlush() { if (hasStraightFlush()&& hand[0].getPipsAceHigh()==14) return true; return false; } public boolean hasFullHouse() { if(hasThreeOfAKind() ){ if (hand[2].equals(hand[4]) && hand[0].equals(hand[1]) ) return true; if (hand[2].equals(hand[0]) && hand[3].equals(hand[4]) ) return true; } return false; } public int highCardBonus(ArrayList<Card> c) { int s=0; int n=c.size(); for (int j=0;j<n;j++) s=100*s+c.get(j).getPipsAceHigh(); return s; } /** * sets score to determine the strength of the hand * precondition: hand is sorted in descending order */ public double computeScore() { double score=0; if (hasPair()){ int pairValue=0; ArrayList<Card> c=new ArrayList<Card>(); for (int j=0;j<5;j++) c.add(hand[j]); for (int j=0;j<4;j++) if (hand[j].equals(hand[j+1])){ c.remove(hand[j]); c.remove(hand[j+1]); pairValue=hand[j].getPipsAceHigh(); } score=1+pairValue/100.0+highCardBonus(c)/100000000.0; } if (hasTwoPair()){ int pair1=0; int pair2=0; ArrayList<Card> c=new ArrayList<Card>(); for (int j=0;j<5;j++) c.add(hand[j]); for (int j=0;j<4;j++) if (hand[j].equals(hand[j+1])){ c.remove(hand[j]); c.remove(hand[j+1]); if(pair1==0) pair1=hand[j].getPipsAceHigh(); else pair2=hand[j].getPipsAceHigh(); } score=2+pair1/100.0+pair2/10000.0+highCardBonus(c)/1000000.0; } if (hasThreeOfAKind()) {//could be in 3 different positions int p3=hand[2].getPipsAceHigh(); int p1a=hand[3].getPipsAceHigh();//presume 3k high int p1b=hand[4].getPipsAceHigh(); if (p3==hand[4].getPipsAceHigh()){//3 K is low rank p1a=hand[0].getPipsAceHigh(); p1b=hand[1].getPipsAceHigh(); } else if (hand[1].getPipsAceHigh()==hand[3].getPipsAceHigh()){// 3K in middle p1a=hand[0].getPipsAceHigh(); p1b=hand[4].getPipsAceHigh(); } score=3+p3/100.00+p1a/10000.0+p1b/1000000.0; } if (hasStraight()) score=4+highCard.getPipsAceHigh()/100.0; if (hasFlush()) { int bonus=0; for(int j=0;j<5;j++) bonus=100*bonus+hand[j].getPipsAceHigh(); score=5+bonus/10000000000.0; } if (hasFullHouse()){ int p3=hand[2].getPipsAceHigh(); int p2=hand[4].getPipsAceHigh(); if (p3==p2) p2=hand[0].getPipsAceHigh(); score=6+p3/100.0+p2/10000.0; } if (hasFourOfAKind()){ int p4=hand[2].getPipsAceHigh(); int p1=hand[4].getPipsAceHigh(); if (p4==p1) p1=hand[0].getPipsAceHigh(); score=7+p4/100.0+p1/10000.0; } if (hasStraightFlush()){ score=8+highCard.getPipsAceHigh()/100.0; } if (hasRoyalFlush()) score=9; if (score<1.0){ int bonus=0; for(int j=0;j<5;j++) bonus=100*bonus+hand[j].getPipsAceHigh(); score=bonus/10000000000.0; } return score; } /** * compares One Poker hand to another, * taking into account total pips. * If positive, this hand is greater * than the other. */ public double compareTo(PokerHand other) { return score - other.getScore(); } public String display(){ String result=""; for (int i=0;i<5;i++) result+=hand[i].info()+" "; return result; } public String getInfo() { int rank=(int)score; return r[rank]; } }
Deck.java
package poker; import java.util.ArrayList; /** * * @author Chris Thiel, OFMCap * @version 16 May 2012 */ public class Deck { private ArrayList<Card> deck; public Deck(){ deck=new ArrayList<Card>(); for (int s=0;s<4;s++) for(int p=1;p<=13;p++) deck.add(new Card(p,s)); shuffle(); } public void shuffle(){ for (int i=0; i<400;i++){ int a=(int)(deck.size()*Math.random()); int b=(int)((deck.size()-1)*Math.random()); Card temp=deck.get(a); deck.remove(temp); deck.add(b, temp); } } public Card deal(){ Card result=deck.get(0); deck.remove(0); return result; } }
Card.java
package poker; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JApplet; import java.awt.*; /** * class Card here represents a playing card * * @author Chris Thiel * @version 28 Sept 2008 */ public class Card { //some handy constants public static final int SPADES=3; public static final int HEARTS=2; public static final int DIAMONDS=1; public static final int CLUBS=0; /** * suitName is an array contains the name of the Suit * so that the index matches the suit number */ public static final String[] suitName={"Clubs","Diamonds","Hearts","Spades" }; /** * suitSymbol Have the unicode values to print the correct symbol, * arranges so thet the index matches the suit number */ public static final String[] suitSymbol={"\u2663", "\u2666","\u2665","\u2660"}; /** * pipName is an array that contains the name of the card's pips * so that the index matches the number of the card. * For example pipName[1] has a "Ace" */ public static final String[] pipName={"-","Ace","2","3","4","5","6","7","8","9","10", "Jack","Queen","King"}; // instance variables - or Card Attributes /** * suit contains the suit (0 to 3) */ private int suit; /** * pips contains the number of pips of the card (1-13) * Ace is 1 and 13 is King */ private int pips; /** * faceUp is true is the card is exposed * and false otherwise. */ private boolean faceUp; /** * Default Constructor for objects of class Card * is a random card of a random suit */ public Card() { // The default card is randomly chosen suit = (int)(Math.random()*4); pips = 1+(int)(Math.random()*13); faceUp=false; } /** * A Card can be constructed with a determined * number of pips (and integer 1-13) * and suit (an integer from 0-3) */ public Card(int p, int s) { if (s>=0 && s<4) suit = s; if (p>0 && p<14) pips = p; faceUp=false; } /** * A Card can be constructed with a determined * number of pips (a String "Ace" to "King") * and suit (a String "Clubs" to "Spades") */ public Card(String p, String s) { suit = indexOf(suitName, s); pips = indexOf(pipName, p); faceUp=false; } /** * indexOf returns the index of the String s * in the String Array a * (it returns -1 if not found). This method * ignores case. */ public int indexOf(String[] a, String s) { int idx=-1; for (int i=0; i< a.length; i++) if (a[i].toLowerCase().equals(s.toLowerCase())) idx=i; return idx; } /** * @return getSuit returns the Card's suit, * an int from 0 to 3 */ public int getSuit() { return suit; } /** * setSuit changes the Card's suit, * @param the suit 0 to 3. You can use the * predefined integer constants * SPADES, HEARTS, DIAMONDS and CLUBS * from the Card class. */ public void setSuit(int s) { if (s>=0 && s<4) suit=s; } /** * @return getPips returns the Card's pips, * an int from 1 to 13 where an Ace is a 1 * and a King is a 13. */ public int getPips() { return pips; } public int getPipsAceHigh() { if (pips==1) return 14; return pips; } /** * setPips changes the Card's pips, * @param the pips are an integer from 1 to 13, * where 1 is an Ace and 13 is a King. */ public void setPips(int p) { // put your code here if (p>0 && p<14) pips=p; } /** * @return getSuit returns the Card's suit, * an int from 0 to 3 */ public int getValue() { if (pips>9) return 10; return pips; } /** * Two cards are equal if they have * the same number of pips. The suit is ignored * with this comparison * * @return true if they match the number of pips */ public boolean equals(Card c) { if (c.getPips()==pips) return true; return false; } /** * toString will return the contents of the card * in a string format * @return The pips and suit of a card */ public String toString() { return pipName[pips]+" of "+suitName[suit]; } /** * info will return the contents of the card * in a short two character string * @return The pips and suit of a card */ public String info() { if (pips==10) return pipName[pips].substring(0,2)+suitSymbol[suit]; return pipName[pips].substring(0,1)+suitSymbol[suit]; } /** * comparePips will return the difference between * two cards' number of pips. The suit is ignored * with this comparison. Here the ace is low. * If the two cards happen to have the same * number of pips, it returns the integer 0. * * If, for example, * card1 is a 2 of clubs and card2 is a 6 of spades, * then card1.comparePips(card2) returns -4, since * card1 has four less pips than card2. * * @return the difference between number of pips */ public int comparePips( Card c ) { return pips-c.getPips(); } /** * comparePipsAceHigh will return the difference between * two cards' number of pips, Ace High. The suit is ignored * with this comparison, but the Ace is above a King. * If the two cards happen to have the same * number of pips, it returns the integer 0. * * If, for example, * card1 is an ace of clubs and card2 is a queen of spades, * then card1.comparePips(card2) returns 2, since * card1 is two larger than card2. * * @return the difference between number of pips */ public int comparePipsAceHigh( Card c ) { // This needs to be be implemented int myPips=pips; int theirPips=c.getPips(); if (myPips==1) myPips=14; if (theirPips==1) theirPips=14; return myPips-theirPips; } /** * isLessThan will compare two cards by pips, and in case of * a match, will compare the suit. If the number * of pips match, then the higher suit is considered. * * The the order of the suits * (from high to low) is SPADES, HEARTS, DIAMONDS, CLUBS * * The Ace is low, and is considered to be below a 2. * * If the two cards happen to have the same * number of pips, it then compares the suit returns the integer 0. * * If, for example, * card1 is an ace of clubs and card2 is a 2 of spades, * then card1.comparePips(card2) returns true, since * card1 is less than card2. * * If card1 is a 6 of hearts and card2 is a 6 of clubs, * than card1.isLessThan(card2) returns false, * since hearts is greater than clubs * * @return the difference between number of pips */ public boolean isLessThan( Card c ) { if (pips>c.getPips()) return false; if (pips<c.getPips()) return true; //if we got this far, its the same number of pips if (suit <c.getSuit()) return true; // if we got this far, it must have same suit or more return false; } public boolean isLessThanAceHigh( Card c ) { int myPips=pips; int theirPips=c.getPips(); if (myPips==1) myPips=14; if (theirPips==1) theirPips=14; if (myPips>theirPips) return false; if (myPips<theirPips) return true; //if we got this far, its the same number of pips if (suit <c.getSuit()) return true; // if we got this far, it must have same suit or more return false; } public void turnUp(){ faceUp=true; } public void turnDown(){ faceUp=false; } public void turnOver(){ faceUp=!faceUp; } public boolean isFaceUp(){ return faceUp; } public void draw(Graphics g, int x, int y){ g.setColor(Color.WHITE); Rectangle loc=new Rectangle(x,y,60,80); if (faceUp){ g.setFont(new Font("Helvetica", Font.BOLD, 20)); g.setColor(Color.WHITE); g.fillRect(loc.x,loc.y,loc.width,loc.height); g.setColor(Color.BLACK); g.drawRect(loc.x,loc.y,loc.width,loc.height); if (suit>0 && suit<3) g.setColor(Color.RED); g.drawString(this.info(), loc.x+8,loc.y+23); } else { g.setColor(Color.BLUE); g.fillRect(loc.x,loc.y,loc.width,loc.height); g.setColor(Color.BLACK); g.drawRect(loc.x,loc.y,loc.width,loc.height); g.setColor(Color.WHITE); for (int i=2; i<25; i+=5) g.drawRoundRect(loc.x+i, loc.y+i, loc.width-i*2, loc.height-i*2, i, i); } } public void draw(Graphics2D g2, Rectangle loc){ g2.setColor(Color.WHITE); int letterSize=5*loc.width/12; if (faceUp){ g2.setFont(new Font("Helvetica", Font.BOLD, letterSize)); g2.setColor(Color.WHITE); g2.fill(loc); g2.setColor(Color.BLACK); g2.draw(loc); if (suit>0 && suit<3) g2.setColor(Color.RED); g2.drawString(this.info(), loc.x+8,loc.y+7*letterSize/6); } else { g2.setColor(Color.BLUE); g2.fill(loc); g2.setColor(Color.BLACK); g2.draw(loc); g2.setColor(Color.WHITE); for (int i=2; i<25; i+=5) g2.drawRoundRect(loc.x+i, loc.y+i, loc.width-i*2, loc.height-i*2, i, i); } } public void draw(Graphics2D g2, Rectangle loc, Image cardBack, JApplet a){ g2.setColor(Color.WHITE); int letterSize=5*loc.width/12; if (faceUp){ g2.setFont(new Font("Helvetica", Font.BOLD, letterSize)); g2.setColor(Color.WHITE); g2.fill(loc); g2.setColor(Color.BLACK); g2.draw(loc); if (suit>0 && suit<3) g2.setColor(Color.RED); g2.drawString(this.info(), loc.x+8,loc.y+7*letterSize/6); } else { g2.drawImage(cardBack, loc.x, loc.y, loc.width, loc.height,a); } } }