Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

mplement a simplified Pai Gow Poker game with betting between 1 user (the \"play

ID: 3556644 • Letter: M

Question

mplement a simplified Pai Gow Poker game with betting between 1 user (the "player") and the computer (the "dealer") for 10 rounds. Our Pai Gow Poker is a comparing card game played between the two hands, the "player" and the "dealer." We will use a single standard 52-card deck without any joker. The dealer deals out 7 cards to the player and himself. The user then looks at his cards and tries to make the best 5-card and 2-card poker hands. The 5-card hand must rank higher than the 2-card hand. The hand is then compared against the dealer hand. If both hands beat the dealer, the player wins. If both lose, the player loses. If both the dealer and the player win on a hand, it is a push. The only two-card hands are one pair and high cards. Five-card hands use standard poker hand rankings described here: http://en.wikipedia.org/wiki/Rank_of_hands_(poker): Royal flush, Straight flush, Four of a kind, Full house, Flush, Straight, Three of a kind, Two pair, One pair and High card. The player starts with 50 $1 chips. The user must place a bet of maximum 5 chips for each round. Each round has three possible outcomes: "player" wins (even win: 1:1), "dealer" wins and "push" (draw, noone wins.) Betting example: Lets say that you have $50 and you bet $5. If you win, you will get your $5 bet back plus another $5. Your purse will be $55. If you loose, you will loose your $5 bet. Your purse will be $45. The program will take the bet each round, deal the cards, a simple algorithm is used to select the computer's 2 hands (the lowest 2 cards are the two-card hand, while the rest of the cards are the five-card hand), the user will select 2 cards to be the two cards hand, the computer will compare the hands and will announce the winner: either Player or Dealer. The GUI code is already done: http://www.filedropper.com/paigowpoker I just need the parts where it say // To do Heres the playing card image. http://www.filedropper.com/playingcardsimages Rules of the game The rules for the 2-card hand: - a pair is higher than no-pair, - if both 2-card hand are pairs, the highest one wins. If the pairs are equal (disregarding the suit type), it is a draw for the 2-card hand. - if both 2-card hand are not pairs, the highest card wins. If the highest cards are equal, it is a draw for the 2-card hand.

Explanation / Answer

Card.java

package javapoker;

public class Card
{
   private short rank, suit;

   private static String[] suits = { "hearts", "spades", "diamonds", "clubs" };
   private static String[] ranks = { "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King" };

   public static String rankAsString( int __rank ) {
       return ranks[__rank];
   }

   Card(short suit, short rank)
   {
       this.rank=rank;
       this.suit=suit;
   }

   public @Override String toString()
   {
       return ranks[rank] + " of " + suits[suit];
   }

   public short getRank() {
       return rank;
   }

   public short getSuit() {
       return suit;
   }
}

Deck.java

package javapoker;

import java.util.Random;
import java.util.ArrayList;

public class Deck {
   private ArrayList<Card> cards;

   Deck()
   {
       cards = new ArrayList<Card>();
       int index_1, index_2;
       Random generator = new Random();
       Card temp;

       for (short a=0; a<=3; a++)
       {
           for (short b=0; b<=12; b++)
           {
           cards.add( new Card(a,b) );
           }
       }

       int size = cards.size() -1;

       for (short i=0; i<100; i++)
       {
           index_1 = generator.nextInt( size );
           index_2 = generator.nextInt( size );

           temp = (Card) cards.get( index_2 );
           cards.set( index_2 , cards.get( index_1 ) );
           cards.set( index_1, temp );
       }
   }

   public Card drawFromDeck()
   {     
       return cards.remove( cards.size()-1 );
   }

   public int getTotalCards()
   {
       return cards.size(); //we could use this method when making a complete poker game to see if we needed a new deck
   }
}

Hand.java


package javapoker;

public class Hand {
   private Card[] cards;
   private int[] value;

   Hand(Deck d)
   {
       value = new int[6];
       cards = new Card[5];
       for (int x=0; x<5; x++)
       {
           cards[x] = d.drawFromDeck();
       }

       int[] ranks = new int[14];
       int[] orderedRanks = new int[5];   //miscellaneous cards that are not otherwise significant
       boolean flush=true, straight=false;
       int sameCards=1,sameCards2=1;
       int largeGroupRank=0,smallGroupRank=0;
       int index=0;
       int topStraightValue=0;

       for (int x=0; x<=13; x++)
       {
           ranks[x]=0;
       }
       for (int x=0; x<=4; x++)
       {
           ranks[ cards[x].getRank() ]++;
       }
       for (int x=0; x<4; x++) {
           if ( cards[x].getSuit() != cards[x+1].getSuit() )
               flush=false;
       }


       for (int x=13; x>=1; x--)
       {
               if (ranks[x] > sameCards)
               {
                   if (sameCards != 1) //if sameCards was not the default value
                   {
                       sameCards2 = sameCards;
                       smallGroupRank = largeGroupRank;
                   }

                   sameCards = ranks[x];
                   largeGroupRank = x;

               } else if (ranks[x] > sameCards2)
               {
                   sameCards2 = ranks[x];
                   smallGroupRank = x;
               }
       }


       if (ranks[1]==1) //if ace, run this before because ace is highest card
       {
           orderedRanks[index]=14;
           index++;
       }

       for (int x=13; x>=2; x--)
       {
           if (ranks[x]==1)
           {
               orderedRanks[index]=x; //if ace
               index++;
           }
       }
      
      

      
       for (int x=1; x<=9; x++) //can't have straight with lowest value of more than 10
       {
           if (ranks[x]==1 && ranks[x+1]==1 && ranks[x+2]==1 && ranks[x+3]==1 && ranks[x+4]==1)
           {
               straight=true;
               topStraightValue=x+4; //4 above bottom value
               break;
           }
       }

       if (ranks[10]==1 && ranks[11]==1 && ranks[12]==1 && ranks[13]==1 && ranks[1]==1) //ace high
       {
           straight=true;
           topStraightValue=14; //higher than king
       }
      
       for (int x=0; x<=5; x++)
       {
           value[x]=0;
       }


       //start hand evaluation
       if ( sameCards==1 ) {
           value[0]=1;
           value[1]=orderedRanks[0];
           value[2]=orderedRanks[1];
           value[3]=orderedRanks[2];
           value[4]=orderedRanks[3];
           value[5]=orderedRanks[4];
       }

       if (sameCards==2 && sameCards2==1)
       {
           value[0]=2;
           value[1]=largeGroupRank; //rank of pair
           value[2]=orderedRanks[0];
           value[3]=orderedRanks[1];
           value[4]=orderedRanks[2];
       }

       if (sameCards==2 && sameCards2==2) //two pair
       {
           value[0]=3;
           value[1]= largeGroupRank>smallGroupRank ? largeGroupRank : smallGroupRank; //rank of greater pair
           value[2]= largeGroupRank<smallGroupRank ? largeGroupRank : smallGroupRank;
           value[3]=orderedRanks[0]; //extra card
       }

       if (sameCards==3 && sameCards2!=2)
       {
           value[0]=4;
           value[1]= largeGroupRank;
           value[2]=orderedRanks[0];
           value[3]=orderedRanks[1];
       }

       if (straight && !flush)
       {
           value[0]=5;
           value[1]=topStraightValue;
       }

       if (flush && !straight)
       {
           value[0]=6;
           value[1]=orderedRanks[0]; //tie determined by ranks of cards
           value[2]=orderedRanks[1];
           value[3]=orderedRanks[2];
           value[4]=orderedRanks[3];
           value[5]=orderedRanks[4];
       }

       if (sameCards==3 && sameCards2==2)
       {
           value[0]=7;
           value[1]=largeGroupRank;
           value[2]=smallGroupRank;
       }

       if (sameCards==4)
       {
           value[0]=8;
           value[1]=largeGroupRank;
           value[2]=orderedRanks[0];
       }

       if (straight && flush)
       {
           value[0]=9;
           value[1]=topStraightValue;
       }


   }

   void display()
   {
       String s;
       switch( value[0] )
       {

           case 1:
               s="high card";
               break;
           case 2:
               s="pair of " + Card.rankAsString(value[1]) + "'s";
               break;
           case 3:
               s="two pair " + Card.rankAsString(value[1]) + " " + Card.rankAsString(value[2]);
               break;
           case 4:
               s="three of a kind " + Card.rankAsString(value[1]) + "'s";
               break;
           case 5:
               s=Card.rankAsString(value[1]) + " high straight";
               break;
           case 6:
               s="flush";
               break;
           case 7:
               s="full house " + Card.rankAsString(value[1]) + " over " + Card.rankAsString(value[2]);
               break;
           case 8:
               s="four of a kind " + Card.rankAsString(value[1]);
               break;
           case 9:
               s="straight flush " + Card.rankAsString(value[1]) + " high";
               break;
           default:
               s="error in Hand.display: value[0] contains invalid value";
       }
       s = "               " + s;
       System.out.println(s);
   }

   void displayAll()
   {
       for (int x=0; x<5; x++)
           System.out.println(cards[x]);
   }

   int compareTo(Hand that)
   {
       for (int x=0; x<6; x++)
       {
           if (this.value[x]>that.value[x])
               return 1;
           else if (this.value[x]<that.value[x])
               return -1;
       }
       return 0; //if hands are equal
   }
}