麻将查胡算法 数据结构设计与实现

根据前面一片博客传送门,算法介绍,这里来实现核心部分

中间用到的一些功能函数,大家自己搞定吧,我把核心算法po出来大家参考

一、数据结构设计c#

算法流程:轮流判断每一张牌是否符合要求


找出所有可以当将的牌

while(将牌没遍历完)

{

    去除将牌,提取数组byte[] cardgroup

    while(数组不为空)

    {

          取出第一张牌byte  card  =  cardgroup[0];

          确认牌张数 int count = GetCardCount(card);//功能函数

          If(判断数组是不是空的)

          {

                 如果是空的break

         }

         else

         {

              If(判断数组中是否含有顺子或者刻子(三张))

               {

                    //根据张数处理

                    If(count  ==  1)

                     {
                         If(判断card能否组成顺子)
                         {

                              能就把这个顺子从牌组中删掉

                          }

                         else

                        {

                               break

                        }

                    }            

                               
                   If(count  ==  2)

                    {

                               If(判断card能否组成2个顺子)

                               {

                                        能就把这2个顺子从牌组中删掉

                                }

                              else

                               {

                                      break

                               }

                    }

                    If(count  ==  3)

                    {

                             If(判断card能否组成3个顺子)

                             {

                                      能就把这3个顺子从牌组中删掉

                               }

                              else

                             {

                                      不能就把这个刻子删掉

                              }

                      }

                      If(count  ==  4)

                      {

                             If(判断card能否组成4个顺子)

                             {

                                    能就凑够12张了,一定可以胡

                                    return true

                             }

                             else

                             {

                                       If(能否拿出一张和后面的牌组成顺子)

                                       {

                                              能就把这个顺子和刻子都删掉

                                       }

                                       else

                                       {

                                               否则break

                                        }

                           }

                     }

                }

               else

                {

                       //数组不为空,没有顺,没有刻,一定没胡

                       如果没有break

                }

           }

        }


         数组为空或者while被break到这里

         If(判断cardgroup是否为空(全部完整移除))

         {

                 是就表示胡return  true

          }

}

二、实现

    bool TingCard(byte[] JiangArray, byte[] Cards, int type)
    {
        byte[] cardgroup = Cards;
        while (JiangCount < JiangNumber)
        {
            byte[] jiang = new byte[2];//两张一样的
            jiang[0] = JiangArray[JiangCount];
            jiang[1] = JiangArray[JiangCount];
            JiangCount++;

            cardgroup = GameLogic.DeleteArr(jiang, Cards);//DeleteItem(jiang, Cards);
            if (cardgroup == null) return true;
            cardgroup = GameLogic.SortCard1(cardgroup);//Sort(cardgroup);

            while (!IsNilGrop(cardgroup))
            {
                if (IsHaveLine(cardgroup) || IsHaveThree(cardgroup))
                {
                    byte card = cardgroup[0];
                    int cardcount = GetCardCount(card, cardgroup);
                    if (cardcount == 1)
                    {
                        byte [] line = GetLine(cardgroup,card,1);
                        if (line!= null)
                        {
                            cardgroup = GameLogic.DeleteArr(line, cardgroup);
                        }
                        else
                        {
                            break;
                        }
                    }
                    else if (cardcount == 2)
                    {
                        byte[] line = GetLine(cardgroup, card,2);
                        if (line != null)
                        {
                            cardgroup = GameLogic.DeleteArr(line, cardgroup);
                            cardgroup = GameLogic.DeleteArr(line, cardgroup);
                        }
                        else
                        {
                            break;
                        }
                    }
                    else if (cardcount == 3)
                    {
                        byte[] line = GetLine(cardgroup, card, 3);
                        if (line != null)
                        {
                            cardgroup = GameLogic.DeleteArr(line, cardgroup);
                            cardgroup = GameLogic.DeleteArr(line, cardgroup);
                            cardgroup = GameLogic.DeleteArr(line, cardgroup);
                        }
                        else
                        {
                            cardgroup = GameLogic.DeleteArr(new byte[] {card, card, card}, cardgroup);
                        }
                    }
                    else if (cardcount == 4)
                    {
                        byte[] line = GetLine(cardgroup, card, 4);
                        if (line != null) return true;
                        else
                        {
                            byte[] line1 = GetLine(cardgroup, card, 1);
                            if (line1 != null)
                            {
                                cardgroup = GameLogic.DeleteArr(line1, cardgroup);
                                cardgroup = GameLogic.DeleteArr(new byte[] { card, card, card }, cardgroup);
                            }
                            else
                            {
                                break;
                            }
                        }
                    }

                }
                else
                {
                    break;
                }
            }

            if (IsNilGrop(cardgroup))
            {
                return true;
            }
        }
        return false;

    }


只上了核心部分代码,这时候有的小伙伴会发现,当cardcount == 3的时候,如果可以组成3个顺子就直接把三个顺子删掉,如果出现其中一个要和其他牌组成顺子的话,会不会报错,放心吧不会的!这个特殊情况是不存在的,自己摆一摆就知道啦


后来自己发现了一个漏洞,就是没有考虑到添加完了有5张的情况,要加个break,不然会死循环

猜你喜欢

转载自blog.csdn.net/u014261855/article/details/54987832