使用for循环修复switch语句的返回值

时间:2017-12-02 07:28:55

标签: java

我最近尝试过玩弄二十一点游戏,但是每当我的牌组拉出一张王牌时,它会根据我手中牌的总价值自动指定值为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;
}
}

2 个答案:

答案 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;