Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
21点Java中的卡值_Java_Arraylist_Blackjack - Fatal编程技术网

21点Java中的卡值

21点Java中的卡值,java,arraylist,blackjack,Java,Arraylist,Blackjack,第一次在这里发布。我听到了很多关于社区的好消息。我是一个业余程序员,至今涉足C++和java。不管怎么说,我最近几天胡乱拼凑了一个java 21点游戏,这让我大吃一惊。基本上,我有一个问题与我的甲板创建。我正在使用ArrayList来保存这些卡,但我无法找到一种方法来正确地为每张卡添加值。正如您从我的代码中看到的,我使用parseint从字符串中获取值并将其添加到卡和中,但问题是,当出现诸如“Ace”和“Jack”“King”“Queen”之类的值时,显然无法从中解析int,因此当程序运行时,一

第一次在这里发布。我听到了很多关于社区的好消息。我是一个业余程序员,至今涉足C++和java。不管怎么说,我最近几天胡乱拼凑了一个java 21点游戏,这让我大吃一惊。基本上,我有一个问题与我的甲板创建。我正在使用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秒)”

我试着在网上查找它,看看是否能激发一些灵感,但我能找到的只是使用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;
}
请密切关注这个电话

totalValue2 += Integer.parseInt(value.cardValue);
它是无害的,因为它适用于
cardValue
中的任何整数值。但是,这里也不仅仅有积分值,还有单词

你不能把“女王”这个词改成数字。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为基数。但那可能不是你想要的

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;
}