C#代码实现扑克牌排序的几种方式

扑克牌游戏,总是能用到很多的手牌排序,总结了几种方式供参考,顺便记录一下方便以后使用。

我做的这个是由(1-13:黑桃A-K || 14 - 26:红桃 || 27 - 39:梅花 || 39 - 52 : 方片 || 53.54:小王.大王)表示的一副扑克牌,这样对数组除以13等于扑克花色(如:25/13 = 2 是红桃),对数组值取模等于扑克点数(如:25%13 = 12 是Q),这样25就表示了红桃Q的扑克牌。

当处理特殊规则的时候单独写一个List,在组拼就可以了。

比如说:赖子斗地主的时候,当选出赖子牌之后,就需要对手牌再次排序,那么new List来存一下赖子牌,选定赖子牌之后,存到list中,再次调用排序,组拼就可以实现,你想要的手牌排序的数组,那么在通过某种形式让他显示出来就可以了。

上代码 :

 //参数:要排序的牌值数组 & 数组长度
 public int[] PaiXu(int[] card, int number = 0)
 {
    //Debug.Log(" ... 对手牌 进行 牌值 花色 的排序 ... ... ");
    if (number == 0){ number = card.Length; }
    if (card.Length == 0){ return card; }
    // ========== 根据牌值进行排序 ===============
    int temp = 0;
    for (int i = 0; i < card.Length; i++) //冒泡排序... 从大到小
    {
      for (int j = 0; j < card.Length - 1 - i; j++)
      {
        if (card[j] < card[j + 1])
        {
          temp = card[j];
          card[j] = card[j + 1];
          card[j + 1] = temp;
        }
      }
    }
    List<int> hei = new List<int>();
    List<int> hong = new List<int>();
    List<int> mei = new List<int>();
    List<int> fang = new List<int>();
    List<int> wang = new List<int>();
    for (int i = 0; i < card.Length; i++)
    {
      #region ======= 根据花色分组 ..大小王 单独一组 ...后续对花色中的 A 单独处理 =========
      switch (sendFlower(card[i]))
      {
        case 3: //黑桃
          hei.Add(card[i]);
          break;
        case 2: //红桃
          hong.Add(card[i]);
          break;
        case 1: //梅花
          mei.Add(card[i]);
          break;
        case 0: //方片
          fang.Add(card[i]);
          break;
        case 4: //小王
        case 5: //大王
          wang.Add(card[i]);
          break;
      }
      #endregion
    }
    QuA(hei); // 对A 的单独处理
     QuA(hong);
    QuA(mei);
    QuA(fang);
    #region ========== 合并 排序后的牌组========
    List<int> cardlist = new List<int>();
    for (int i = 0; i < wang.Count; i++)  //王
    {
      cardlist.Add(wang[i]);
    }
    // ==========合并 组拼 ============
    List<int> cardtemp = new List<int>();
    cardtemp = PaiXuZuPin(hei, hong, mei, fang);
    for (int i = 0; i < cardtemp.Count; i++)
    {
      cardlist.Add(cardtemp[i]);
    }
    int[] cards = new int[cardlist.Count];
    for (int i = 0; i < cardlist.Count; i++)
    {
      cards[i] = cardlist[i];
    }
    #endregion
    return cards;
  }
  /// <summary>
  /// 取A  -- 把每个花色牌中的A,放到前面(A.K.Q.J...)
  /// </summary>
  /// <param name="hei">花色牌</param>
  void QuA(List<int> hei)
  {
    if (hei.Count == 0) return;
    List<int> cardlist = new List<int>();
    for (int i = 0; i < hei.Count; i++) // 将牌添加到新列表
    {
      cardlist.Add(hei[i]);
    }
    if (hei.Count > 2)
    {
      if (hei[hei.Count - 2] % 13 == 1)  //如果有两个A (对两幅牌的处理)
      {
        cardlist.Insert(0, hei[hei.Count - 2]);
        cardlist.Insert(0, hei[hei.Count - 1]);
        for (int i = 0; i < hei.Count; i++)
        {
          hei[i] = cardlist[i];
        }
        return;
      }
    }
    if (hei[hei.Count - 1] % 13 == 1)  //如果有一个A
    {
      cardlist.Insert(0, hei[hei.Count - 1]);
    }
    for (int i = 0; i < hei.Count; i++)
    {
      hei[i] = cardlist[i];
    }
  }
 /// <summary>
  /// 根据传入牌组 的顺序 进行组拼
  /// </summary>
 public List<int> PaiXuZuPin(List<int> one, List<int> two, List<int> three, List<int> four)
  {
    List<int> cardlist = new List<int>();
    for (int i = 0; i < one.Count; i++)
    {
      cardlist.Add(one[i]);
    }
    for (int i = 0; i < two.Count; i++)
    {
      cardlist.Add(two[i]);
    }
    for (int i = 0; i < three.Count; i++)
    {
      cardlist.Add(three[i]);
    }
    for (int i = 0; i < four.Count; i++)
    {
      cardlist.Add(four[i]);
    }
    return cardlist;
  }
  /// <summary>
  /// 根据牌值取花色 5:大王 | 4:小王 | 3:黑桃 | 2:红桃 | 1:梅花 | 0:方片
  /// </summary>
  /// <param name="card"></param>
  public int sendFlower(int card)
  {
    if (card >= 1 && card <= 13)
    {
      return 3;
    }else if (card >= 14 && card <= 26)
    {
      return 2;
    }
    else if (card >= 27 && card <= 39)
    {
      return 1;
    }
    else if (card >= 40 && card <= 52)
    {
      return 0;
    }
    else if (card == 53)
    {
      return 4;
    }
    return 5;
  }

