2016-10-06 2 views
0

Ich habe ein Problem in meinem Java-Programm Black Jack. Ich kann nicht scheinen, meine "this.cards [o ++]" auszuarbeiten, wie es immer in ArrayIndexOutOfBoundException geht. Aber wenn ich es in "this.cards [j] ODER this.cards [i]" ändere, erhält es keinen Fehler, aber ich weiß, dass es falsch ist.Shuffling und Array Probleme Java

Hier ist der Fehler für:

**this.cards[o++]** 
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 13 
     at CardDeck.<init>(CardDeck.java:18) 
     at BlackJoker.main(BlackJoker.java:17) 

**this.cards[j]** 
null 
Kc 
Qc 
8c 
null 
null 

**this.cards[i]** 
null 
Ac 
Ah 
null 
null 
Ad 

Hier ist mein Code:

import java.util.*; 
public class CardDeck 
{ 
    private String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", 
        "J", "Q", "K", "A" }; 
    private char[] suits = {'s','h','d','c'}; 
    private Card[] cards = new Card[13]; 
    private int currentCard; 

    CardDeck() 
    { 
     Card newCard; 
     int o = 0; 
     for(int i=0; i<this.suits.length; i++) 
     { 
      for(int j=0; j<this.ranks.length; j++) 
      { 
       this.cards[o++] = new Card(this.ranks[j], this.suits[i]); 
      } 
     } 
     this.shuffle(); 
    } 

    public void testing() //just for testing 
    { 
     System.out.println(this.suits[0]); 
    } 

    public Card drawNextCard() 
    { 

     return cards[currentCard++]; 
    } 

    private void shuffle() 
    { 
     Card[] tmp = new Card[13]; 
     for (int i = 0; i < cards.length; i++) 
     { 
      int index = (int)(Math.random() * (cards.length)); 

      tmp[index] = cards[i]; 
      cards[i] = cards[index]; 
      cards[index] = tmp[i]; 
     } 
    } 
} 

public class BlackJoker 
{ 
    public static void main(String[] args) 
    { 
     CardDeck cardDeck = new CardDeck(); 

     //cardDeck.testing(); 
     System.out.println(cardDeck.drawNextCard()); 
     System.out.println(cardDeck.drawNextCard()); 
     System.out.println(cardDeck.drawNextCard()); 
     System.out.println(cardDeck.drawNextCard()); 
     System.out.println(cardDeck.drawNextCard()); 
     System.out.println(cardDeck.drawNextCard()); 
     //System.out.println(cardDeck.drawNextCard()); 
    } 
} 

+0

Beachten Sie, dass "this.cards [j]" gibt mir eine Konstante "c" passt dann "this.cards [i]" gibt mir eine Konstante "A" (ace). Kann mir bitte jemand erklären, was ich falsch gemacht habe? Vielen Dank für jede Hilfe und Beratung. – Mia

+1

Am besten Karten und Deck, wo Deck eine Sammlung von Karten hat. Sie können die eingebaute Methode Collections.shuffle() verwenden. Https://www.tutorialspoint.com/java/util/collections_shuffle.htm – duffymo

Antwort

1

Sie ein Array sind die Zuweisung, die nur 13 Karten halten wird:

private Card[] cards = new Card[13]; 

Probieren Sie es 52 zu machen:

private Card[] cards = new Card[52]; 
0

Zusätzlich zur Erhöhung der Kartenfeldlänge, in der Shuffle-Funktion, werden Sie die Berechnung des Index Math.random verwenden, die ArrayIndexOutbound Ausnahme verursacht, wenn der Index über ist die Kartenfeldlänge. Sie müssen damit umgehen.

+1

Kein Problem. Da 'Math.random()' immer weniger als 1 zurückgibt, ist '(int) (Math.random() * (cards.length))' kleiner als 'cards.length'. –