cmd_define.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /********************************************************************
  2. created: pinorr
  3. file base: logic.h
  4. author: pinorr Q 505971450
  5. purpose: 跑胡子算法定义
  6. *********************************************************************/
  7. #include <windows.h>
  8. #define MAX_CARDS_NUM 84 //
  9. #define MAX_TYPE 21 // 20张牌 + 赖子
  10. #define INVALID_VAL 0x00
  11. //结点类型
  12. enum enNode
  13. {
  14. enNode_error,
  15. enNode_line,
  16. enNode_27A,
  17. enNode_DDd,
  18. enNode_num2,
  19. enNode_num3,
  20. enNode_num4,
  21. enNode_max,
  22. };
  23. //规则类型
  24. enum enPlayType
  25. {
  26. enPlayType_NORMAL = 0, //一般
  27. enPlayType_XDD = 1, //小大搭
  28. enPlayType_27A = 2, //二七十
  29. enPlayType_123 = 3, //一二三
  30. enPlayType_WANG = 4, //王
  31. enPlayType_max,
  32. };
  33. #define TY_MY (1+(1<<enPlayType_WANG)+(1<<enPlayType_123)+(1<<enPlayType_27A)+(1<<enPlayType_XDD))
  34. static BYTE s_byIndex[MAX_TYPE] =
  35. {
  36. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, // 一 ~ 十
  37. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, // 壹 ~ 拾
  38. 0xFF, // 赖子
  39. };
  40. static bool isHavePlayType(enPlayType type)
  41. {
  42. if (type >= enPlayType_max)
  43. return false;
  44. return (TY_MY & (1 << type)) != 0;
  45. }
  46. static BYTE getIndexByVal(BYTE byCard)
  47. {
  48. if (byCard == 0xFF)
  49. return 20;
  50. BYTE byCor = byCard & 0xF0;
  51. BYTE byIndex = (byCor >> 4) * 10 + (byCard & 0x0F) - 1;
  52. if (byIndex >= MAX_TYPE)
  53. return 0xFF;
  54. return byIndex;
  55. }
  56. static void getCardsByVal(__int64 llVal, BYTE byOut[4])
  57. {
  58. BYTE byAll = 0;
  59. for (int i = 0; i < MAX_TYPE; ++i)
  60. {
  61. BYTE num = ((llVal >> (i * 3)) & 7);
  62. if (num > 0)
  63. {
  64. memset(&byOut[byAll], s_byIndex[i], min(4 - byAll, num));
  65. byAll += num;
  66. }
  67. if (byAll >= 4)
  68. break;
  69. }
  70. }
  71. static __int64 getKey(BYTE n1, BYTE n2, BYTE n3 = 0, BYTE n4 = 0)
  72. {
  73. __int64 llKey = 0;
  74. BYTE index = getIndexByVal(n1);
  75. if (index < MAX_TYPE)
  76. llKey += (__int64)1 << (index * 3);
  77. index = getIndexByVal(n2);
  78. if (index < MAX_TYPE)
  79. llKey += (__int64)1 << (index * 3);
  80. index = getIndexByVal(n3);
  81. if (index < MAX_TYPE)
  82. llKey += (__int64)1 << (index * 3);
  83. index = getIndexByVal(n4);
  84. if (index < MAX_TYPE)
  85. llKey += (__int64)1 << (index * 3);
  86. return llKey;
  87. }
  88. inline int getCardsNum(__int64 llVal, BYTE n)
  89. {
  90. if (n < MAX_TYPE)
  91. return BYTE((llVal >> (n * 3)) & 7);
  92. return 0;
  93. }
  94. inline BYTE getNumByKey(__int64 llVal)
  95. {
  96. BYTE nNum = 0;
  97. for (int i = 0; i < MAX_TYPE; ++i)
  98. nNum += (llVal >> (3 * i)) & 7;
  99. return nNum;
  100. }
  101. inline bool isContainKey(__int64 llVal, __int64 llKey)
  102. {
  103. for (int i = 0; i < MAX_TYPE; ++i)
  104. {
  105. BYTE key = (llKey >> (3 * i)) & 7;
  106. if (key > 0 && key > ((llVal >> (3 * i)) & 7))
  107. return false;
  108. }
  109. return true;
  110. }