13张扑克牌排序算法
来源:互联网 发布:2017网络征文大赛 编辑:程序博客网 时间:2024/04/30 23:30
上次写了一篇52张扑克牌的算法,写的将一副扑克(去掉大小王)之后的排序,排序是按照数字和花式排列的。数字从大到小,花式从黑桃,梅花,红心,方块。后来有一个网友回复,还希望看到13张扑克牌的排序算法——这个算法是按照我们打牌的常规排法,把数量多的放前面,数量相同的比大小。可以参考文章的输出结果看。
完整代码如下:
view plaincopy to clipboardprint?
- class PokerSorterDemo
- {
- static string[] numberArray = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
- static char[] suitArray = { '♠', '♣', '♥', '♦' };
-
- class Poker
- {
- public Poker()
- {
- this.Suits = new List<char>();
- }
-
- public List<char> Suits { get; set; }
- public int Number { get; set; }
-
- public override string ToString()
- {
- StringBuilder sb = new StringBuilder();
- foreach (char c in suitArray)
- {
- if (this.Suits.Contains(c))
- {
- sb.AppendLine(string.Format("{0}{1}", c, numberArray[this.Number - 2]));
- }
- }
-
- return sb.ToString();
- }
- }
-
- class PokerList : List<Poker>
- {
- public void Add(string poker)
- {
- string num = poker.Substring(1);
- int number = numberArray.ToList().IndexOf(num) + 2;
-
- if (this.Any(p => p.Number == number))
- {
- Poker find = this.Find(p => p.Number == number);
- find.Suits.Add(poker[0]);
- }
- else
- {
- Poker p = new Poker { Number = number };
- p.Suits.Add(poker[0]);
- this.Add(p);
- }
- }
- }
-
- private static void Main()
- {
- GenerateRandPoker3();
- PokerSorter2();
- }
-
- private static void PokerSorter2()
- {
- PokerList list = new PokerList();
- using (StreamReader file = new StreamReader("Poker.txt", Encoding.UTF8))
- {
- string line;
- while ((line = file.ReadLine()) != null)
- {
- if (line.Trim().Length > 0)
- {
- list.Add(line.Trim());
- }
- }
- file.Close();
- }
-
- var result = from p in list
- orderby p.Suits.Count descending, p.Number descending
- select p;
-
- using (StreamWriter file = new StreamWriter("SortedPoker.txt", false, Encoding.UTF8))
- {
- foreach (Poker item in result)
- {
- file.Write(item.ToString());
- }
- file.Close();
- }
- }
-
- private static void GenerateRandPoker3()
- {
-
-
- List<string> list = new List<string>();
- for (int i = 0; i < numberArray.Length; i++)
- {
- for (int j = 0; j < suitArray.Length; j++)
- {
- list.Add(string.Format("{0}{1}", suitArray[j], numberArray[i]));
- }
- }
-
- using (StreamWriter file = new StreamWriter("Poker.txt", false, Encoding.UTF8))
- {
- Random r = new Random();
- while (list.Count > 39)
- {
- int i = r.Next(0, list.Count - 1);
- file.WriteLine(list[i]);
-
- list.RemoveAt(i);
- }
-
- file.Close();
- }
- }
- }
先定义了一个Poker的类,来标记一副牌中所包含的同数字的所有牌,例如13张牌中有4个A,那么一个Poker都代表这4个A,用Number,代表牌代表的数字,在上面的代码中,Number代表了扑克牌,在numberArray中的索引。Suits,代表了Poker都包含的花式有几个,对于一副牌,最多有4个。如果两副牌最多有8个。关键的排序算法,在上述代码中用到了LINQ。当然,不用LING也是可以的,可以用以下代码代替。
view plaincopy to clipboardprint?
- private static int ComparePoker(Poker p1, Poker p2)
- {
- Debug.Assert(p1 != null && p2 != null);
-
- if (p1.Suits.Count == p2.Suits.Count)
- {
- return p2.Number - p1.Number;
- }
- else
- {
- return p2.Suits.Count - p1.Suits.Count;
- }
- }
然后在调用的地方修改为:
view plaincopy to clipboardprint?
-
-
-
- list.Sort(ComparePoker);
-
- using (StreamWriter file = new StreamWriter("SortedPoker.txt", false, Encoding.UTF8))
- {
-
- foreach (Poker item in list)
- {
- file.Write(item.ToString());
- }
- file.Close();
- }
程序允许的结果如下,Poker.txt
view plaincopy to clipboardprint?
- ♥4
- ♣10
- ♦K
- ♠4
- ♥7
- ♦6
- ♥A
- ♦4
- ♠6
- ♣9
- ♦8
- ♣3
- ♠5
SortedPoker.txt
view plaincopy to clipboardprint?
- ♠4
- ♥4
- ♦4
- ♠6
- ♦6
- ♥A
- ♦K
- ♣10
- ♣9
- ♦8
- ♥7
- ♠5
- ♣3