C# 我如何根据是否存在';是一个还是不止一个?

C# 我如何根据是否存在';是一个还是不止一个?,c#,blackjack,C#,Blackjack,我一直在做这个纸牌游戏做作业,结果撞到了墙 我正在使用Score()方法对我所有的卡进行估价。我有一个带有开关的foreach循环 问题是王牌。 我想说的是,如果超过1张A,则将它们全部视为1张其他11张 public int Score() { int score = 0; foreach (Card c in hand) { switch (c.Value) { // Count all face cards as 1

我一直在做这个纸牌游戏做作业,结果撞到了墙

我正在使用
Score()
方法对我所有的卡进行估价。我有一个带有
开关的
foreach
循环

问题是王牌。 我想说的是,如果超过1张A,则将它们全部视为1张其他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;
}

我注释掉了一个我一直在玩的部分,但我就是不能在试图编码“如果有多个ace,值为1,否则为11”时绞尽脑汁。

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


将其添加到分数旁边,foreach循环之外。因此,案例“A”中的分数评估应该在循环完成并且您拥有aces计数后进行。

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

  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;
}

我能想到的方法之一是为ACE添加计数器。实际上,
案例A:
将是:

case 'A':
    score+=1;
    ctrA++;
    break;
开关的外部

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

除了“多个Ace”之外,您可能希望Ace在其他场景中计为1。如果用户有一个Jack,3,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;
} 
public int Score()
{
var得分=0;
var aceCount=0;
foreach(手中的卡c)
{
开关(c值)
{
案例“A”:
aceCount++;
打破
案例“T”:
案例“J”:
案例“K”:
案例‘Q’:
分数+=10分;
打破
违约:
分数+=(c.值-'0');
打破
}
}
如果(aceCount==0)
{
返回分数;
}
//第一张以外的任何一张王牌只值一分。
//如果只有一张A,此处将不添加分数。
得分+=(aceCount-1);
//现在为最后一个Ace添加正确的值。
如果(分数<11)
{
分数+=11分;
}
其他的
{
分数++;
}
返回分数;
} 

21点的正确解释是:所有A都算一。如果该手牌至少包含一个ace且其总数小于12,则添加10。就这样。