0

古典的なポーカー/カード ゲーム タイプのプログラムでフラッシュを作ろうとしています。プロパティはスート (ハート、ダイヤなど) で、配列はハンドです。私はIEquatableを使用し、Equalsメソッドを実装しました

    public bool Equals(SuperCard otherCard)
    {
        if (otherCard == null)
            return false;
        return (this.cardSuit.Equals(otherCard.cardSuit));
    }

そこから Program.cs で、.Equals を使用して、Flush の bool メソッドを作成しています。for ループを使用するように提案されましたが、これを正しく行っているかどうかを理解するのに苦労しています。cardSuit プロパティをカードごとに比較する必要があります。しかし、私はそれについてどうやって行くのか分かりません。どんな助けでも大歓迎です。これまでの方法で私が持っているものは次のとおりです。

    private static bool Flush(SuperCard[] hand)
    {
        for (int i = 0; i < hand.Length; i++)
        {
            if (hand[i].Equals(hand[i + 1]) == false)
            {
                return false;
            }
        }
        return hand[hand.Length].Equals(hand[hand.Length - 1]);
    }

私の考えでは、for ループは各カードを比較して false を探し、そうであれば false を返します。for ループの外側/後 (それらがすべて true であると仮定)、ハンドの最後の 2 枚のカードの比較の true/false を返します。私はそれを複雑にしすぎていますか?違いますか?

編集:私はこれを見ることができます:「if (hand[i].Equals(hand[i + 1]) == false)」は範囲外の例外になるため、カードとカードを比較する新しい方法が必要です。何か案は?

4

2 に答える 2

2

これを行うためのはるかに簡単な方法があります

private static bool Flush(SuperCard[] hand)
{
    if(hand.Length == 0)
       return false;
    var suit = hand[0].cardSuit;
    return hand.All(c => c.cardSuit == suit);
}
于 2013-12-02T08:42:51.007 に答える
1

まず、(可能性のある)スタック オーバーフローに注意してください。

public bool Equals(SuperCard otherCard)
{
    // "otherCard == null" usually calls "Equals" method which in turn 
    // calls "Equals" again and again...
    if (Object.ReferenceEquals(otherCard, null)) // <- No "==" or "Equal" - just reference test
        return false;

    return (this.cardSuit.Equals(otherCard.cardSuit));
}

もう 1 つの問題はRangeCheckError です(ループ条件の「長さ - 1」を参照)。

private static bool Flush(SuperCard[] hand)
{
    if (Object.ReferenceEquals(null, hand))
      return false;

    for (int i = 0; i < hand.Length - 1; i++) // <- Pay attention to "Length - 1"
    {
        if (!hand[i].Equals(hand[i + 1]))     // <- "== false" is quite awkward
        {
            return false;
        }
    }

    // You don't need any additional checks here:
    // A[0] = A[1] = ... = A[length - 1]
    return true;
}
于 2013-12-02T08:42:34.317 に答える