rule.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. import random
  2. def get_Poker():
  3. pokers = []
  4. i = 1
  5. while i <= 54:
  6. pokers.append(i)
  7. i += 1
  8. return pokers
  9. def _to_cards(pokers):
  10. cards = []
  11. number = ['3','4','5','6','7','8','9','10','J','Q','K','A','2']
  12. color = ['黑桃', '红桃', '梅花', '方片']
  13. for p in pokers:
  14. if p == 53:
  15. cards.append('小王')
  16. elif p == 54:
  17. cards.append('大王')
  18. else:
  19. cards.append(color[(p-1)%4] + number[(p-1)//4])
  20. return cards
  21. def send_Card(pokers):
  22. print('开始洗牌')
  23. random.shuffle(pokers) # 使用shuffle打乱
  24. print('开始发牌')
  25. bottom = pokers[0:3]
  26. bottom.sort()
  27. bottom = _to_cards(bottom)
  28. print('底牌为 : %s' % bottom)
  29. player1 = pokers[3:20]
  30. player2 = pokers[20:37]
  31. player3 = pokers[37:54]
  32. player1.sort()
  33. player2.sort()
  34. player3.sort()
  35. player1 = _to_cards(player1)
  36. player2 = _to_cards(player2)
  37. player3 = _to_cards(player3)
  38. print('player1 : ' + str(player1))
  39. print('player2 : ' + str(player2))
  40. print('player3 : ' + str(player3))
  41. pokers = get_Poker()
  42. # print(send_Card(pokers))
  43. CARD_TYPES = (
  44. 'rocket', 'bomb',
  45. 'single', 'pair', 'trio', 'trio_pair', 'trio_single',
  46. 'seq_single','seq_pair','seq_trio', 'seq_trio_pair','seq_trio_single',
  47. 'bomb_pair', 'bomb_single'
  48. )
  49. SEQ_TYPES = (
  50. 'seq_single','seq_pair','seq_trio', 'seq_trio_pair','seq_trio_single'
  51. )
  52. def check_type(_pokers):
  53. type = 'error'
  54. value = 0
  55. pokers = []
  56. allpokers = get_Poker()
  57. # 检查传入数据是否为列表类型和是否为空列表
  58. if not isinstance(_pokers,list) or not _pokers:
  59. return [type, value]
  60. # 检查列表长度和列表内是否有重复数据
  61. if len(_pokers)>20 or len(_pokers) != len(set(_pokers)):
  62. return [type, value]
  63. # 检查列表内数据是否为poker数据,并对数据进行处理
  64. for poker in _pokers:
  65. if poker not in allpokers:
  66. return [type, value]
  67. if poker == 54:
  68. pokers.append(14)
  69. else:
  70. pokers.append((poker-1)//4)
  71. pokers.sort()
  72. #判断单张
  73. if len(pokers) == 1:
  74. type = 'single'
  75. value = pokers[0]
  76. return [type, value]
  77. #判断火箭和单对
  78. if len(pokers) == 2:
  79. if pokers == [13,14]:
  80. type = 'rocket'
  81. value = 2000
  82. else:
  83. if pokers[0] == pokers[1]:
  84. type = 'pair'
  85. value = pokers[0]
  86. return [type, value]
  87. #判断三条
  88. if len(pokers) == 3:
  89. if pokers[0] == pokers[1] == pokers[2]:
  90. type = 'trio'
  91. value = pokers[0]
  92. return [type, value]
  93. #判断炸弹和三带一
  94. if len(pokers) == 4:
  95. if pokers[0] == pokers[1] == pokers[2] == pokers[3]:
  96. type = 'bomb'
  97. value = pokers[0]*100
  98. else:
  99. if pokers[0] == pokers[1] == pokers[2] or pokers[1] == pokers[2] == pokers[3]:
  100. type = 'trio_single'
  101. value = pokers[1]
  102. return [type, value]
  103. #判断单顺
  104. if len(pokers) >= 5 and len(pokers) <= 12 and pokers[-1] <= 11:
  105. seqpokers = []
  106. i = pokers[0]
  107. while i <= pokers[-1]:
  108. seqpokers.append(i)
  109. i += 1
  110. if seqpokers == pokers:
  111. type = 'seq_single'
  112. value = pokers[0]
  113. #判断三带一对
  114. if len(pokers) == 5:
  115. if (pokers[0] == pokers[1] and pokers[2] == pokers[3] == pokers[4])\
  116. or (pokers[3] == pokers[4] and pokers[0] == pokers[1] == pokers[2]):
  117. type = 'trio_pair'
  118. value = pokers[2]
  119. return [type, value]
  120. #判断双顺
  121. if len(pokers) >= 6 and len(pokers) % 2 == 0 and pokers[-1] <= 11:
  122. seqpokers = []
  123. i = pokers[0]
  124. while i <= pokers[-1]:
  125. seqpokers.append(i)
  126. seqpokers.append(i)
  127. i += 1
  128. if seqpokers == pokers:
  129. type = 'seq_pair'
  130. value = pokers[0]
  131. #判断三顺
  132. if len(pokers) >= 6 and len(pokers) % 3 == 0 and pokers[-1] <= 11:
  133. seqpokers = []
  134. i = pokers[0]
  135. while i <= pokers[-1]:
  136. seqpokers.append(i)
  137. seqpokers.append(i)
  138. seqpokers.append(i)
  139. i += 1
  140. if seqpokers == pokers:
  141. type = 'seq_trio'
  142. value = pokers[0]
  143. #判断四带二
  144. if len(pokers) == 6:
  145. if pokers[0] == pokers[1] == pokers[2] == pokers[3]\
  146. or pokers[1] == pokers[2] == pokers[3] == pokers[4]\
  147. or pokers[2] == pokers[3] == pokers[4] == pokers[5]:
  148. type = 'bomb_single'
  149. value = pokers[2]
  150. return [type, value]
  151. #判断带单飞机
  152. if len(pokers) >= 8 and len(pokers) % 4 == 0:
  153. tri = 0
  154. for poker in set(pokers):
  155. if pokers.count(poker) >= 3:
  156. tri += 1
  157. if poker >= value: value = poker
  158. if tri >= (len(pokers) // 4) and tri < 6:
  159. type = "seq_trio_single"
  160. #判断四带两对
  161. if len(pokers) == 8:
  162. if pokers[0] == pokers[1] == pokers[2] == pokers[3] and pokers[4] == pokers[5] and pokers[6] == pokers[7]:
  163. type = 'bomb_pair'
  164. value = pokers[0]
  165. return [type, value]
  166. elif pokers[2] == pokers[3] == pokers[4] == pokers[5] and pokers[0] == pokers[1] and pokers[6] == pokers[7]:
  167. type = 'bomb_pair'
  168. value = pokers[2]
  169. return [type, value]
  170. elif pokers[4] == pokers[5] == pokers[6] == pokers[7] and pokers[0] == pokers[1] and pokers[2] == pokers[3]:
  171. type = 'bomb_pair'
  172. value = pokers[4]
  173. return [type, value]
  174. #判断带对飞机
  175. if len(pokers) >= 10 and len(pokers) % 5 == 0 and type != 'seq_trio_single':
  176. tri = 0
  177. for poker in set(pokers):
  178. if pokers.count(poker) == 3:
  179. tri += 1
  180. if poker >= value: value = poker
  181. if pokers.count(poker) == 1:
  182. return [type, value]
  183. if tri >= (len(pokers) // 5) and tri < 5:
  184. type = "seq_trio_pair"
  185. return [type, value, len(pokers)]
  186. def canPlay(lastTurnPoker, shotPoker):
  187. last = check_type(lastTurnPoker)
  188. shot = check_type(shotPoker)
  189. if shot[0] == 'error':
  190. return '出牌不合法'
  191. if shot[0] != last[0] and shot[1] < 100:
  192. return '出牌类型跟上家不一致'
  193. if shot[1] <= last[1]:
  194. return '出牌需要大于上家'
  195. if shot[0] in SEQ_TYPES and shot[2] != last[2]:
  196. return '牌型长度跟上家不一致'
  197. return '可以出牌'
  198. print(canPlay([1,2,3],[2,3,4]))