-1

抱歉,我对问题的标题做得不太好,希望它会通过一些代码来体现

我创建了一个存储扑克手信息的类,如下所示

public class BestHandSummary<T>
{
    public Func<T, bool> Test { get; set; }
    public Ranking Rank { get; set; } //Enum: Nothing, TwoPair, Straight, Flush, Poker :in ascending order
    public int BestCard { get; set; }
    public BestHand(Ranking r)
    {
        Rank = r;
    }
    ..//default ctor
}

我按照最有价值手牌的顺序初始化了规则集合,这样当我采用匹配规则的 First() 时,最强大的手牌将被选为最佳手牌。

rules = new List<BestHandSummary<PokerHand>>()
{
    new BestHandSummary<PokerHand> { Test = h => h.HandContainsFourOfAKind(out bestCard), 
                              Rank = Ranking.FourOfAKind,
                              BestCard = bestCard },
    new BestHandSummary<PokerHand> { Test = h => h.HandContainsFlush(), 
                              Rank = Ranking.Flush },
    new BestHandSummary<PokerHand> { Test = h => h.HandContainsStraight(out bestCard), 
                              Rank = Ranking.Straight,
                              BestCard = bestCard },
    new BestHandSummary<PokerHand> { Test = h => h.HandContainsTwoPair(out bestCard), 
                                      Rank = Ranking.Straight,
                                      BestCard = bestCard },

};
private BestHandSummary<PokerHand> GetAPlayersBestHand(PokerHand hand)
{
   bool hasAny = rules.Any(r => r.Test(hand));
   if (hasAny)
   {
       return rules.Where(r => r.Test(hand) == true).First();
   }
   return new BestHandSummary<PokerHand>(Ranking.Nothing);
}

我似乎无法弄清楚的是如何将输出参数 bestCard 隧道化到 BestHandSummary 类的 BestCard 属性中?上面的代码不起作用,BestCard = bestCard 没有被分配,我可以理解为什么,但我想知道是否有任何小的改变可以修复它..

4

2 回答 2

1
int bestCard;

new BestHand<PokerHand> { Test = h => h.HandContainsFourOfAKind(out bestCard), 
                              Rank = Ranking.FourOfAKind,
                              BestCard = bestCard },

此代码不起作用,因为HandContainsFourOfAKind从未调用过,因此没有分配给bestCard.

当规则匹配时,我只对 bestCard 感兴趣。它用于两个玩家之间的平局。EG H= 22KJJ -> 最好的牌是杰克,而不是国王

那么,您只想BestCardTest被调用时被分配?这会做。

var hand = new BestHand<PokerHand> {Rank = Ranking.FourOfAKind};
hand.Test = h => 
     {
        int bestCard; //var local to the lambda's scope
        bool contains = h.HandContainsFourOfAKind(out bestCard);
        hand.BestCard = bestCard;
        return contains;
     };
于 2014-02-17T10:47:40.293 回答
0

几年前我自己写了一个均衡器。我没有直接回答你的问题,但我想到了一件事:

在你的例子中,如果你只看最好的牌,比如两对手牌中的杰克,你不会找出最好的牌,如果两者都有相同的两对不同的起脚牌。您可能必须使用第三种方法。也许你最好一次性做到这一点。我用一个 if-monster 解决了这个问题,它返回了一个精确的 long-value,表示其中的每张牌都是该手牌的价值。

于 2014-02-17T12:02:37.723 回答