13张扑克牌排序算法

来源:互联网 发布:2017网络征文大赛 编辑:程序博客网 时间:2024/04/30 23:30

上次写了一篇52张扑克牌的算法,写的将一副扑克(去掉大小王)之后的排序,排序是按照数字和花式排列的。数字从大到小,花式从黑桃,梅花,红心,方块。后来有一个网友回复,还希望看到13张扑克牌的排序算法——这个算法是按照我们打牌的常规排法,把数量多的放前面,数量相同的比大小。可以参考文章的输出结果看。

完整代码如下:

 

view plaincopy to clipboardprint?
  1. class PokerSorterDemo  
  2. {  
  3.     static string[] numberArray = { "2""3""4""5""6""7""8""9""10""J""Q""K""A" };  
  4.     static char[] suitArray = { '♠''♣''♥''♦' };  
  5.   
  6.     class Poker  
  7.     {  
  8.         public Poker()  
  9.         {  
  10.             this.Suits = new List<char>();  
  11.         }  
  12.   
  13.         public List<char> Suits { getset; }  
  14.         public int Number { getset; }  
  15.   
  16.         public override string ToString()  
  17.         {  
  18.             StringBuilder sb = new StringBuilder();  
  19.             foreach (char c in suitArray)  
  20.             {  
  21.                 if (this.Suits.Contains(c))  
  22.                 {  
  23.                     sb.AppendLine(string.Format("{0}{1}", c, numberArray[this.Number - 2])); // 这个地方的2只是为了调试时,方便阅读  
  24.                 }  
  25.             }  
  26.   
  27.             return sb.ToString();  
  28.         }  
  29.     }  
  30.   
  31.     class PokerList : List<Poker>  
  32.     {  
  33.         public void Add(string poker)  
  34.         {  
  35.             string num = poker.Substring(1);  
  36.             int number = numberArray.ToList().IndexOf(num) + 2; // 这个地方的2,只是为了调试方便  
  37.   
  38.             if (this.Any(p => p.Number == number))  
  39.             {  
  40.                 Poker find = this.Find(p => p.Number == number);  
  41.                 find.Suits.Add(poker[0]);  
  42.             }  
  43.             else  
  44.             {  
  45.                 Poker p = new Poker { Number = number };  
  46.                 p.Suits.Add(poker[0]);  
  47.                 this.Add(p);  
  48.             }  
  49.         }  
  50.     }  
  51.   
  52.     private static void Main()  
  53.     {  
  54.         GenerateRandPoker3();  
  55.         PokerSorter2();  
  56.     }  
  57.   
  58.     private static void PokerSorter2()  
  59.     {  
  60.         PokerList list = new PokerList();  
  61.         using (StreamReader file = new StreamReader("Poker.txt", Encoding.UTF8))  
  62.         {  
  63.             string line;  
  64.             while ((line = file.ReadLine()) != null)  
  65.             {  
  66.                 if (line.Trim().Length > 0)  
  67.                 {  
  68.                     list.Add(line.Trim());  
  69.                 }  
  70.             }  
  71.             file.Close();  
  72.         }  
  73.   
  74.         var result = from p in list  
  75.                      orderby p.Suits.Count descending, p.Number descending  
  76.                      select p;  
  77.   
  78.         using (StreamWriter file = new StreamWriter("SortedPoker.txt"false, Encoding.UTF8))  
  79.         {  
  80.             foreach (Poker item in result)  
  81.             {  
  82.                 file.Write(item.ToString());  
  83.             }  
  84.             file.Close();  
  85.         }  
  86.     }  
  87.   
  88.     private static void GenerateRandPoker3()  
  89.     {  
  90.   
  91.   
  92.         List<string> list = new List<string>();  
  93.         for (int i = 0; i < numberArray.Length; i++)  
  94.         {  
  95.             for (int j = 0; j < suitArray.Length; j++)  
  96.             {  
  97.                 list.Add(string.Format("{0}{1}", suitArray[j], numberArray[i]));  
  98.             }  
  99.         }  
  100.   
  101.         using (StreamWriter file = new StreamWriter("Poker.txt"false, Encoding.UTF8))  
  102.         {  
  103.             Random r = new Random();  
  104.             while (list.Count > 39)  
  105.             {  
  106.                 int i = r.Next(0, list.Count - 1);  
  107.                 file.WriteLine(list[i]);  
  108.   
  109.                 list.RemoveAt(i);  
  110.             }  
  111.   
  112.             file.Close();  
  113.         }  
  114.     }  
  115. }  

 

先定义了一个Poker的类,来标记一副牌中所包含的同数字的所有牌,例如13张牌中有4个A,那么一个Poker都代表这4个A,用Number,代表牌代表的数字,在上面的代码中,Number代表了扑克牌,在numberArray中的索引。Suits,代表了Poker都包含的花式有几个,对于一副牌,最多有4个。如果两副牌最多有8个。关键的排序算法,在上述代码中用到了LINQ。当然,不用LING也是可以的,可以用以下代码代替。

 

view plaincopy to clipboardprint?
  1. private static int ComparePoker(Poker p1, Poker p2)  
  2. {  
  3.     Debug.Assert(p1 != null && p2 != null);  
  4.   
  5.     if (p1.Suits.Count == p2.Suits.Count)  
  6.     {  
  7.         return p2.Number - p1.Number;  
  8.     }  
  9.     else  
  10.     {  
  11.         return p2.Suits.Count - p1.Suits.Count;  
  12.     }  
  13. }  

 

然后在调用的地方修改为:

 

view plaincopy to clipboardprint?
  1. //var result = from p in list  
  2. //             orderby p.Suits.Count descending, p.Number descending  
  3. //             select p;  
  4. list.Sort(ComparePoker);  
  5.   
  6. using (StreamWriter file = new StreamWriter("SortedPoker.txt"false, Encoding.UTF8))  
  7. {  
  8.     //foreach (Poker item in result)  
  9.     foreach (Poker item in list)  
  10.     {  
  11.         file.Write(item.ToString());  
  12.     }  
  13.     file.Close();  
  14. }  

 

程序允许的结果如下,Poker.txt

 

view plaincopy to clipboardprint?
  1. ♥4  
  2. ♣10  
  3. ♦K  
  4. ♠4  
  5. ♥7  
  6. ♦6  
  7. ♥A  
  8. ♦4  
  9. ♠6  
  10. ♣9  
  11. ♦8  
  12. ♣3  
  13. ♠5  

 

SortedPoker.txt

 

view plaincopy to clipboardprint?
  1. ♠4  
  2. ♥4  
  3. ♦4  
  4. ♠6  
  5. ♦6  
  6. ♥A  
  7. ♦K  
  8. ♣10  
  9. ♣9  
  10. ♦8  
  11. ♥7  
  12. ♠5  
  13. ♣3  

 

原创粉丝点击