我如何根据只有一张还是不止一张来对卡片进行不同的估值
本文关键字:一张 何根 不止 | 更新日期: 2023-09-27 17:54:05
我一直在做这个纸牌游戏作为家庭作业,但是遇到了瓶颈。
我在Score()
方法中工作,试图评估我所有的卡片。我有一个foreach
环和一个switch
环。
问题是Ace。我想说,如果超过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;
}
我注释掉了一个我正在玩的部分,但我只是不能把我的头围绕着试图编码'if多于一个a, value为1,否则11'
我将使用一个单独的变量来计数a,并在最后对其进行计算。如果有1张,则加11,否则加1 * numberOfAces。
将其添加到分数旁边,在foreach循环之外。因此,情况"A"的分数评估应该在循环结束后进行,并且您有A计数。
我能想到的一种方法是为ace添加计数器。有效地,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.
您可能希望在其他情况下将a计数为1,而不仅仅是"多个a"。如果用户有j, 3, a,你想让a计数为1。我会把所有不是a的牌加起来。然后用a的个数减去1,把这个数加到总数中。最后,核对一下您的总金额是否为<11,你可以把a记为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;
}
我建议在您的开关案例中添加更多逻辑。例如,你可以使用计数器来记录手中有多少张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;
}