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