首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试Blackjack程序?(爪哇)

调试Blackjack程序?(爪哇)
EN

Stack Overflow用户
提问于 2015-06-03 01:08:00
回答 2查看 226关注 0票数 0

我正试图编写一个Blackjack程序,用户在其中打赌一个CPU经销商。

我遇到的问题是,我已经为卡片、牌和经销商编写了类,但是当我尝试初始化一个新的经销商和一个新的甲板时,我会得到错误:

代码语言:javascript
复制
Exception in thread "main" java.lang.NullPointerException
at Blackjack.Deck.<init>(Deck.java:12)
at Blackjack.Blackjack.main(Blackjack.java:10)

这是我的课程

代码语言:javascript
复制
 class Card {
      private int rank;
      private int suit;
      private int value;
      private static String[] ranks = {"Joker","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"};
      private static String[] suits = {"Clubs","Diamonds","Hearts","Spades"};

      Card(int suit, int values)
      {
           this.rank=values;
           this.suit=suit;
           if(rank>10)
           {
                value=10;
           }
           else
                value=rank;
      }
      public String toString()
      {
      return ranks[rank]+" of "+suits[suit];
      }
      public int getRank()
      {
      return rank;
      }
      public int getSuit()
      {
           return suit;
      }
      public int getValue()
      {
           return value;
      }
      public void setValue(int set)
      {
           value = set;
      }
 }

我的甲板

代码语言:javascript
复制
package Blackjack;
import java.util.ArrayList;
import java.util.Random;

 class Deck {
      private ArrayList<Card> deck;
      Deck()
      {
           for(int i=0; i<4; i++)
           {
                for(int j=1; j<=13; j++)
                {
                     deck.add(new Card(i,j));
                }
           }
      }
      public void shuffle()
      {
           Random random = new Random();
           Card temp;
           for(int i=0; i<200; i++)
           {
                int index1 = random.nextInt(deck.size()-1);
                int index2 = random.nextInt(deck.size()-1);
                temp = deck.get(index2);
                deck.set(index2, deck.get(index1));
                deck.set(index1, temp);
           }
      }
      public Card drawCard()
      {
           return deck.remove(0);
      }
 }

我的经销商

代码语言:javascript
复制
package Blackjack;
import java.util.ArrayList;
import java.util.Arrays;
class Dealer {
ArrayList<Card> hand;
private int handvalue=0;
private Card[] aHand;
Dealer(Deck deck)
{
    hand = new ArrayList<>();
    aHand = new Card[]{};
    for(int i=0; i<2; i++)
    {
        hand.add(deck.drawCard());
    }
    aHand = hand.toArray(aHand);
    for(int i=0; i<aHand.length; i++)
    {
        handvalue += aHand[i].getValue();
        if(aHand[i].getValue()==1 && handvalue<12)
        {
            handvalue=handvalue+10;
        }
    }
}
public String showFirstCard()
{
    Card[] firstCard = new Card[]{};
    firstCard = hand.toArray(firstCard);
    return firstCard[0].toString();
}
public void Hit(Deck deck)
{
    hand.add(deck.drawCard());
    aHand = hand.toArray(aHand);
    handvalue = 0;
    for(int i=0; i<aHand.length; i++)
    {
        handvalue += aHand[i].getValue();
        if(aHand[i].getValue()==1 && handvalue<12)
        {
            handvalue=handvalue+10;
        }
    }
}
public boolean wantsToHit()
{
    if(handvalue<17)
    {
        return true;
    }
    return false;
}
public boolean hasBlackJack()
{
    if(hand.size()==2 && handvalue==21)
    {
        return true;
    }
    return false;
}
public String showHand()
{
    aHand = hand.toArray(aHand);
    String hands="";
    for(int i=0; i<aHand.length-1; i++)
    {
        hands = aHand[i].toString()+", ";
    }
    hands = hands + aHand[aHand.length-1].toString();
    return hands;
}
public int getHandValue()
{
    return handvalue;
}

}

我的主要方法是:

代码语言:javascript
复制
 public class Blackjack {
 private static int cash;
 public static void main(String[] args){
      System.out.println("Hi! What is your name?");
      Scanner scan = new Scanner(System.in);
      String name = scan.nextLine();
      System.out.println("Hello, "+name+" lets plays some BlackJack!");
      Deck deck = new Deck();
      deck.shuffle();
      Dealer dealer = new Dealer(deck);
      System.out.println(dealer.showHand());
      System.out.println(dealer.getHandValue());
      }
 }

任何帮助都将不胜感激。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-03 01:12:38

Deck中,属性deck从未被初始化过,因此null。因为decknull,所以这一行:deck.add(new Card(i,j));将抛出一个NullPointerException。只需在for-循环之前创建deck来解决这个问题。

代码语言:javascript
复制
Deck()
{
    deck = new ArrayList<>();

    for(int i=0; i<4; i++)
    {
        for(int j=1; j<=13; j++)
        {
            deck.add(new Card(i,j));
        }  
    }
}
票数 1
EN

Stack Overflow用户

发布于 2015-06-03 01:12:35

Deck()内部,您需要添加以下内容:

代码语言:javascript
复制
deck = new ArrayList<Card>(); // Same for hand in Dealer class

在这里,

代码语言:javascript
复制
aHand = hand.toArray(aHand);
for(int i=0; i<aHand.length; i++)
{
    handvalue += aHand[i].getValue();
    if(aHand[i].getValue()==1 && handvalue<12)
    {
        handvalue=handvalue+10;
    }
}

可以更改为

代码语言:javascript
复制
for(Card c : hand) {
    handvalue += c.getValue();
    // rest of code
    // And I think inside your if,
    // It should be handvalue += 9? You already added the value '1' before.
    // If I remember how to play blackjack correctly, counting Ace as 10?
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30609171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档