麻将算法(三)碰牌以及杠牌

来源:互联网 发布:linux管道命令是啥 编辑:程序博客网 时间:2024/05/19 04:03
洗牌,接牌都有了,那就再来个扔牌。扔牌的思路:如果传入的时牌索引直接找到手牌中的这个位置,将个数-1;如果传入的是牌值,通过牌型转换后再进行以上操作:
    public static void RemoveCard(int[] cbCardIndex, int cbRemoveCardindex)
        {
            if (cbCardIndex[cbRemoveCardindex] > 0)
            {
                cbCardIndex[cbRemoveCardindex]--;
            }
        }
利用以上的方法可以做到扔牌和接牌的方法,下面要做的是怎么去判断碰牌与杠牌:
我的思路是将碰过的牌、杠过牌存在一个list里面,list中保存的是一个结构, List<FrontageItem> ,FrontageItem这个结构中对应分别是类型、牌索引、玩家:
        public enum cbFrontage
        {
            PENGPAI,
            GANGPAI,


        }
        public structFrontageItem
        {
            private cbFrontage cbFron;
            public cbFrontage CbFron
            {
                get { return cbFron; }
                set { cbFron = value; }
            }


            private int cardindex;
            public int CardINdex
            {
                get { return cardindex; }
                set { cardindex = value; }
            }


            private int Player;
            public int Player1
            {
                get { return Player; }
                set { Player = value; }
            }
            public FrontageItem(cbFrontage CbFron, int CardIndex, int Player)
            {
                this.cbFron = CbFron;
                this.cardindex = CardIndex;
                this.Player = Player;
            }
        }
在判断决定碰牌时,手里一定会有2张这样的牌,把这两张牌减掉后,加入List<FrontageItem>里面:
//这个是碰牌的核心代码
//
//
 public static void IS_WIK_PENG(bool ispeng, int[] cbCardIndex, int index, int player, List<FrontageItem> Frontage)  
        {
            if (ispeng)
            {
                cbCardIndex[index] = cbCardIndex[index] - 2;
                Frontage.Add(new FrontageItem(cbFrontage.PENGPAI, index, player));
            }
        }


在判断决定杠牌时,会有两种可能,一是手里一定会有3张这样的牌,把这三张牌减掉后,加入List<FrontageItem>里面,还有一种可能就是已经碰过了,现在可以进行杠牌操作了,这种可能的解决办


法就是找到这个碰的牌,将他的类型转化成杠牌,手牌不用进行改变:
//这个是杠牌的核心代码
//
//
 public static void IS_WIK_GANG(bool ispeng, int[] cbCardIndex, int index, int player, List<FrontageItem> Frontage)  //这个判断是否去杠牌牌的方法
        {
            int number = 0;
            int Ynumber = 0;
            List<int> other = new List<int>();
            foreach (FrontageItem card in Frontage)
            {
                other.Add(card.CardINdex);
            }


            if (ispeng)
            {
                if (other.Contains(index))
                {
                    foreach (FrontageItem card in Frontage)
                    {
                        number++;
                        if (card.CardINdex == index)
                        {
                            Ynumber = number;
                        }
                    }
                    Frontage[Ynumber].CbFron = cbFrontage.GANGPAI;
                }
                else
                {
                    if (player == 2)
                    {
                        cbCardIndex[index] = cbCardIndex[index] - 4;
                        Frontage.Add(new FrontageItem(cbFrontage.GANGPAI, index, player));
                    }
                    else
                    {
                        cbCardIndex[index] = cbCardIndex[index] - 3;
                        Frontage.Add(new FrontageItem(cbFrontage.GANGPAI, index, player));
                    }


                }


            }
        }
碰牌和杠牌做完后再来个吃牌,吃牌请看下章: