当前位置: 首页 > 知识库问答 >
问题:

BlackJack Java中的卡值

曾云
2023-03-14

第一次在这里发帖。我听到了很多关于社区的好消息。我是一名业余程序员,迄今为止已经涉足C和Java领域。不管怎样,我最近几天胡乱拼凑起来的java 21点游戏让我头痛不已。基本上,我在创建我的牌组时遇到了一个问题。我正在使用ArrayList来保存卡片,但我无法找到一种方法来正确地为每张卡片添加值。正如我的代码所示,我使用parseint从字符串中获取值,并将其添加到卡和中,但问题是,当出现诸如“Ace”和“Jack”、“King”、“Queen”之类的值时,显然无法从中解析int,因此当程序运行时,一切正常,当然,除非前面提到的卡中有一张被拉出。然后,我得到一个错误,内容如下:

(“”Exception in thread“main”java.lang.NumberFormatException:对于输入字符串:“Queen”at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)at java。lang.Integer。java上的parseInt(Integer.java:580)。lang.Integer。21点的parseInt(Integer.java:615)。21点。21点的getHumanValue(Blackjack.java:110)。21点。main(Blackjack.java:27)java结果:1生成成功(总时间:0秒)”)。

我试着在网上查找它,看看是否能激发一些灵感,但我能找到的只是使用enum或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;
}

共有1个答案

欧阳何平
2023-03-14

请密切关注此通话。

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

它是无害的,因为它适用于您在cardValue中拥有的任何整数值。但是,这里不仅有积分值,还有单词。

你不能把单词“Queen”改成数字。Java没有这种能力,因为它没有数字意义*。

最好将卡的价值和卡的名称作为单独的数据部分存储,因为卡的名称还包括诉讼信息。

您尚未向我们展示您的卡类实现,但在不更改外部契约的情况下,您可以做的是在获取字符串时在内部进行一些解析,并在检索cardValue时返回一个int而不是字符串。如果是“Ace”类型,则应根据手的总值选择最合适的值(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;
}

““Queen”在基31中有一个值:24919187。”。但那可能不是你想要的

 类似资料:
  • 问题内容: 我玩引导4,虽然在我无法找到一个解决方案,以附加响应能力卡用(本类应用砌体,就像这个类的DIV中影响到卡)。 在引导3是 容易 的款式,让“卡”响应,因为它是可以应用类似包含一个div ,等等。 在Bootstrap 4中使用卡时如何产生相同的效果? 这是HTML: 这是我使用的CSS: 我希望卡片在较小的屏幕上垂直堆叠。 感谢您的建议! 问题答案: 引导4(4.0.0-alpha.2

  • 问题内容: 我使用以下代码来确定观测值(例如20、20、0和0)与期望值/比率(例如,在四种情况下分别为25%)的拟合程度如何: 如何在Python中复制此代码?我试过使用from中的函数,但是获得的结果却大不相同。我不确定这是否是正确的功能。我在文档中进行了搜索,但是由于运行到1000多个页面,这非常令人生畏。该文件比增加近50%。 问题答案: 期望观察到的和期望的绝对频率,而不是比率。您可以获

  • 问题内容: 在Tensorflow中有什么简单的方法可以像itertools.product一样做笛卡尔积吗?我想获得两个张量(和)的元素组合,在Python中可以通过itertools作为。我正在Tensorflow中寻找替代方案。 问题答案: 我将在此假定和均为一维张量。 为了得到两者的笛卡尔积,我会用的组合和: 您使用LEN(一) LEN(B) 2张量,其中的元件的每个组合结束并且在最后一维

  • 我正在开发一个应用程序,其中我有一个基本的活动,当我从左向右滑动时,我需要得到一个滑动窗口,其中将显示几个图标,当我从右到左单击时,我需要从右向左滑动窗口...我研究了一下...nd发现一些选项,如导航抽屉和滑动窗口和视图寻呼机....但是滑动手势jst从一个页面连续滑动到另一个页面...我不想要那个...当我从左向右和从右向左滑动时,我需要显示几个图标....但我不知道到底要用哪一个来更好地导航

  • 设置 多个独立的源系统将AVRO事件推送到Kafka主题中。KafkaS3接收器连接器从本主题读取AVRO事件,并写入S3拼花格式。 问题 我们的架构注册表中的 AVRO 架构不符合标准。例如,源系统中的十进制字段在架构注册表中具有基类型字符串和逻辑类型十进制。AVRO 中不允许这些类型的组合(十进制逻辑类型必须始终具有基本类型修复/字节。 这些不正确的AVRO模式导致不正确的拼花文件模式。E、

  • 基本上,我在cassandra上运行两个期货查询,然后我需要做一些计算并返回值(值的平均值)。 这是我的代码: 那么问题出在哪里呢? skus.foreach 在 ListBuffer 中追加结果值。由于一切都是异步的,当我尝试在我的主数据库中获取结果时,我得到了一个错误,说我不能被零除。 事实上,由于我的Sku.findSkusByProduct返回一个Future,当我尝试计算平均值时,卷是空