0

編集: 私の最初の質問は解決されましたが、関数 getValue() は常に 11 を返します。

編集:見つけた、

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

正しくシャッフルされていません。どうしてか分かりません。

簡単なブラックジャック プログラムを作成するためにコードを作成/入力する必要がある課題を行っています。

私が定義した 3 つのクラスがあります。Card クラス、Hand クラス (Card の配列とその他の値)、および Card の配列である Deck クラスです。

Hand クラスには、カードのすべての値を合計するメソッドがあり、コードを実行するたびに java.lang.NullPointerException が発生し、コンソールはこの「addHand」メソッドを指します。

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

   return j;

}

Cards[] の値の一部が null になっているためだと思います。ただし、「カウンター」はそれらのいずれも追加できないようにする必要があります。残りのハンド クラスとカード クラスを含めます。

手のクラス:

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

2 に答える 2

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)null カードを追加できないように、メソッドにチェックを追加することもできます。

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");
}
于 2013-10-01T03:46:51.283 に答える
0

メソッドの呼び出しに依存しますaddCard。このメソッドは card をcards変数に設定しています。3 回呼び出した場合addCard、ループの 0、1、2 回の反復は問題ありaddHandませんが、反復 3 では例外が発生しcards[3]ますnull

カードを正しく追加していることを確認してください。

于 2013-10-01T03:48:30.397 に答える