我如何根据是否只有一个或多个来改变卡的价值?

时间:2015-06-07 06:27:46

标签: c# blackjack

我一直在为这个纸牌游戏做功课并撞墙。

我正在使用Score()方法尝试重视我的所有卡片。我有一个foreach循环,其中包含switch

问题是Ace。 我想说如果超过1个Ace,则将它们全部视为其他11。

public int Score()
{
    int score = 0;

    foreach (Card c in hand)
    {
        switch (c.Value)
        {
        // Count all face cards as 10
        case 'A':
            score += 1;
            break;
        case 'T':
        case 'J':
        case 'K':
        case 'Q':
            score += 10;
            break;
        default:
            score += (c.Value - '0');
            break;
        }

        //if (score > 21)
        //    switch (c.Value)
        //    {
        //        case 'A':
        //            score += 11;
        //            break;
        //    }
    }
    return score;
}

我评论了我正在玩的一个部分,但是我无法绕过试图编码&#39;如果不止一个ace,值为1,否则11&#39; < / p>

4 个答案:

答案 0 :(得分:1)

我会采用一个单独的变量来计算aces并在最后对其进行评估。如果1 ace存在则添加11,否则添加1 * numberOfAces。

在foreach循环之外的分数旁边添加它。所以在案例“A”的分数评估应该在循环结束后完成并且你有aces计数。

答案 1 :(得分:1)

我能想到的其中一种方法是为Aces添加一个计数器。实际上,case A:将是:

case 'A':
    score+=1;
    ctrA++;
    break;

switch之外:

if(ctrA == 1) //only one ace
    score+= 10;  //add 10 to make the score for that ace 11.

答案 2 :(得分:0)

我建议在切换案例中和之后添加更多逻辑。例如,您可以使用计数器来跟踪手中有多少Aces。例如:

  public int Score()
{
    int score = 0;
    int amountOfAces = 0;


    foreach (Card c in hand)
    {
        switch (c.Value)
        {
                // Count all face cards as 10
            case 'A':
                amountOfAces++;// increment aces by 1
                score += 11;
                break;
            case 'T':
            case 'J':
            case 'K':
            case 'Q':
                score += 10;
                break;
            default:
                score += (c.Value - '0');
                break;
        }

      // Then adjust score if needed
     if(amountOfAces>1){
        //since we know how many were found.
        score = score-amountOfAces*11;
        score = score+amountOfAces;
        }

    }
    return score;
}

答案 3 :(得分:0)

您可能希望Ace在其他场景中计为1,而不仅仅是&#34;多于一个ace&#34;。如果用户有一个Jack,Three,Ace,你希望Ace计为1.我会把所有不是A的牌加起来并加起来。然后取多少A减去1并将该计数加到总数中。最后,检查你的总数是否< 11,你可以将Ace计数为11,否则,你必须将它计为1。

public int Score()
{
    var score = 0;
    var aceCount = 0;

    foreach (Card c in hand)
    {
        switch (c.Value)
        {
            case 'A':
                aceCount++;
                break;
            case 'T':
            case 'J':
            case 'K':
            case 'Q':
                score += 10;
                break;
            default:
                score += (c.Value - '0');
                break;
        }
    }

    if(aceCount == 0)
    {
        return score;
    }

    //Any ace other than the first will only be worth one point.
    //If there is only one ace, no score will be added here.
    score += (aceCount-1);

    //Now add the correct value for the last Ace.
    if(score < 11)
    {
        score += 11;
    }
    else
    {
        score++;
    }

    return score;
}