我正在制作纸牌计数程序。我已经有了主程序,但是当我尝试实现自己的类时,我在第19行得到了一个NullPointerException错误(只要它到达c.getRank
)。
请注意,我首先创建了我的主程序,同时导入了一个名为CardDeck
的类,它具有我需要的所有功能,但现在我应该创建自己的类,它完全相同。 (请注意,我无权访问导入的CardDeck
类)。
这是主要代码:
import se.lth.cs.ptdc.cardGames.Card;
public class Patiens {
public static void main(String[] args) {
double good = 0;
double bad = 0;
double result = 0;
for (int a = 0; a < 1000000; a++) {
CardDeck deck = new CardDeck();
deck.shuffle();
double fail = 0;
while (deck.moreCards()) {
for (int i = 1; i <= 3 && deck.moreCards(); i++) {
Card c = deck.getCard();
if (i == 1 && c.getRank() == 1) {
fail++;
}
if (i == 2 && c.getRank() == 2) {
fail++;
}
if (i == 3 && c.getRank() == 3) {
fail++;
}
}
}
if (fail >= 1) {
bad++;
}
else{
good++;
}
}
System.out.println("Good: " + good + " Bad: " + bad);
result = good / bad;
System.out.println("Result= " + result);
}
}
它的作用是计算我的套牌成功完成的概率:
它在计算1-2-3,1-2-3,同时画一张牌。现在如果当卡计数为“1”时卡恰好是ACE,则当前卡组将失败。同样适用于等级为2的卡,而程序计数为“2”等。它将完成而不会失败一次的概率为0.8%。
这是我正在创建的CardDeck类:
import se.lth.cs.ptdc.cardGames.Card;
import java.util.Random;
public class CardDeck {
private Card[] cards;
private int current;
private static Random rand = new Random();
public CardDeck() {
cards = new Card[52];
for(int suit = Card.SPADES; suit <= Card.CLUBS; suit++) {
for (int i = 0; i < 13; i++) {
cards[i * suit] = new Card(suit, i);
}
}
current = 0;
}
public void shuffle() {
Card k;
for(int i = 1000; i > 0; i--) {
int nbr = rand.nextInt(52);
int nbr2 = rand.nextInt(52);
k = cards[nbr2];
cards[nbr2] = cards[nbr];
cards[nbr] = k;
}
}
/**
*Checks for more cards
*/
public boolean moreCards() {
if(current > 51) {
return false;
} else {
return true;
}
}
/**
*Draws the card lying on top.
*/
public Card getCard() {
return cards[current++];
}
}
这是import se.lth.cs.ptdc.cardGames.Card;
如果需要,它是创建卡片的类。
package se.lth.cs.ptdc.cardGames;
public class Card {
public static final int SPADES = 1;
public static final int HEARTS = SPADES + 1;
public static final int DIAMONDS = SPADES + 2;
public static final int CLUBS = SPADES + 3;
private int suit;
private int rank;
public Card(int suit, int rank) {
this.suit = suit;
this.rank = rank;
}
public int getSuit() {
return suit;
}
public int getRank() {
return rank;
}
}
(请注意,我不应该更改上述课程)
答案 0 :(得分:4)
你的问题在这里:
cards[i * suit] = new Card(suit, i);
如果您将其更改为:
cards[i + ((suit - 1) * 13)] = new Card(suit, i);
它会做你期望的。
要考虑的两件事:首先,数组是从零开始,所以你的第一张牌需要在索引0处。其次,通过乘以套装,你将获得该数字的倍数,例如:
因此,一些元素将被多次填充(12个被填充四次),并且一些(特定质数> 13)元素(例如23)将为空。通常,用另一个变量表示索引可能就足够了,如下所示:
int cardIndex = 0;
for (int suit = Card.SPADES; suit <= Card.CLUBS; suit++) {
for (int i = 0; i < 13; i++) {
cards[cardIndex++] = new Card(suit, i);
}
}
答案 1 :(得分:1)
数组CardDeck.cards
包含null
个元素,因为当您使用基于1的索引(i * suit
中的{1}}时,Card.SPADES
无法达到预期效果1} p>
答案 2 :(得分:0)
getCard()
类的CardDeck
方法似乎返回null
而不是返回Card对象。检查getCard()
方法并在返回之前打印Card obj。