我最近尝试过玩弄二十一点游戏,但是每当我的牌组拉出一张王牌时,它会根据我手中牌的总价值自动指定值为11而不是值1的值。
public class Deck {
private ArrayList<Card> cards;
public Deck(){
this.cards = new ArrayList<Card>();
}
public int valueOfCards(){
int totalValue = 0;
int aces = 0;
for(Card aCard : this.cards){
switch(aCard.getValue()){
case TWO: totalValue += 2; break;
case THREE: totalValue += 3; break;
case FOUR: totalValue += 4; break;
case FIVE: totalValue += 5; break;
case SIX: totalValue += 6; break;
case SEVEN: totalValue += 7; break;
case EIGHT: totalValue += 8; break;
case NINE: totalValue += 9; break;
case TEN: totalValue += 10; break;
case JACK: totalValue += 10; break;
case QUEEN: totalValue += 10; break;
case KING: totalValue += 10; break;
case ACE: totalValue += 11 ; break;
}
}
for(int i = 0; i < aces; i++){
if(totalValue > 10){
totalValue += 1;
}
else{
totalValue += 11;
}
}
return totalValue;
}
}
答案 0 :(得分:1)
永远不会修改aces
的值,因此switch
之后的循环不执行任何操作。
在switch
中,
如果卡是ACE
,
你不想加11。
你想增加aces
中的ace数,
让下一个循环完成它的工作。
也就是说,这一行更改应修复您的程序:
case ACE: aces++ ; break;
答案 1 :(得分:1)
好吧,你的代码看起来应该计算第一个循环中的aces,它没有。你可能想做类似
的事情case ACE: totalValue += 11; aces++; break;
增加后续循环的ace计数。 但是,我猜想首先按照它们的值对卡片进行排序会更容易,以确保aces在最后,然后你可以做到
case ACES: totalValue += (totalValue > 10) ? 1 : 11;
并完全忽略第二个循环。
顺便说一下,你也可以给你的&#34;价值&#34;枚举成员和方法
public enum CardValue {
TWO(2), THREE(3), // and so on
private int value;
private CardValue(int value) { this.value = value; }
public int getValue(int currentHandValue) {
if (this == ACE) {
return currentHandValue > 10 ? 1 : 11;
}
return value;
}
}
所以你当前的代码减少到
// make sure aces are at the end
List<Card> sorted = new ArrayList<>(cards);
Collections.sort(sorted, Comparator.comparing(Card::getValue));
int totalValue = 0;
for (Card c : sorted) {
totalValue += c.getValue(totalValue);
}
return totalValue;