Jump to content

Need Help

- - - - -

  • Please log in to reply
5 replies to this topic

#1
mr mike

mr mike

    Learning Programmer

  • Members
  • PipPipPip
  • 96 posts
I am having a problem running this code for a poker game. Out of bounds exception, I know it is in the array, but.... what can I change to make this functional?


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

#2
WingedPanther

WingedPanther

    A spammer's worst nightmare

  • Moderators
  • 16,831 posts
  • Location:Upstate, South Carolina
  • Programming Language:C, C++, PL/SQL, Delphi/Object Pascal, Pascal, Transact-SQL, Others
  • Learning:Java, C#, PHP, JavaScript, Lisp, Fortran, Haskell, Others
Do you know what line is generating the exception?
Programming is a branch of mathematics.
My CodeCall Blog | My Personal Blog

#3
mr mike

mr mike

    Learning Programmer

  • Members
  • PipPipPip
  • 96 posts
Its line 65 but I think its the whole generate hand method.

#4
WingedPanther

WingedPanther

    A spammer's worst nightmare

  • Moderators
  • 16,831 posts
  • Location:Upstate, South Carolina
  • Programming Language:C, C++, PL/SQL, Delphi/Object Pascal, Pascal, Transact-SQL, Others
  • Learning:Java, C#, PHP, JavaScript, Lisp, Fortran, Haskell, Others
Well, you've defined cards as [13][4], but in line 60 you select a value that could be 13 or 14 to use as an index.
Programming is a branch of mathematics.
My CodeCall Blog | My Personal Blog

#5
mr mike

mr mike

    Learning Programmer

  • Members
  • PipPipPip
  • 96 posts
Woops, got rid of the +2, works now. I just have to convert the values into string(ie. A of Hearts, ....).
Thanks alot.

#6
WingedPanther

WingedPanther

    A spammer's worst nightmare

  • Moderators
  • 16,831 posts
  • Location:Upstate, South Carolina
  • Programming Language:C, C++, PL/SQL, Delphi/Object Pascal, Pascal, Transact-SQL, Others
  • Learning:Java, C#, PHP, JavaScript, Lisp, Fortran, Haskell, Others
I'm glad I could help :)
Programming is a branch of mathematics.
My CodeCall Blog | My Personal Blog




1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users