//判断是否是皇家同花顺 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); } }
//逻辑牌值 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)); }