有没有一种优雅的方式来应对二十一点的王牌?

我的孩子有一个家庭作业,用Java编写Blackjack。 我帮助了他一点但是大部分时间他都是自己做的,而且实际上打得很好。 他甚至发现了一个错误,我没有看到它是如何计算手值的。 然而,有一个他没有处理过的障碍,我能想到的每个解决方案都非常复杂,并且超出了他能够轻松编写他仍然基本的Java技能的能力。

王牌。 事实上,不仅仅是一个Ace,其中有四个,你可以用一只手拿到所有四个。 当有一个或多个A时,你如何优雅地计算一手牌的价值,每个A值可能在一个或十一个值。 我觉得应该有一个优雅的算法,但我没有看到它。 当然,部分原因可能就是我累了,但也许你可以提供帮助。

只需将每个ace视为11.然后当值超过21时,从手中每个ace的总数中减去10。

你只会在11分中使用1个ace。 因此,将除最后一个ace之外的所有ace计算为1,如果有10个或更少的点,则最后一个ace计为10。

只有1个Ace算作11。

因此,将每个Ace处理为11的另一种方法是将每个Ace视为1.然后将总数加10(无论手头是否携带),并将其保存在单独的“高”变量(值+10)中。 还要创建~camp的布尔值:如果(任何)ace出现,则为true。

因此,在检查经销商的分数时; 检查球员的牌是否有(任何)Ace,在这种情况下你(可以)使用“高”值,否则(没有Ace)使用“低”值。

那样King + 9 + Ace(可能是坏例子)将是〜低:20&high:30&ace:true – 有了这些信息,你可以检查30 – 10是否会“赢得比赛”。 所以,King + 5 + 5(低:20高:30 ace:false)将不会使用它的高值30。

我正在使用这种方法所以我知道什么时候显示alt。 屏幕上的Ace得分; 像3/13(Ace + 2),使用相同的ace:true | false布尔我已经拥有。 这肯定和第一个给出的答案相同,但这对我来说更有意义:)

无论每个ace都应该计算为11的总和值,那么当总和超过21时,从手中减去10,但事情是你必须确保你计算你减去10的次数和数量你添加11(一个ace)的时间,

添加11> =减去10 – 必须始终满足

算例:

int sum=0; int ace=0; int subtract=0; while(!busted or !stay) { Hitme(value); if(value=11)ace++; sum+=value; if(sum>21) { if(ace>=1) { if(ace>=subtract) { sum-=10 subtract++; } else { busted; } } else { busted; } } else { hit or stay; //of course if sum== 21 then force stay } } 

与elundmark的答案类似……

你最有可能得到一个评估二十一点手值的方法。 总是在一点上评价aces。 如果一只手牌中包含一张ace,则计算一个硬值(所有a为1,+ 10)和一个软值(所有a值为1)。

如果硬值不是破产,则返回硬值。 如果硬值为半身,则返回软值。

例1
2,A,A
硬值2 + 1 + 1 + 10 = 14
软值= 2 + 1 + 1 = 4

硬值<21,所以返回硬值(手值为14)

例2
2,A,A,8
硬值= 2 + 1 + 1 + 8 + 10 = 22(胸围)
软值= 2 + 1 + 1 + 8 = 12

硬值> 21,所以返回软值(手值为12)

关于规则和游戏方式的传统思考是,Ace的值是有条件的,可以有两个值,1或11.这个概念很难实现。 程序员可以更轻松地将所有Aces计算为1的值,并有条件地将10个点添加到手值。 这样,您的卡片级别或价值实施可以保持严格和直接。 我之前通过返回一组值和一些其他方法来实验。 这是一个痛苦,并不值得只有一个Ace级别。

如果要在屏幕上显示alt,如2/12,而不是返回Integer,只需返回一个“BlackjackValue”对象,该对象包含您在评估手值的方法中创建的Integer和String对象。

 short aces_count = 0; short non_aces_sum = 0; short global_sum = 0; foreach card in _card:{ if( card.value != 11 ){ // assuming ace value is 11 if( card.value > 10 ) non_aces_sum += 10; else non_aces_sum += card.value }else aces_count += 1; } short aces_sum = 0; if( aces_count > 0) aces_sum = 11; for(int i=0 ; i < aces_count - 1; i++){ // - 1 cuz already asigned first ace aces_sum += 1; // 2x aces == 22 so max 1 ace has value 11 } if(aces_sum + non_aces_sum > 21) aces_sum = aces_count; // no need for an 11 value ace, so all are 1 global_sum = non_aces_sum + aces_sum; 

问题是它没有确定:你可以计算(根据我的理解规则)一个Ace为1或11.但是你知道你不会每次都把它算作11,因为你会破产。

我认为唯一的解决方案是计算ace的每个可能值的分数,其中总和<= 21。