C# 计算21点中的手值
我正在用C#实现一个小游戏,我在计算玩家的手牌值时遇到了以下问题。根据玩家的手牌,Aces的值可能为1或11。如果玩家有三张牌和一张王牌,那么如果牌的总数就不那么复杂了C# 计算21点中的手值,c#,blackjack,C#,Blackjack,我正在用C#实现一个小游戏,我在计算玩家的手牌值时遇到了以下问题。根据玩家的手牌,Aces的值可能为1或11。如果玩家有三张牌和一张王牌,那么如果牌的总数就不那么复杂了 您只需添加所有其他卡,并找到手牌的较低值 现在您有两个案例: sum如上所述,您应该能够使用extension方法实现这一点 编写一个实现算法的函数并使用它: IEnumerable<int> cards = // card values var f = (int i1, int i2) => // imp
- 您只需添加所有其他卡,并找到手牌的较低值
- 现在您有两个案例:
sum如上所述,您应该能够使用extension方法实现这一点 编写一个实现算法的函数并使用它:
IEnumerable<int> cards = // card values var f = (int i1, int i2) => // implement algorithm here var result = cards.Aggregate(f);
将所有非ACE的值相加,并添加ACE的数量:2,Q,A,A=2+10+(2)=14 然后从21:21-14=7中减去 这个数字是否小于10(如果只有1个ace==11)?小于20(如果两个ACE==11)IEnumerable卡片=//卡片值 var f=(inti1,inti2)=>//在这里实现算法 var结果=卡片。合计(f);
因为这感觉像是家庭作业,所以这并不是一个完整的答案,但应该指导你。从我的角度来看,你必须考虑这样一个事实,即当球员有一个或多个A时,他或她在任何给定时间都有两个可能的分数。试图计算最接近21的单个值是对21点中持有a的含义的错误抽象 作为一名球员,我不希望程序告诉我,当我有ace&5时,我有16个,因为我可能不会受到16的打击,但如果我有ace&5,我绝对会受到打击。从概念上讲,我确实有6个或16个 我认为手的价值应该表现为一个或两个价值。显然,在没有ace的情况下,只有一个值。同样,当ace as 11表示损坏的手时,该手只有一个值,因为该ace必须计为1。你也可以说任何ace+10组合只有一个值,因为那就是即时21点 这是一个部分实现——剥这只猫皮的许多方法之一。我这样写是为了让你以某种方式思考;但是,考虑到只有ACE可以有多个值,并且给定的手最多可以有两个可能的值,这可以更简洁地完成public interface Hand { IEnumerable<int> PossibleValues { get; set; } } public interface Card { CardValues PossibleValues { get; set; } } public interface CardValues { int Value1 { get; } int Value2 { get; } } public class BlackjackHand : Hand { IList<Card> cards; public IEnumerable<int> PossibleValues { IList<int> possible_values = new List<int>(); int initial_hand_value = cards.Sum(c => c.Value1); if(initial_hand_value <= 21) { possible_values.Add(initial_hand_value); yield return initial_hand_value; } foreach(Card card in cards.Where(c => c.Value2 > 0)) { IList<int> new_possible_values = new List<int>(); foreach(int value in possible_values) { var alternate_value = value + card.Value2; if(alternate_value <= 21) { new_possible_values.Add(alternate_value); yield return alternate_value; } } possible_values.AddRange(new_possible_values); } yield break; } }
公共接口手 { IEnumerable可能值{get;set;} } 公共接口卡 { CardValues可能值{get;set;} } 公共接口值 { int值1{get;} int值2{get;} } 公共类黑手:黑手 { IList卡; 公共IEnumberable可能值 { IList可能的_值=新列表(); int initial_hand_value=cards.Sum(c=>c.Value1); 如果(初始值c.Value2>0)) { IList new_可能的_值=new List(); foreach(可能的_值中的int值) { var alternate_值=值+卡。值2;
if(alternate_value这样想可能最简单——每发一张牌,将牌值加在总计数A中为11。如果该牌是A,且玩家被击溃,则减去10。 例如:int total = 0; ... int hit = GetHit(); total = total + hit; if (total > 21 && hit == 11) { total = total - 10 } // check if player busted, etc
在最初的交易中,您可以使用GetHit()来“交易”牌,也可以处理Ace(只有两张牌有问题)你自己动手。这将永远给你尽可能高的一手牌。我认为假设玩家知道一张A可以是1或11是可以的,所以用A-5击球永远不会导致玩家破产。这是家庭作业吗?你能重新表述这个问题/你想达到什么目的吗?你想知道用户在o中需要多少张A吗为了得到21张牌?假设他有5张,2张,4张,那么用户需要10张A?这还不太清楚-你知道玩家手里有什么牌,你在计算他的牌值多少?或者你在猜测玩家手里有什么牌?