-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);
}

私が理解できないように見えるのは、out param 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 だけに興味があります。2 人のプレイヤーの間で引き分けが発生した場合に使用されます。EG H= 22KJJ -> 最高のカードはキングではなくジャック

が呼び出されBestCardたときだけ割り当てられますか? Testこれで十分です。

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

私は数年前に自分でイコライザーを書きました。あなたの質問に対する直接的な答えはありませんが、1 つのことが頭に浮かびます。

あなたの例では、ツーペア ハンドでジャックのようにランクを構築することを含む最高のカードを見るだけでは、両方が異なるキッカーで同じツーペアを持っている場合、最高のハンドはわかりません。その上で3番目の方法を使用する必要があるかもしれません。たぶん、あなたはこれを一枚で行う方が良いでしょう. 私はこれを if-monster で解決しました。これは正確な long-value を返し、そのハンドのすべてのカードの値を示します。

于 2014-02-17T12:02:37.723 に答える