好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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:代码仅供参考,优化自行处理

总结

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

原文链接:https://blog.csdn.net/Czhenya/article/details/83246231

dy("nrwz");

查看更多关于C#代码实现扑克牌排序的几种方式的详细内容...

  阅读:49次