【问题标题】:Card Values in BlackJack Java二十一点 Java 中的卡值
【发布时间】:2014-08-12 09:50:25
【问题描述】:

第一次在这里发帖。我听说过很多关于社区的好消息。我是一名业余程序员,到目前为止已经涉足 C++ 和 Java。 Anywhoo,在过去的几天里,我一直在用 Java 中的这个 BlackJack 游戏打开我的脑袋。基本上,我在创建套牌时遇到了问题。我正在使用 ArrayList 来保存卡片,但我无法找到正确为每张卡片添加值的方法。正如您在我的代码中看到的那样,我正在使用 parseint 从字符串中获取值并将其添加到卡片总和中,但问题是,当“Ace”和“Jack”“King”“Queen”等值出现时,显然没有 int 可以从那里解析,所以当程序运行时,一切正常,除非前面提到的卡之一被拉出。然后我收到一条错误消息:

(""线程 "main" java.lang.NumberFormatException 中的异常:对于输入字符串:"Queen" 在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 在 java.lang.Integer.parseInt(Integer.java:580) 在 java.lang.Integer.parseInt(Integer.java:615) 在 blackjack.Blackjack.getHumanValue(Blackjack.java:110) 在 blackjack.Blackjack.main(Blackjack.java:27) Java 结果:1 构建成功(总时间:0 秒)"") 。

我尝试在网上查找它是否可以激发一些灵感,但我只能使用 Enums 或 Switch 来构建我的套牌,但问题是我还没有完全理解这些技术。任何建议将不胜感激。

谢谢!

public class Blackjack{


ArrayList<card> buildDeck = new ArrayList<card>();

public static void main(String[] args) 
{


    Blackjack b = new Blackjack();

    // Compares both scores. The largest score wins.

    if(b.getHumanValue() < b.getRobotValue())
    {
        System.out.println("ROBOT WINS!!!");
    }
    else if(b.getRobotValue() > 21 && b.getHumanValue() <=21 )
    {
        System.out.println("YOU WIN!!!");
    }

}


  public ArrayList<card> buildDeck(ArrayList<card> buildDeck)
{      
    String [] suit = {"Spade", "Hearts", "Clubs", "Diamonds"};
    String [] cardValue = {"Ace","2","3","4","5","6",
        "7","8","9","10","Jack","Queen","King"};

    for(int i = 0; i < suit.length; i++)
    {
        for(int j = 0; j < cardValue.length; j++)
        {

            card card = new card(suit[i], cardValue[j]);
            buildDeck.add(card);

        }
    }

    return buildDeck;
}


 // This returns the human score

  public int getHumanValue()
{
    buildDeck(buildDeck);

    Scanner s = new Scanner(System.in);

    card value;

    int ranCard = 0;
    int i = 0;
    int aceValue = 0;
    int totalValue = 0;

    String drawAgain = "";

    System.out.println("[[Dealer gives you two cards.]]");
    System.out.println("");

   while(i < 2)
    {
        ranCard = 0+(int)(Math.random()*52);
        System.out.println("Card " + (i+1) + ":");
        System.out.println(buildDeck.get(ranCard));
        value = buildDeck.get(ranCard);

      while(value.cardValue.equalsIgnoreCase("Ace")) // Ace value; either 1 or 11
        {
            System.out.println("");
            System.out.println("This is an ace.");
            System.out.println("It is equal to 1 or 11");
            System.out.println("Which number do you prefer?");
            System.out.println("");
            aceValue = s.nextInt();
            s.nextLine();
            if(aceValue == 11)
            {
                totalValue += 11;
                totalValue -= 1; // Subtracted 1; was off by one
                break;
            }
            else if(aceValue == 1)
                    {
                        totalValue += 1;
                        totalValue -= 1; // Subtracted 1; was off by one
                        break;
                    }
        }

        totalValue += Integer.parseInt(value.cardValue);
        System.out.println("Total Score: " + totalValue);
        System.out.println("");
        i++;
    }

    System.out.println("[[Would you like to draw another card? Yes/No]]");
    System.out.println("");

    drawAgain = s.nextLine();    

    System.out.println("");

    if(drawAgain.equalsIgnoreCase("YES"))
            {
        ranCard = 0+(int)(Math.random()*52);
        System.out.println("Card 3:");
        System.out.println(buildDeck.get(ranCard));
        value = buildDeck.get(ranCard);
        totalValue += Integer.parseInt(value.cardValue);
        System.out.println("Total Score: " + totalValue);
        System.out.println("");
    }
    else
    {

    }

    return totalValue;
}

// This returns the robot's score
// Mostly copied from gethumanValue method but more automated

public int getRobotValue()
{

    buildDeck(buildDeck);

    card value;

    int ranCard = 0;
    int i = 0;
    int totalValue2 = 0;

    System.out.println("[[Dealer gives Robot two cards.]]");
    System.out.println("");

    while(i < 2)
    {
        ranCard = 0+(int)(Math.random()*52);
        System.out.println("Card " + (i+1) + ":");
        System.out.println(buildDeck.get(ranCard));
        value = buildDeck.get(ranCard);

       while(value.cardValue.equalsIgnoreCase("Ace")) // Ace value; either 1 or 11
        {

            if(totalValue2 < 11)
            {
                totalValue2 += 11;
                totalValue2 -= 1; // Subtracted 1; was off by one
                break;
            }
            else if(totalValue2 > 10)
                    {
                        totalValue2 += 1;
                        totalValue2 -= 1; // Subtracted 1; was off by one
                        break;
                    }
        }

        totalValue2 += Integer.parseInt(value.cardValue);
        System.out.println("Total Score: " + totalValue2);
        System.out.println("");
        i++;
    }

    if(totalValue2 < 17)
    {
        ranCard = 0+(int)(Math.random()*52);
        System.out.println("Card 3:");
        System.out.println(buildDeck.get(ranCard));
        value = buildDeck.get(ranCard);
     while(value.cardValue.equalsIgnoreCase("Ace")) // Ace value; either 1 or 11
        {         
         if(totalValue2 < 11)
            {
                totalValue2 += 11;
                totalValue2 -= 1; // Subtracted 1; was off by one
                break;
            }
            else if(totalValue2 > 10)
                    {
                        totalValue2 += 1;
                        totalValue2 -= 1; // Subtracted 1; was off by one
                        break;
                    }
        }

        totalValue2 += Integer.parseInt(value.cardValue);
        System.out.println("Total Score: " + totalValue2);
        System.out.println("");
    }
    else
    {

    }

    return totalValue2;
}

}

编辑对不起,忘了包括我的卡片类!!!

public class card {
String suit;
String cardValue;



@Override
public String toString() {
    return cardValue + " of " + suit;
}


public card(String suit, String cardValue) {
    this.suit = suit;
    this.cardValue = cardValue;
}


public card(String cardValue) {
    this.cardValue = cardValue;
}

public String getSuit() {
    return suit;
}

public void setSuit(String suit) {
    this.suit = suit;
}

【问题讨论】:

    标签: java arraylist blackjack


    【解决方案1】:

    密切关注这个电话。

    totalValue2 += Integer.parseInt(value.cardValue);
    

    它足够无害,因为它适用于cardValue 中的任何整数值。但是,你不仅有整数值 - 你也有单词。

    您不能将“女王”一词更改为数字。 Java 没有这种能力,因为它没有数字含义*。

    最好将卡片的价值和卡片的名称作为数据的单独部分存储,因为卡片的名称还包含花色信息。

    您尚未向我们展示您的 Card 类实现,但您可以在不更改外部合同的情况下做一些内部解析,当您获得 String 时,返回 int 而不是String 检索 cardValue 时。在“A”类型的情况下,根据手牌的总价值,您应该选择最合适的值(1 或 11)。这部分我留给读者作为练习。

    public Card(String suit, String value) {
        this.suit = suit;
        switch(value) {
            case "Ace":
                isAce = true; // conditional logic req'd since Ace can be 1 or 11.
                break;
            case "Jack":
            case "Queen":
            case "King":
                this.value = 10;
                break;
         }
         this.cardName = value;
    }
    

    *:“女王”确实有一个以 31 为底的值:24919187。但这可能不是你想要的。

    【讨论】:

      猜你喜欢
      • 2017-03-18
      • 2016-11-09
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 2012-04-25
      • 2013-10-07
      相关资源
      最近更新 更多