PS:代码仅供参考,优化自行处理

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • C#七大经典排序算法系列(上)

    今天是开篇,得要吹一下算法,算法就好比程序开发中的利剑,所到之处,刀起头落. 针对现实中的排序问题,算法有七把利剑可以助你马道成功. 首先排序分为四种: 交换排序: 包括冒泡排序,快速排序. 选择排序: 包括直接选择排序,堆排序. 插入排序: 包括直接插入排序,希尔排序. 合并排序: 合并排序. 那么今天我们讲的就是交换排序,我们都知道,C#类库提供的排序是快排,为了让今天玩的有意思点, 我们设计算法来跟类库提供的快排较量较量.争取KO对手. 冒泡排序: 首先我们自己来设计一下"冒泡排序&quo

  • C# 字符串按 ASCII码 排序的方法

    在和银行做数据对接时,涉及到数据传输时的验签及加密.其中数据签名方案中就要求数据项根据属性名按 ASCII码 进行升序排序.C#中的ASCII码排序并不是表面上那么简单,一不小心就入坑了.因为C#的排序默认并不是按照ASCII码进行排序的.举个例子, 我有这样一个字符串数组,然后对其排序. string[] vv = { "1", "2", "A", "a", "B", "b" }; A

  • C# ListView 点击表头对数据进行排序功能的实现代码

    添加表头单击事件 private void listView1_ColumnClick(object sender, ColumnClickEventArgs e) { if (listView1.Columns[e.Column].Tag == null) { listView1.Columns[e.Column].Tag = true; } bool tabK = (bool)listView1.Columns[e.Column].Tag; if (tabK) { listView1.Col

  • C#实现二叉排序树代码实例

    二叉排序树,又称为二叉查找树.它或者是一颗空树,或者是具有下列性质的二叉树: 若它的左子树不为空.则左子树上所有的结点的值均小于跟的结点值 若它的右子树部位空,则右子树的所有结点值均大于它的根结点的值 它的左右子树也分别是二叉排序树 1,排序方便 2,查找方便 3,便于插入和删除 C#链式存储二叉排序树,实现简单的排序,以及查找,具体代码如下: namespace _2_1_3二叉排序树 { /// <summary> /// 结点类 /// </summary> class BS

  • C语言二叉排序(搜索)树实例

    本文实例为大家分享了C语言二叉排序(搜索)树实例代码,供大家参考,具体内容如下 /**1.实现了递归 非递归插入(创建)二叉排序(搜索)树: 分别对应Insert_BinSNode(TBinSNode* T,int k),NonRecursion_Insert_BinSNode(TBinSNode* T,int k); 2.实现了递归 非递归查找 二叉排序(搜索)树 : 分别对应Find_BinSNode(TBinSNode *T,int s),NonRecursion_Find_BinSNod

  • C# 参数按照ASCII码从小到大排序(字典序)

    在对接第三方支付的时候,第三方会要求参数按照ASCII码从小到大排序.如下: public static void requestPay() { Dictionary<string, string> dics = new Dictionary<string, string>(); dics.Add("amount", amount); dics.Add("callback_url", callback_url); dics.Add("

  • 逐步讲解快速排序算法及C#版的实现示例

    算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). 该方法的基本思想是: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. 虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤.因此我的对快速排序作了进一步的说明:挖坑填数+分治法:

  • C#实现冒泡排序算法的代码示例

    1.原理:从数组的第一个位置开始两两比较array[index]和array[index+1],如果array[index]大于array[index+1]则交换array[index]和array[index+1]的位置,止到数组结束; 从数组的第一个位置开始,重复上面的动作,止到数组长度减一个位置结束; 从数组的第一个位置开始,重复上面的动作,止到数组长度减二个位置结束; .... 2.时间复杂度:O(N²),进行了(n-1)*(n-2)....=n*(n-1)/2次比较和约比较次数一半的交

  • C#实现的二维数组排序算法示例

    本文实例讲述了C#实现的二维数组排序算法.分享给大家供大家参考,具体如下: class Order { /// <summary> /// 对二维数组排序 /// </summary> /// <param name="values">排序的二维数组</param> /// <param name="orderColumnsIndexs">排序根据的列的索引号数组</param> /// <

  • C#使用IComparer自定义List类实现排序的方法

    本文实例讲述了C#使用IComparer自定义List类实现排序的方法.分享给大家供大家参考.具体如下: List类中不带参数的Sort函数可以用来为List类中的元素排序,但如果List类中的元素类型本身不能直接进行比较(如自定义的struct和很多class),或是希望采用更加灵活的自定义比较方式,可以通过继承了IComparer接口的函数来解决. 代码示例如下: 1)声明一个类 /// <summary> /// 人物类 /// </summary> public class

  • 详解Java二叉排序树

    一.二叉排序树定义 1.二叉排序树的定义 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree).其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ①若它的左子树非空,则左子树上所有结点的值均小于根结点的值: ②若它的右子树非空,则右子树上所有结点的值均大于根结点的值: ③左.右子树本身又各是一棵二叉排序树. 上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树. 2.二叉排序树的性质 按中序遍历二

  • 二叉排序树的实现与基本操作

    二叉排序树又称二叉查找树.它或者是一颗空树,或者是具有以下性质的二叉树: ①如果左子树不空,那么左子树上所有结点的值均小于它的根结点的值: ②如果右子树不空,那么右子树上所有结点的值均大于它的根结点的值: ③左右子树也分别为二叉排序树. 以下代码实现了: 二叉树的构建 二叉树的中.前.后.层序遍历 二叉树中结点的最大距离 import java.util.LinkedList; import java.util.Queue; class Node{ public int data; public

  • C#中哈希表(HashTable)用法实例详解(添加/移除/判断/遍历/排序等)

    本文实例讲述了C#中哈希表(HashTable)用法.分享给大家供大家参考,具体如下: 1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写:value用于存储对应于key的值.Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键

随机推荐