BlackJack程序开发:字符串类型卡牌的数值计算与爆牌判断问题
解决BlackJack手牌数值校验的字符串转数值问题
嘿,这个问题我在开发BlackJack程序的时候也踩过坑!核心问题就是你用字符串存储卡牌,直接用+运算符只会做字符串拼接,根本没法得到数值总和对吧?别担心,这里有几个实用的解决方案:
方法一:写一个卡牌字符串转数值的工具函数
最直接的方式就是把每个卡牌字符串映射成对应的BlackJack数值,还要记得处理A的特殊规则(可以算1或11)。
先写一个转换函数:
private int getCardValue(String card) { switch(card) { case "A": // 先默认按11计算,后续再根据总和调整 return 11; case "J": case "Q": case "K": return 10; default: // 数字牌直接转成整数 return Integer.parseInt(card); } }
然后遍历你的手牌数组,累加数值,同时处理A的调整逻辑:
// 假设playerHand是存储玩家手牌的字符串数组 int totalValue = 0; int aceCount = 0; for (String card : playerHand) { int value = getCardValue(card); if (value == 11) { aceCount++; // 记录A的数量 } totalValue += value; } // 如果总和超过21,把A从11改成1,直到总和≤21或者没有A了 while (totalValue > 21 && aceCount > 0) { totalValue -= 10; aceCount--; } // 最后判断是否爆牌 if (totalValue > 21) { System.out.println("Bust!"); }
方法二:使用面向对象的Card类(更推荐)
如果你的程序后续还要扩展功能(比如显示卡牌花色、记录卡牌状态),不如直接定义一个Card类,把卡牌的面值和数值绑定在一起:
class Card { private String face; // 比如"A"、"10"、"J" private int value; public Card(String face, int value) { this.face = face; this.value = value; } public int getValue() { return value; } // 可以再加getFace()方法用于显示卡牌 }
这样你的手牌就可以用List<Card>来存储,计算总和的时候直接调用getValue():
List<Card> playerHand = new ArrayList<>(); // 发牌的时候直接添加Card对象,比如playerHand.add(new Card("A", 11)); int totalValue = 0; int aceCount = 0; for (Card card : playerHand) { int value = card.getValue(); if (value == 11) { aceCount++; } totalValue += value; } // 同样处理A的调整逻辑 while (totalValue > 21 && aceCount > 0) { totalValue -= 10; aceCount--; } if (totalValue > 21) { System.out.println("Bust!"); }
为什么你的原代码不行?
你之前写的pCard1+pCard2+pCard3,因为变量是字符串类型,所以+会执行字符串拼接操作,比如"10"+"J"+"5"会变成"10J5",这显然不是你想要的数值总和,所以必须先把每个字符串转成对应的整数再相加。
内容的提问来源于stack exchange,提问作者PizzaParrot
相关产品推荐
相关产品推荐

