Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算21点中的手值_C#_Blackjack - Fatal编程技术网

C# 计算21点中的手值

C# 计算21点中的手值,c#,blackjack,C#,Blackjack,我正在用C#实现一个小游戏,我在计算玩家的手牌值时遇到了以下问题。根据玩家的手牌,Aces的值可能为1或11。如果玩家有三张牌和一张王牌,那么如果牌的总数就不那么复杂了 您只需添加所有其他卡,并找到手牌的较低值 现在您有两个案例: sum如上所述,您应该能够使用extension方法实现这一点 编写一个实现算法的函数并使用它: IEnumerable<int> cards = // card values var f = (int i1, int i2) => // imp

我正在用C#实现一个小游戏,我在计算玩家的手牌值时遇到了以下问题。根据玩家的手牌,Aces的值可能为1或11。如果玩家有三张牌和一张王牌,那么如果牌的总数就不那么复杂了

  • 您只需添加所有其他卡,并找到手牌的较低值
  • 现在您有两个案例:

    • sum如上所述,您应该能够使用extension方法实现这一点

      编写一个实现算法的函数并使用它:

      IEnumerable<int> cards = // card values
      var f = (int i1, int i2) => // implement algorithm here
      var result = cards.Aggregate(f);
      
      IEnumerable卡片=//卡片值
      var f=(inti1,inti2)=>//在这里实现算法
      var结果=卡片。合计(f);
      
      将所有非ACE的值相加,并添加ACE的数量:2,Q,A,A=2+10+(2)=14

      然后从21:21-14=7中减去

      这个数字是否小于10(如果只有1个ace==11)?小于20(如果两个ACE==11)


      因为这感觉像是家庭作业,所以这并不是一个完整的答案,但应该指导你。从我的角度来看,你必须考虑这样一个事实,即当球员有一个或多个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?这还不太清楚-你知道玩家手里有什么牌,你在计算他的牌值多少?或者你在猜测玩家手里有什么牌?