我正试图编写一个Blackjack程序,用户在其中打赌一个CPU经销商。
我遇到的问题是,我已经为卡片、牌和经销商编写了类,但是当我尝试初始化一个新的经销商和一个新的甲板时,我会得到错误:
Exception in thread "main" java.lang.NullPointerException
at Blackjack.Deck.<init>(Deck.java:12)
at Blackjack.Blackjack.main(Blackjack.java:10)这是我的卡课程
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;
}
}我的甲板班
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);
}
}我的经销商班
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;
}}
我的主要方法是:
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());
}
}任何帮助都将不胜感激。谢谢!
发布于 2015-06-03 01:12:38
在Deck中,属性deck从未被初始化过,因此null。因为deck是null,所以这一行:deck.add(new Card(i,j));将抛出一个NullPointerException。只需在for-循环之前创建deck来解决这个问题。
Deck()
{
deck = new ArrayList<>();
for(int i=0; i<4; i++)
{
for(int j=1; j<=13; j++)
{
deck.add(new Card(i,j));
}
}
}发布于 2015-06-03 01:12:35
在Deck()内部,您需要添加以下内容:
deck = new ArrayList<Card>(); // Same for hand in Dealer class在这里,
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;
}
}可以更改为
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?
}https://stackoverflow.com/questions/30609171
复制相似问题