1

I am trying to create a blackjack game.

First of all, I created an array called deck size 52 using a class constructor.

    public Deck(){
    for(int i=0; i<13; i++){ //Spades
      if(i>9){
        deck[i]=10;
      }
      else{
        deck[i]=(i+1);
      }
    }
    for(int i=13; i<26; i++){ //Hearts
      if(i>21){
        deck[i]=10;
      }
      else{
        deck[i]=(i-12);
      }
    }
    for(int i=26; i<39; i++){ //Clubs
      if(i>34){
        deck[i]=10;
      }
      else{
        deck[i]=(i-25);
      }

    }
    for(int i=39; i<52; i++){ //Diamonds
      if(i>47){
        deck[i]=10;
      }
      else{
        deck[i]=(i-38);
      }

    }
}

Then, I also created a shuffleDeck function in the Deck class.

public void shuffleDeck(){
  int[] temp = new int[52];
  int[] indexChecker = new int[52];
  for(int i=0 ; i<52 ; i++){
    indexChecker[i]=0;
  }
  int index = 0;
  for(int i=0; i<52 ; i++){
    index = number.nextInt(52);
    for(i=0; i<52 ; i++){
      while(index == indexChecker[i])
      index = number.nextInt(52);
    }
    temp[i] = deck[index]; //The error is here
  }

  for(int i=0; i<52; i++){
    deck[i] = temp [i];
  }
}

I use this algorithm to make sure that my random index generator does not generate the same number to shuffle my deck.

But when I try to shuffle it in the main class, it doesn't work.

    public static void main(String[] args) {

    Deck card = new Deck();

    System.out.println("Decks are created");
    card.getDeck();

    System.out.println("Shuffling...");
    card.shuffleDeck();

    System.out.println("Shuffled deck.");
    card.getDeck();

The output:

run:
Decks are created
0-1
1-2
2-3
3-4
4-5
5-6
6-7
7-8
8-9
9-10
10-10
11-10
12-10
13-1
14-2
15-3
16-4
17-5
18-6
19-7
20-8
21-9
22-10
23-10
24-10
25-10
26-1
27-2
28-3
29-4
30-5
31-6
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 52
32-7
33-8
34-9
35-10
36-10
37-10
38-10
39-1
40-2
    at blackjack.pkg5.pkg0.Deck.shuffleDeck(Deck.java:69)
41-3
42-4
43-5
44-6
45-7
    at blackjack.pkg5.pkg0.Blackjack50.main(Blackjack50.java:13)
46-8
47-9
48-10
49-10
50-10
51-10
Shuffling...
C:\Users\Afrie Irham\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)
afrie
  • 13
  • 7
  • 3
    Please provide a [mcve], making sure you're very clear about *where* the error comes. – Jon Skeet Dec 08 '17 at 10:13
  • 3
    Please also post the complete StackTrace of the error. – Korashen Dec 08 '17 at 10:14
  • The output you posted in not consistent with yhe code above: in this code you call shuffleDeck after Shuffling... is printed but in the output shuffledeck fails before printing Shuffling... Unless you call shuffleDeck grom getDeck() but you did not provide the code. – StephaneM Dec 08 '17 at 10:25
  • If you use an ArrayList, you can shuffle it by calling `Collections.shuffle()`. Why code what you don't need to. Each of your for loops has a condition in it. Why not separate the for loop into one for the numbers, and one for the honours? – Dragonthoughts Dec 08 '17 at 10:26
  • The error states `Deck.shuffleDeck(Deck.java:69)`. But your posted Deck class only has 36 lines. I am also missing the initialisation of the `deck` variable within the `Deck` class. Please post your complete `Deck` class. – Korashen Dec 08 '17 at 10:27

1 Answers1

4
  for(int i=0; i<52 ; i++){
    index = number.nextInt(52);
    for(i=0; i<52 ; i++){
      while(index == indexChecker[i])
      index = number.nextInt(52);
    }
    temp[i] = deck[index]; //The error is here
  }

You are reusing i in the inner loop, thus erasing the old value and incrementing until !(i < 52), i.e. i >= 52, then after the loop you are accessing temp[i], which is out of bounds for i >= 52. So just introduce a new iteration variable j to replace i in the inner loop.

yassin
  • 642
  • 2
  • 7
  • 18