繁体   English   中英

Java 21点程序

[英]Java blackjack program

所以我用您的建议(Todd Hopp)重写了它,并更新了BlackJack类的(*)部分中的帖子,这样您可以看到我现在的情况,但是我仍然遇到相同的错误,并且它没有打印computePlayerValue由于某些原因....


错误:线程“ main”中的异常java.lang.NumberFormatException:对于输入字符串:java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)的“ King”

at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at BlackJack.dealCards(BlackJack.java:25)
at PlayCardGame.main(PlayCardGame.java:9)

PS我正在尝试在书中查找这个问题,但找不到答案... BlackJack类是本书前一章的部分源代码,我无法弄清楚是否有必要超(); 在构造函数那里? 我以为只有父类构造函数有参数时才要做? 关于是否必须存在以及它在做什么的任何帮助。

二十一点类

 public class BlackJack extends CardGameFP{
    int computePlayerValue;
    int computeDealerValue;
    int cardValue;

    public BlackJack() {
        **super();**
        player1 = 2;
        player2 = 2;
    }

    public void display() {
        System.out.println("BlackJack");
    }
//************************************************************* 
    public int getCardValue(Card card) {
    final String rank = card.getRank();
    switch (rank) {
        case "Ace":
            return 1;
        case "King":
        case "Queen":
        case "Jack":
            return 10;
        default:
            return Integer.parseInt(rank);
    }
}

public void dealCards() {
    //Player 1
    System.out.println("Player 1:");
    for(int x = 0; x < playerHand; x++) {
        shuffle();
        System.out.println(fullDeck[x].getRank() + " of " + fullDeck[x].getSuit());
    }
    cardValue1 = getCardValue(fullDeck[0]);
    cardValue2 = getCardValue(fullDeck[1]);
    computePlayerValue = cardValue1 + cardValue2;
    System.out.println(computePlayerValue);
}

//*************************************************************


        //Dealer hand
        System.out.println("\nPlayer 2:");
        for(int x = 0; x < player2; x++) {
            System.out.println(fullDeck[x].getRank() + " of " + fullDeck[x].getSuit() );
            shuffle();
        }
    }
    }


public class Card {

protected String suit;
protected int value;
protected String rank;
protected final int LOW_VALUE = 1;
protected final int HIGH_VALUE = 13;


public String getRank() {
    return rank;
}

public int getValue() {
    return value;
}

public String getSuit() { 
    return suit;
}

public void setSuit(String st) {
    suit = st;
}

public void setValue(int val) {
    if(val >= LOW_VALUE && val <= HIGH_VALUE) {
        value = val;
    }
    else {
        value = LOW_VALUE;
    }
    if(val == 1) {
        rank = "Ace";
    }
    else if(val == 11) {
        rank = "Jack";
    }
    else if(val == 12) {
        rank = "Queen";
    }
    else if(val == 13) {
        rank = "King";
    }
    else {
        rank = Integer.toString(value);
    }           
}   
}

纸牌类

abstract public class CardGameFP {

int suitNum = 1;
int val = 1;
int player1;
int player2;
protected final int DECK_OF_CARDS = 52;
Card fullDeck[] = new Card[DECK_OF_CARDS];
protected final int LOW_VALUE = 1;
protected final int HIGH_VALUE = 13;
protected final int HIGH_SUIT = 4;
protected final int CARDS_IN_SUIT = 13;

public abstract void display();
public abstract void dealCards();

public CardGameFP() {
    for(int i = 0; i < fullDeck.length; i++) {
        fullDeck[i] = new Card();
        if(suitNum == 1) {
            fullDeck[i].setSuit("Spades");
        }
        else if(suitNum == 2) {
            fullDeck[i].setSuit("Hearts");
        }
        else if(suitNum == 3) {
            fullDeck[i].setSuit("Diamonds");
        }
        else {
            fullDeck[i].setSuit("Clubs");
        }
        fullDeck[i].setValue(val);
        val++;
        if(val > HIGH_VALUE) {
            suitNum++;
            val = 1;
        }            
    }//end for
}   
public void shuffle() {
    for(int firstCard = 0; firstCard < DECK_OF_CARDS; firstCard++ ) {
        firstCard = ((int)(Math.random() * 500) % DECK_OF_CARDS);
        int secondCard = ((int)(Math.random() * 500) % DECK_OF_CARDS);
        Card temp = fullDeck[firstCard];
        fullDeck[firstCard] = fullDeck[secondCard];
        fullDeck[secondCard] = temp;
    }
}
}

PlayCardGame类

PlayerCardGame

    public class PlayCardGame {

    public static void main(String[] args) {
        Card CG = new Card();
        BlackJack BJ = new BlackJack();

        BJ.display();
        BJ.dealCards();
    }
    }

代替此行:

cardValue = Integer.parseInt(fullDeck[0].getRank());

我建议您创建一个getCardValue(Card)方法:

public int getCardValue(Card card) {
    final String rank = card.getRank();
    switch (rank) {
        case "Ace":
            return 1;
        case "King":
        case "Queen":
        case "Jack":
            return 10;
        default:
            return Integer.parseInt(rank);
    }
}

然后使用:

cardValue = getCardValue(fullDeck[0]);

编辑:根据@WorldSEnder的建议,您可以定义一个Rank枚举:

public enum Rank {
    ACE("Ace", 1),
    TWO("2", 2),
    ...
    QUEEN("Queen", 10),
    KING("King", 10);

    private final String displayName;
    private final int value;

    protected Rank(String displayName, int value) {
        this.displayName = displayName;
        this.value = value;
    }

    public String displayName() {
        return displayName;
    }

    public int value() {
        return value;
    }
}

然后,您可以修改Card以使用Rank而不是String进行排名并使用:

cardValue = fullDeck[0].getRank().value();

你打电话时 :

 cardValue = Integer.parseInt(fullDeck[0].getRank());    

方法Interger.parseInt()尝试从string读取int 问题在于某些卡的行列本身不是字符串,例如King 因此,当您返回该卡的等级时, parseInt()不知道如何处理King 相反,您应该使用fullDeck[0].getVaule()获取卡的实际值,然后解析该值。 这是介于1到13之间的字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM