2017-12-08 22 views
1

ブラックジャックゲームを作成しようとしています。ArrayOutOfBoundエラーがなぜ発生するのか分かりません

まず、クラスコンストラクタを使用してデッキサイズ52という配列を作成しました。

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); 
     } 

    } 
} 

次に、DeckクラスにshuffleDeck関数も作成しました。

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]; 
    } 
} 

このアルゴリズムを使用して、私のランダムインデックスジェネレータがデッキをシャッフルするのに同じ番号を生成しないようにします。

しかし、メインクラスでシャッフルしようとすると動作しません。

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(); 

出力:あなたはこのように、すなわちi >= 52を古い値を消去し、!(i < 52)までインクリメント、内側のループでiを再利用している

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) 
+3

[mcve]を入力してください。エラーがどこで*発生するのかがはっきりしていることを確認してください。 –

+3

また、完全なStackTraceエラーを投稿してください。 – Korashen

+0

上記のyohコードと一致しない出力:このコードでは、シャッフル後にshuffleDeckを呼び出します。...出力されますが、シャッフルの出力前に出力shuffledeckが失敗します... shuffleDeck grom getDeck()を呼び出さない限り、コードを提供する。 – StephaneM

答えて

5
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 
    } 

は、その後、ループの後、あなたはtemp[i]にアクセスしていますこれはi >= 52の範囲外です。そこで、内部ループのiを置き換えるために、新しい反復変数jを導入してください。

関連する問題