Exemple #1
0
        //判断是否是皇家同花顺
        public static bool IsMaxTHS(byte[] cbCardData, int cbCount)
        {
            if (cbCount != 5)
            {
                return(false);
            }

            byte bySameMax = 0;

            byte[] byCardVal = new byte[14];
            byte[] byCardCol = new byte[4];
            for (int i = 0; i < 5; ++i)
            {
                if (cbCardData[i] > 0)
                {
                    byte byVal = HelpFun.GetCardLogicValue(cbCardData[i]);
                    ++byCardVal[byVal];
                    if (byVal < 13)
                    {
                        bySameMax = Math.Max(bySameMax, byCardVal[byVal]);
                        byte byCol = HelpFun.GetCardColor(cbCardData[i]);
                        ++byCardCol[byCol];
                    }
                }
            }

            byte nKingNum   = byCardVal[13];
            byte nMaxColNum = 0;

            for (int i = 0; i < 4; ++i)
            {
                if (nMaxColNum < byCardCol[i])
                {
                    nMaxColNum = byCardCol[i];
                }
            }
            if (nMaxColNum + nKingNum != 5)
            {
                return(false);
            }

            int n = byCardVal[8] + byCardVal[9] + byCardVal[10] + byCardVal[11] + byCardVal[12] + nKingNum;

            if (n == 5 && bySameMax == 1)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Exemple #2
0
        //逻辑牌值
        public static uint GetLogicValue(byte[] cbCardData, byte cbCardCount)
        {
            //变量定义
            uint nValFlag = 0;

            uint[] nMaxID   = new uint[5];          //最大牌
            byte[] byMaxCor = new byte[5];          //最大牌花色
            if (cbCardCount <= 5 && cbCardCount >= 3)
            {
                byte   num       = 0;
                byte[] byCardVal = new byte[14];
                byte[] byCardCol = new byte[4];
                for (byte i = 0; i < cbCardCount; ++i)
                {
                    if (cbCardData[i] > 0)
                    {
                        byte byVal = HelpFun.GetCardLogicValue(cbCardData[i]);
                        ++byCardVal[byVal];
                        ++num;
                        if (byVal < 13)
                        {
                            byte byCol = HelpFun.GetCardColor(cbCardData[i]);
                            ++byCardCol[byCol];
                        }
                    }
                }
                cbCardCount = num;
                byte nKingNum = byCardVal[13];

                byte        bySameMax = 0;
                List <byte> vctDouble = new List <byte>();
                //统计数据
                for (byte i = 0; i < 13; ++i)
                {
                    bySameMax            = Math.Max(bySameMax, byCardVal[i]);
                    nMaxID[byCardVal[i]] = i;
                    if (byCardVal[i] == 2)
                    {
                        vctDouble.Add(i);
                    }
                }

                //找到指定值最大颜色
                for (byte i = 0; i < cbCardCount; ++i)
                {
                    byte byVal = HelpFun.GetCardLogicValue(cbCardData[i]);
                    for (byte n = 1; n < 5; ++n)
                    {
                        if (byVal == nMaxID[n])
                        {
                            byMaxCor[n] = Math.Max(byMaxCor[n], HelpFun.GetCardColor(cbCardData[i]));
                        }
                    }
                }

                //变量定义
                bool cbSameColor = false, bLineCard = false;
                //判断是否是顺子
                for (int i = 0; i < 13; ++i)
                {
                    if (i + 4 < 13)
                    {
                        int n = byCardVal[i] + byCardVal[i + 1] + byCardVal[i + 2] + byCardVal[i + 3] + byCardVal[i + 4] + nKingNum;
                        if (n == 5 && bySameMax == 1)
                        {
                            bLineCard = true;
                        }
                    }
                }
                //特殊 2 3 4 5 A
                if (byCardVal[0] + byCardVal[1] + byCardVal[2] + byCardVal[3] + byCardVal[12] + nKingNum == 5 && bySameMax == 1)
                {
                    bLineCard = true;
                }

                //判断是否是同花
                for (byte i = 0; i < 4; ++i)
                {
                    if (byCardCol[i] + nKingNum == 5)
                    {
                        cbSameColor = true;
                    }
                }

                if (cbCardCount != 5)
                {
                    cbSameColor = false;
                }

                //数值比较标志
                int nMaxIndex = -1;
                for (byte n = 4; n >= 1; --n)
                {
                    for (int i = (int)nMaxID[n]; i >= 0; --i)
                    {
                        if (byCardVal[i] == n)
                        {
                            if (nMaxIndex < 0)
                            {
                                nMaxIndex = i;
                            }
                            for (byte m = 0; m < n; ++m)
                            {
                                nValFlag = (nValFlag << 4) + (uint)i;
                            }
                        }
                    }
                }
                uint nValFlag1 = nValFlag;
                uint nValFlag2 = nValFlag;
                if (nKingNum > 0)
                {
                    nValFlag  += (13 << 16);
                    nValFlag1 += (((uint)nMaxIndex) << 16);
                    nValFlag2 += (((uint)nMaxIndex + 1) << 16);
                    for (byte i = 0; i < 5; ++i)
                    {
                        byMaxCor[i] = 0x03;
                    }
                }

                //顺金类型
                if (cbSameColor && bLineCard)
                {
                    return((DEF.CT_FIVE_STRAIGHT_FLUSH << 22) + (nValFlag2 << 2) + ((uint)byMaxCor[1] & 0x03));
                }

                //顺子类型
                if (!cbSameColor && bLineCard)
                {
                    return((DEF.CT_FIVE_MIXED_FLUSH_NO_A << 22) + (nValFlag2 << 2) + ((uint)byMaxCor[1] & 0x03));
                }

                //金花类型
                if (cbSameColor && !bLineCard)
                {
                    return((DEF.CT_FIVE_FLUSH << 22) + (nValFlag2 << 2) + ((uint)byMaxCor[1] & 0x03));
                }

                //对子和豹子判断
                if (bySameMax + nKingNum >= 4)
                {
                    return((DEF.CT_FIVE_FOUR_ONE << 22) + (nValFlag1 << 2) + ((uint)byMaxCor[4] & 0x03));
                }
                else if (bySameMax + nKingNum == 3)
                {
                    if ((nKingNum == 0 && vctDouble.Count == 1) || (nKingNum == 1 && vctDouble.Count == 2))
                    {
                        return((DEF.CT_FIVE_THREE_DEOUBLE << 22) + (nValFlag1 << 2) + ((uint)byMaxCor[3] & 0x03));
                    }
                    else
                    {
                        return((DEF.CT_THREE << 22) + (nValFlag1 << 2) + ((uint)byMaxCor[3] & 0x03));
                    }
                }
                else if (bySameMax + nKingNum == 2)
                {
                    if (vctDouble.Count >= 2)
                    {
                        return((DEF.CT_TWO_DOUBLE << 22) + (nValFlag1 << 2) + ((uint)byMaxCor[1] & 0x03));
                    }
                    else
                    {
                        return((DEF.CT_ONE_DOUBLE << 22) + (nValFlag1 << 2) + ((uint)byMaxCor[1] & 0x03));
                    }
                }
            }
            return((DEF.CT_SINGLE << 22) + (nValFlag << 2) + ((uint)byMaxCor[1] & 0x03));
        }