欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-09 18:54:03
扑克牌游戏,总是能用到很多的手牌排序,总结了几种方式供参考,顺便记录一下方便以后使用。 我做的这个是由(1-13:黑桃a-k || 14 - 26:红桃 || 27 -...

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

我做的这个是由(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:代码仅供参考,优化自行处理

总结

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