LINQ サンプル
最近、暇を見てちょっとづつ大富豪をC#で作ってたりする。
改めて思うけど、LINQ to Object は便利だ。
[0, max) の範囲の数字をシャッフル
Random rnd = new Random(); Enumerable.Range(0, max) .OrderBy(x => rnd.Next());
イテレーターeをN分の1程度にランダムに間引く
e.Where(x => rnd.Next() < int.MaxValue / N);
同ランクのカードの判定
(ジョーカーはワイルドカード扱い。)
static bool IsSameRank(IEnumerable<Card> cards) { return cards .Where(x => x.Suit != Suit.Joker) .Select(x => x.Rank) .Distinct() .Count() <= 1; }
同スイートカードの判定
(ジョーカー無視。)
public static bool IsSameSuit(IEnumerable<Card> cards) { return cards.Select(x => x.Suit).Distinct().Count() == 1; }
同スイート連番判定
(ジョーカー無視。)
bool IsSequence(IEnumerable<Card> cards) { if (!IsSameSuit(cards)) return false; // ランクでソート済みにする。 var ranks = cards .Select(c => Rank(c)) // Rank() は大富豪的ランク(2が最強)に変換 .OrderBy(r => r); // ranks の階差が全部1になっているかどうか判定 // 実際に書いたコードはワイルドカードにも対応していて、結構長めなので割愛。 }