2013-10-01 4 views
0

EDIT: Мой первый вопрос был разрешен, однако функция getValue() всегда возвращает 11. Любые мысли?Java простой BlackJack, java.lang.NullPointerException

EDIT: Нашел,

Collections.shuffle(Arrays.asList(deck)); 

Не правильно перетасовки. Я не знаю почему.

Я выполняю задание, где мне нужно написать/заполнить какой-нибудь код, чтобы написать простую программу для блэкджека.

Существует три класса, которые я определил: класс карты, класс рук (который представляет собой массив карт и некоторые другие значения) и класс Deck, который также является массивом карт.

В классе «Рука» у меня есть метод, который суммирует все значения карт, и всякий раз, когда я запускаю свой код, я получаю исключение java.lang.NullPointerException, и консоль указывает на мой этот метод «addHand»:

public int addHand(){ 
    int j=0; 
    for(int i=0; i<=counter-1; i++){ 
     j += Cards[i].getValue(); 
    } 

    return j; 

}

Я думаю, это потому, что некоторые из значений в карты [] равны нулю. Но «счетчик» не должен позволять никому из них добавлять. Я включу остальную часть класса рук, а также класс карты.

рук Класс:

public class Hand { 

private Card[] Cards; 
private int counter; 
//private int valueOfHand; 

public Hand(){ 
    Cards = new Card[10]; 
    counter = 0; 

} 

public int numCards(){ 
    return counter; 
} 

public Card getCard(int i){ 
    return Cards[i]; 
} 

public int getCounter() { 
    return counter; 
} 

public void setCounter(int counter) { 
    this.counter = counter; 
} 

public void addCard(Card card){ 
    Cards[counter] = card; 
    setCounter(counter+1); 
} 

public int addHand(){ 
    int j=0; 
    for(int i=0; i<=counter-1; i++){ 
     j += Cards[i].getValue(); 
    } 

    return j; 

} 



} 

А Класс карты:

public class Card { 

private String value; 
private String suit; 

public Card(String number, String shape){ 
    value = number; 
    suit = shape; 

} 
public int getValue() { 
    if (value.equals("King") || value.equals("Queen") || value.equals("Jack")){ 
     return 10; 
    } 
    else if (value.equals("Ace")){ 
     return 11; 
    } 
    else { 
     return Integer.parseInt(value); 
    } 


} 
public void setValue(String value) { 
    this.value = value; 
} 
public String getSuit() { 
    return suit; 
} 
public void setSuit(String suit) { 
    this.suit = suit; 
} 
} 

Я не знаю, если мне нужно отправить что-нибудь еще, я был бы рад, если это необходимо.

Точная ошибка:

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException 
at Hand.addHand(Hand.java:39) 
at BlackJackGUIPanel$CardPanel.hitMe(BlackJackGUIPanel.java:182) 
at BlackJackGUIPanel$CardPanel.actionPerformed(BlackJackGUIPanel.java:161) 

Вот код Hitme:

