import java.util.Scanner;
/**
*
* @author progjoy
*/
public final class Poker {
char[] value = {'2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'}; //This array stores the visual value of each card value for when it’s printed out in CardBuilder and Hand
char[][] cards = new char[13][4];//This array keeps track if a card has been taken from the deck or not
String anything; //My dummy variable that I use to pause the program
String[] suits = {"Hearts", "Diamonds", "Spades", "Clubs"}; // This array stores the suits names to be able to match and print them later in CardBuilder
int[][][] pc = new int[2][5][2]; //First dim is PLAYER/CPU, second dim is which card, third dim is Value/Suit
int[] hand = new int[2]; //Keeps track of what hand each player has
int[] handVal = new int[2]; //Keeps value of specific hands (ie. “a pair of what?”)
boolean aiDone = false;//Makes sure that each players hand won’t be exposed before AI is done
Scanner input = new Scanner(System.in);
int wins = 0;
int losses = 0;
int money = 100;
int bet = 0;
public void clear() {
System.out.println("\n\n\n\n\n\n\n\n\n\n");
}// end of clear
public void makeBet() {
clear();
if (money <= 0) {
System.out.println("You have no money!!!");
//getline(cin, Anything);
} else {
do {
System.out.print("\nYou currently have $" + money
+ ".\nPlease place a bet:");
bet = input.nextInt();
} while (!valid(bet, money, 0));
}
}// end of makeBet
public boolean valid(int tester, int high, int low) {
if (low <= tester && tester <= high) {
return true;
}
System.out.println("Please enter a valid response");
return false;
}
public void generateHand(int player) {
boolean cardTaken;
int crd;
int curVal;
int curSuit;
//srand(time(NULL));
cardTaken = true;
for (crd = 0; crd < 4; crd++) {
do {
pc[player][crd][0] = ((int)(Math.random() * 52) % 13) + 2;
pc[player][crd][1] = ((int)(Math.random() * 52) % 4);
curVal = pc[player][crd][0];
curSuit = pc[player][crd][1];
if (cards[curVal][curSuit] == 13) {
cardTaken = true;
} else {
cardTaken = false;
}
} while (cardTaken || pc[player][crd][0] > 12);
cards[curVal][curSuit] = 'T';
}
}// end of generate hand
public void determineHand(int player) {
boolean group1 = false, group2 = false;
sortCards(player); //Prevents me from having to write out every possibility later. Finds high card.
int cardVal1 = pc[player][0][0];
int cardVal2 = pc[player][1][0];
int cardVal3 = pc[player][2][0];
int cardVal4 = pc[player][3][0];
int cardVal5 = pc[player][4][0];
int suitVal1 = pc[player][0][1];
int suitVal2 = pc[player][1][1];
int suitVal3 = pc[player][2][1];
int suitVal4 = pc[player][3][1];
int suitVal5 = pc[player][4][1];
hand[player] = 0;
// determine a pair
if (cardVal1 == cardVal2 || cardVal2 == cardVal3 || cardVal3 == cardVal4
|| cardVal4 == cardVal5) {
group1 = true;
hand[player] = 1;
// determine two pair
if (cardVal1 == cardVal2 && cardVal3 == cardVal4
|| cardVal1 == cardVal2 && cardVal4 == cardVal5
|| cardVal2 == cardVal3 && cardVal4 == cardVal5) {
hand[player] = 2;
//Three of a kind
if (cardVal1 == cardVal2 && cardVal1 == cardVal3
|| cardVal2 == cardVal3 && cardVal2 == cardVal4
|| cardVal3 == cardVal4 && cardVal3 == cardVal5) {
hand[player] = 3;
// determine a fullhouse
if (cardVal1 == cardVal2 && cardVal3 == cardVal4
&& cardVal3 == cardVal5 || cardVal1 == cardVal2
&& cardVal1 == cardVal3 && cardVal4 == cardVal5) {
hand[player] = 6;
// determine four of a kind
if (cardVal1 == cardVal2 && cardVal1 == cardVal3
&& cardVal1 == cardVal4 || cardVal2 == cardVal3
&& cardVal2 == cardVal4 && cardVal2 == cardVal5) {
hand[player] = 7;
}
// check suits
if (!group1) {
group2 = true;
// determine a straight
if (cardVal1 == (cardVal2 - 1)
&& cardVal2 == (cardVal3 - 1) && cardVal3
== (cardVal4 - 1) && cardVal4
== (cardVal5 - 1)) {
hand[player] = 4;
// determine straight flush
if (suitVal1 == suitVal2 && suitVal1 == suitVal3
&& suitVal1 == suitVal4
&& suitVal1 == suitVal5) {
hand[player] = 8;
// determine a royal flush
if (cardVal5 == 14)//Royal Flush
{
hand[player] = 9;
}// end of royalflush if
// determine flush
} else if (suitVal1 == suitVal2
&& suitVal1 == suitVal3 && suitVal1
== suitVal4 && suitVal1 == suitVal5) {
hand[player] = 5;
} else {// determine just high Card
hand[player] = 0;
//whichCards(player, CV1, CV2, CV3, CV4, CV5);
//if(AIDone && AdvDone){
// display what player has
switch (player) {
case 0:
System.out.println("PLAYER has ");
break;
case 1:
System.out.println("CPU has ");
break;
}
switch (hand[player]) {
case 0:
System.out.println("A HIGH CARD OF");
break;
case 1:
System.out.println("A PAIR OF");
break;
case 2:
System.out.println("TWO PAIR");
break;
case 3:
System.out.println("THREE OF A KIND");
break;
case 4:
System.out.println("A STRAIGHT");
break;
case 5:
System.out.println("A FLUSH");
break;
case 6:
System.out.println("A FULL HOUSE");
break;
case 7:
System.out.println("FOUR OF A KIND");
break;
case 8:
System.out.println("STRAIGHT FLUSH");
break;
case 9:
System.out.println("ROYAL FLUSH");
break;
}// end of switch results
}// end of player switch results
}// end of determine straight
}// end of if !group1
}// end of if fullHouse
}// end of if three of a kind
}// end of if two pair
}// end of if pair
System.out.println("\n\n");// give a couple spaces
}// end of determine hand
public void ai() {
int cardVal1 = pc[1][0][0];
int suitVal1 = pc[1][0][1];
int cardVal2 = pc[1][1][0];
int suitVal2 = pc[1][1][1]; //Sets the values and suit of each card for easier readability in later code
int cardVal3 = pc[1][2][0];
int suitVal3 = pc[1][2][1];
int cardVal4 = pc[1][3][0];
int suitVal4 = pc[1][3][1];
int cardVal5 = pc[1][4][0];
int suitVal5 = pc[1][4][1];
// AIDone = true;
sortCards(1);
if (hand[1] == 0) {
if (hand[1] == 0 && suitVal1 == suitVal2 && suitVal1 == suitVal3 && suitVal1 == suitVal4)// Go for flush
{
swapGenerator(1, 4);
} else if (hand[1] == 0 && suitVal1 == suitVal2 && suitVal1 == suitVal3 && suitVal1 == suitVal5)// Go for flush
{
swapGenerator(1, 3);
} else if (hand[1] == 0 && suitVal1 == suitVal2 && suitVal1 == suitVal4 && suitVal1 == suitVal5)// Go for flush
{
swapGenerator(1, 2);
} else if (hand[1] == 0 && suitVal1 == suitVal3 && suitVal1 == suitVal4 && suitVal1 == suitVal5)// Go for flush
{
swapGenerator(1, 1);
} else if (hand[1] == 0 && suitVal2 == suitVal3 && suitVal2 == suitVal4 && suitVal2 == suitVal5)// Go for flush
{
swapGenerator(1, 0);
} else if (hand[1] == 0 && cardVal5 == cardVal4 + 1 && cardVal4 == cardVal3 + 1 && cardVal3 == cardVal2 + 1) // Go for straight
{
swapGenerator(1, 0);
} else if (hand[1] == 0 && cardVal4 == cardVal3 + 1 && cardVal3 == cardVal2 + 1 && cardVal2 == cardVal1 + 1) // Go for straight
{
swapGenerator(1, 4);
} else if (hand[1] == 0 && handVal[1] >= 10) // Keeps top card
{
swapGenerator(1, 3);
swapGenerator(1, 2);
swapGenerator(1, 1);
swapGenerator(1, 0);
} else if (hand[1] == 0) {
generateHand(1);
}
}
if (hand[1] == 1)//Replaces cards other than the pair
{
if (cardVal1 == cardVal2) {
swapGenerator(1, 2);
swapGenerator(1, 3);
}
if (cardVal2 == cardVal3) {
swapGenerator(1, 0);
swapGenerator(1, 3);
}
if (cardVal3 == cardVal4) {
swapGenerator(1, 0);
swapGenerator(1, 1);
}
if (cardVal4 == cardVal5) {
swapGenerator(1, 0);
swapGenerator(1, 1);
swapGenerator(1, 2);
}
}
if (hand[1] == 2) {
if (cardVal1 == cardVal2 && cardVal3 == cardVal4) {
swapGenerator(1, 4);
}
if (cardVal2 == cardVal3 && cardVal4 == cardVal5) {
swapGenerator(1, 0);
}
}
if (hand[1] == 3) {
if (cardVal1 == cardVal2 && cardVal1 == cardVal3) {
swapGenerator(1, 3);
swapGenerator(1, 4);
}
if (cardVal2 == cardVal3 && cardVal2 == cardVal4) {
swapGenerator(1, 0);
swapGenerator(1, 4);
}
if (cardVal3 == cardVal4 && cardVal3 == cardVal5) {
swapGenerator(1, 0);
swapGenerator(1, 1);
}
}
}// end of ai
public void swapGenerator(int player, int cNum) {
//When player or AI wants to swap out a card this function generates
// a card for them and makes sure that is not already taken from the “deck”
boolean cardTaken;
int CurVal;
int CurSuit;
do {
cardTaken = true;
pc[player][cNum][0] = ((int)(Math.random() * 52) % 13) + 2;
pc[player][cNum][1] = ((int)(Math.random() * 52) % 4);
CurVal = pc[player][cNum][0];
CurSuit = pc[player][cNum][1];
if (cards[CurVal][CurSuit] == 'T') {
cardTaken = true;
} else {
cardTaken = false;
}
} while (cardTaken || pc[player][cNum][0] > 12);
cards[CurVal][CurSuit] = 'T';
}// end of swapGenerator
public void replaceCard() {
String reply;
boolean rValid;
int num, crd, cardNum;
boolean[] swapped = {true, false, false, false, false, false};//Used to make sure people don't try to swap the same card twice
rValid = false;
while (!rValid) {
System.out.print("Do you wish to replace any of your cards?"
+ "\nY(y) or N(n)");
reply = input.next();
if (reply.toUpperCase().equals("Y")) {
System.out.print("How many cards do you want to replace?");
num = input.nextInt();
if (num == 5) {
generateHand(0);
} else {
do {
System.out.print("\nWhat card numbers do you want "
+ "replaced? ");
cardNum = input.nextInt();
} while (!valid(cardNum, 5, 1) && swapped[cardNum] == false);
swapped[cardNum] = true;
swapGenerator(0, cardNum - 1);
for (crd = 1; crd < num; crd++) {
do {
System.out.println("and?");
System.out.println("");
} while (!valid(cardNum, 5, 1) && swapped[cardNum] == false);
swapped[cardNum] = true;
swapGenerator(0, cardNum - 1);
}
}
rValid = true;
} else if (reply.toUpperCase().equals("N")) {
rValid = true;
} else {
System.out.println("Illegal reply. Try again.");
rValid = false;
}
}
sortCards(0);
System.out.print("Press return to continue.");
//getline(cin, Anything);
clear();
System.out.println("PLAYER's cards");
//CardBuilder(0);
}
public void sortCards(int player) {
int vTemp, sTemp;
int crd;
int cardVal1 = pc[player][0][0];
int cardVal2 = pc[player][1][0];
int cardVal3 = pc[player][2][0];//NEW overhaul of Sort
int cardVal4 = pc[player][3][0];//Before this version, the Sort was done using passed variables, but the
int cardVal5 = pc[player][4][0];//PCs array itself was never touched. Doing it this way there is ALOT less passing
int suitVal1 = pc[player][0][1];//the five cards' values, and so it's more efficent and neat than previously.
int suitVal2 = pc[player][1][1];
int suitVal3 = pc[player][2][1];
int suitVal4 = pc[player][3][1];
int suitVal5 = pc[player][4][1];
for (crd = 0; crd < 4; crd++) {
if (cardVal1 > cardVal2) {
vTemp = cardVal1;
cardVal1 = cardVal2;
cardVal2 = vTemp;
sTemp = suitVal1;
suitVal1 = suitVal2;
suitVal2 = sTemp;
}
if (cardVal2 > cardVal3) {
vTemp = cardVal2;
cardVal2 = cardVal3;
cardVal3 = vTemp;
sTemp = suitVal2;
suitVal2 = suitVal3;
suitVal3 = sTemp;
}
if (cardVal3 > cardVal4) {
vTemp = cardVal3;
cardVal3 = cardVal4;
cardVal4 = vTemp;
sTemp = suitVal3;
suitVal3 = suitVal4;
suitVal4 = sTemp;
}
if (cardVal4 > cardVal5) {
vTemp = cardVal4;
cardVal4 = cardVal5;
cardVal5 = vTemp;
sTemp = suitVal4;
suitVal4 = suitVal5;
suitVal5 = sTemp;
}
}
pc[player][0][0] = cardVal1;
pc[player][1][0] = cardVal2;
pc[player][2][0] = cardVal3;
pc[player][3][0] = cardVal4;
pc[player][4][0] = cardVal5;
pc[player][0][1] = suitVal1;
pc[player][1][1] = suitVal2;
pc[player][2][1] = suitVal3;
pc[player][3][1] = suitVal4;
pc[player][4][1] = suitVal5;
}// end of sortCards
public void determineWinner() {
if (hand[0] > hand[1]) {
System.out.println("Player wins");
money = money + bet;
} else {
System.out.println("Computer wins");
money = money - bet;
}
}// end of determine winner
public void shuffleCards() {
int OC, IC;
for (OC = 0; OC < 13; OC++) {
for (IC = 0; IC < 4; IC++) {
}
}
}// end of shuffleCards
boolean endGame = false;
public Poker() {
while (!endGame) {
makeBet();
clear();
generateHand(1); //CPU is given it's cards
System.out.println("Your cards are: \n");
//cout << "PLAYER's cards" << endl;
generateHand(0); //Player is given their cards
determineHand(1); //CPU's hand is judged
cardBuilder(1);
AI(); //Based on that judgement, CPU swaps out cards
cardBuilder(1);
determineHand(0); //Player's hand is judged
System.out.println(" Card# Card# Card# Card# Card#");
System.out.println(" 1 2 3 4 5 ");
cardBuilder(0);
System.out.println("");
replaceCard();//Asks player if they want to replace any of their cards and does so
determineHand(0);//Player's hand is judged again
System.out.println("\nCPU's cards");
sortCards(1);//CPU cards are put in order by value (ex. 4,6,8,K,A)
//CardBuilder(1); //CPU's cards are printed
determineHand(1);//CPU's hand is judged again
determineWinner();//Winner is declared
shuffleCards();//Cards array is cleared
clear();
System.out.print("Do you wish to play again?(Y or N)");
String reply = input.next();
if (reply.toUpperCase().equals("Y")) {
endGame = false;
} else if (reply.toUpperCase().equals("Y")) {
endGame = true;
}
}
}
public void startGame(){
Poker poker = new Poker();
}
}
// RUN THE GAME
public class PlayGame{
public static void main(String [] args){
Poker pt = new Poker();
pt.startGame();
}
}
Any feedback would be great.
Thanks


Sign In
Create Account


Back to top