void hitMe() { 
    if (!gameInProgress) { 
     message = "Click \"New Game\" to start a new game!"; 
     repaint(); 
     return; 
    } 


    player.addCard(deck.giveCard()); 
    if(player.addHand() > 21){ 
     message = "Game over, you busted"; 
     gameInProgress = false; 
    } 


message = "You clicked Hit Me!"; 
    repaint(); 

и код) giveCard (:

public Card giveCard(){ 
    Card temp = Decks[0]; 
    for(int i = 1; i<52; i++){ 
     Decks[i-1] = Decks[i]; 
    } 
    Decks[51] = temp; 
    return temp; 

} 

Я не мог найти лучшего способ сделать эту часть. здесь, где я инициализировать свою колоду:

public Deck(){ 
    Decks = new Card[52]; 


    //int cardNumber = 2; 
    for(int i = 0; i < 52; i += 4){ 
     switch (i/4){ 
     case 0: Decks[i] = new Card("2", "Spades"); 
       Decks[i+1] = new Card("2", "Hearts"); 
       Decks[i+2] = new Card("2", "Clubs"); 
       Decks[i+3] = new Card("2", "Diamonds"); 

     case 4: Decks[i] = new Card("3", "Spades"); 
       Decks[i+1] = new Card("3", "Hearts"); 
       Decks[i+2] = new Card("3", "Clubs"); 
       Decks[i+3] = new Card("3", "Diamonds"); 

     case 8: Decks[i] = new Card("4", "Spades"); 
       Decks[i+1] = new Card("4", "Hearts"); 
       Decks[i+2] = new Card("4", "Clubs"); 
       Decks[i+3] = new Card("4", "Diamonds"); 

     case 12: Decks[i] = new Card("5", "Spades"); 
       Decks[i+1] = new Card("5", "Hearts"); 
       Decks[i+2] = new Card("5", "Clubs"); 
       Decks[i+3] = new Card("5", "Diamonds"); 

     case 16: Decks[i] = new Card("6", "Spades"); 
       Decks[i+1] = new Card("6", "Hearts"); 
       Decks[i+2] = new Card("6", "Clubs"); 
       Decks[i+3] = new Card("6", "Diamonds"); 

     case 20: Decks[i] = new Card("7", "Spades"); 
       Decks[i+1] = new Card("7", "Hearts"); 
       Decks[i+2] = new Card("7", "Clubs"); 
       Decks[i+3] = new Card("7", "Diamonds"); 

     case 24: Decks[i] = new Card("8", "Spades"); 
       Decks[i+1] = new Card("8", "Hearts"); 
       Decks[i+2] = new Card("8", "Clubs"); 
       Decks[i+3] = new Card("8", "Diamonds"); 

     case 28: Decks[i] = new Card("9", "Spades"); 
       Decks[i+1] = new Card("9", "Hearts"); 
       Decks[i+2] = new Card("9", "Clubs"); 
       Decks[i+3] = new Card("9", "Diamonds"); 

     case 32: Decks[i] = new Card("10", "Spades"); 
       Decks[i+1] = new Card("10", "Hearts"); 
       Decks[i+2] = new Card("10", "Clubs"); 
       Decks[i+3] = new Card("10", "Diamonds"); 

     case 36: Decks[i] = new Card("Jack", "Spades"); 
       Decks[i+1] = new Card("Jack", "Hearts"); 
       Decks[i+2] = new Card("Jack", "Clubs"); 
       Decks[i+3] = new Card("Jack", "Diamonds"); 

     case 40: Decks[i] = new Card("Queen", "Spades"); 
       Decks[i+1] = new Card("Queen", "Hearts"); 
       Decks[i+2] = new Card("Queen", "Clubs"); 
       Decks[i+3] = new Card("Queen", "Diamonds"); 

     case 44: Decks[i] = new Card("King", "Spades"); 
       Decks[i+1] = new Card("King", "Hearts"); 
       Decks[i+2] = new Card("King", "Clubs"); 
       Decks[i+3] = new Card("King", "Diamonds"); 

     case 48: Decks[i] = new Card("Ace", "Spades"); 
       Decks[i+1] = new Card("Ace", "Hearts"); 
       Decks[i+2] = new Card("Ace", "Clubs"); 
       Decks[i+3] = new Card("Ace", "Diamonds"); 
     } 
     } 
    Collections.shuffle(Arrays.asList(Decks)); 
    } 
+0

Это зависит от того, как вы инициализируете Руку. Возможно, в вашем основном приложении (BlackJackGUIPanel) вы случайно вызываете 'addHand' с' null' Card? – justhalf

+0

можно просто отлаживать, чтобы проверить, не получилось ли 'null' для всех значений Карт [i] или просто определенное значение i. –

+0

Где 'addCard (Card)' на самом деле вызывается? –

ответ

0

Как отлаживать вы могли бы сделать это

public int addHand() 
{ 
    int j=0; 
    for(int i=0; i<=counter-1; i++) 
    { 
     Card c = Cards[i]; 
     if(c != null) 
     j += Cards[i].getValue(); 
     else 
     System.out.println("Add hand was trying to add a null card for index = " + i); 
    } 
    return j; 
} 

Вы также можете добавить проверку в ваш метод addCard(Card) так, чтобы нулевые карты не могут быть добавлены

public void addCard(Card card) 
{ 
    if(card != null) 
    { 
     Cards[counter] = card; 
     setCounter(counter+1); 
    } 
    else 
     System.out.println("NO NO NO! Trying to add a null card to your hand"); 
} 
+0

Это помогло! Тем не менее, я получаю непредсказуемые результаты, иногда программа запускается один или два раза, прежде чем я получу «Добавить рука пыталась добавить нулевую карту для индекса =» , но иногда она даже не запускается раньше Я понимаю. – user2833297

+0

Это указывает на то, что в вашем коде есть проблемы. Также обратите внимание, что это не должно использоваться как исправление. Если вам разрешено, я предлагаю вам использовать 'ArrayList' –

+0

Используя эту вторую отладку, я сразу же получаю строку else. Но иногда я этого не понимаю. – user2833297

0

Это зависит от звонка на addCard метода. Этот метод устанавливает карту в вашу переменную cards. Предположим, вы вызвали addCard 3 раза, затем 0, 1 и 2 итерации цикла в addHand будет в порядке, но итерация 3 пройдет через исключение, потому что cards[3] - null.

Убедитесь, что вы правильно добавили открытки.

+0

'i <= counter-1' эта логика в цикле for означает, что этого не произойдет , –

+0

@JavaDevil: Как вы можете это сказать? – Mohayemin

+1

Если 'addCard()' вызывается три раза, то 'counter = 3'. 'counter-1 = 2'. '2! = 3' поэтому 'cards [3]' не будет вызываться. –