1. def phazed_is_valid_play(play, player_id, table, turn_history, phase_status,
    2. hand, discard):
    3. # Implement this function
    4. # 用字典定义每张牌的数值和对应的花色
    5. value_dict = {'A': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '0': 10, 'J': 11, 'Q': 12,
    6. 'K': 13}
    7. suit_dict = {'S': 'black', 'H': 'red', 'D': 'red', 'C': 'black'}
    8. phase_type = []
    9. result = []
    10. # 判断是否为第一个组合
    11. def is_one(length=3):
    12. if len(group) == length:
    13. # 将牌中的万能牌去掉后,如果牌面值只有一种,则符合第一中组合
    14. s1 = list(set(value_list) - set('A'))
    15. if len(s1) == 1:
    16. result.append(1)
    17. # 判断是否为第二个组合
    18. def is_two(length=7):
    19. if len(group) == length:
    20. # 从该组牌中去除万能牌
    21. for i in range(len(value_list) - 1, 0, -1):
    22. if value_list[i] == 'A':
    23. suit_list.pop(i)
    24. # 去掉万能牌后,如果花色只有一种,则符合第二种组合
    25. s2 = set(suit_list)
    26. if len(s2) == 1:
    27. result.append(2)
    28. # 判断是否为第三个组合
    29. def is_three():
    30. if sum(int_value_list) == 34:
    31. result.append(3)
    32. # 判断该牌组是否排序
    33. def is_sorted():
    34. a_index = [] # 代表牌面为A所在的位置
    35. not_a = [] # 代表牌面不为A所在的位置
    36. for index, value in enumerate(int_value_list):
    37. if value != 1:
    38. not_a.append(index)
    39. else:
    40. a_index.append(index)
    41. # 找到第一个不是A牌的值,将A的值根据其位置进行转换为相应的牌
    42. for i in a_index:
    43. color_list[i] = color_list[not_a[0]] # 将A牌的颜色换成一个不是A牌的颜色
    44. if i < not_a[0]:
    45. # 如果A牌在第一个不是A牌的前面,则进行减数处理
    46. a_value = int_value_list[not_a[0]] - (not_a[0] - i)
    47. # 如果该牌面值小于0,则直接退出
    48. if a_value > 0:
    49. int_value_list[i] = a_value
    50. else:
    51. return False
    52. else:
    53. # 如果A牌在第一个不是A牌的后面,则进行加数处理
    54. a_value = int_value_list[not_a[0]] + (i - not_a[0])
    55. # 如果该牌面值大于13,则直接退出
    56. if a_value < 13:
    57. int_value_list[i] = a_value
    58. else:
    59. return False
    60. # 判断替换A牌后的牌是否按照顺序排列
    61. for j in range(1, 4):
    62. if int_value_list[j] - int_value_list[j - 1] != 1:
    63. return False
    64. else:
    65. return True
    66. # 判断是否为第四个组合
    67. def is_four(length=4):
    68. if len(group) == length:
    69. # 将牌中的万能牌去掉后,如果牌面值只有一种,则符合第三种组合
    70. s3 = list(set(value_list) - set('A'))
    71. if len(s3) == 1:
    72. result.append(4)
    73. # 判断是否为第五个组合
    74. def is_five(length=8):
    75. if len(group) == length:
    76. if is_sorted():
    77. result.append(5)
    78. # 判断是否为第六个组合
    79. def is_six():
    80. red_sum = 0 # 记录红色牌的数值综合
    81. black_sum = 0 # 记录黑色牌的数值综合
    82. for i in range(len(group)):
    83. if color_list[i] == 'red':
    84. red_sum += int_value_list[i]
    85. else:
    86. black_sum += int_value_list[i]
    87. if red_sum == 34 or black_sum == 34:
    88. result.append(6)
    89. # 判断是否为第七个组合
    90. def is_seven(length=4):
    91. if len(group) == length:
    92. if is_sorted():
    93. if len(set(color_list)) == 1:
    94. result.append(7)
    95. def get_phase_type():
    96. # 判断是否该组牌中有两个以上"natural" cards
    97. if value_list.count('A') <= len(value_list) - 2:
    98. is_one()
    99. is_two()
    100. is_four()
    101. is_five()
    102. is_seven()
    103. # 判断是否符合第六、七组合
    104. is_three()
    105. is_six()
    106. if result.count(1) >= 2:
    107. phase_type.append(1)
    108. if result.count(2) >= 1:
    109. phase_type.append(2)
    110. if result.count(3) >= 2:
    111. phase_type.append(3)
    112. if result.count(4) >= 2:
    113. phase_type.append(4)
    114. if result.count(5) >= 1:
    115. phase_type.append(5)
    116. if result.count(6) >= 2:
    117. phase_type.append(6)
    118. if result.count(7) >= 1 and result.count(4) >= 1:
    119. phase_type.append(7)
    120. return phase_type
    121. if play[0] == 3 and play[1][0] == phase_status[player_id] + 1:
    122. result = []
    123. for group in play[1][1]:
    124. # 获取每张牌的值,并转换成整数类型
    125. value_list = [_[0] for _ in group]
    126. int_value_list = [value_dict[i] for i in value_list]
    127. # 获取每张牌的花色,并转成红色或者黑色
    128. suit_list = [_[1] for _ in group]
    129. color_list = [suit_dict[i] for i in suit_list]
    130. get_phase_type()
    131. # print(phase_type)
    132. if play[1][0] in phase_type:
    133. return True
    134. elif play[0] == 4:
    135. group = table[play[1][1][0]][1][play[1][1][1]][:]
    136. group.insert(play[1][1][2], play[1][0])
    137. value_list = [_[0] for _ in group]
    138. int_value_list = [value_dict[i] for i in value_list]
    139. # 获取每张牌的花色,并转成红色或者黑色
    140. suit_list = [_[1] for _ in group]
    141. color_list = [suit_dict[i] for i in suit_list]
    142. print(table)
    143. print(group)
    144. is_num = table[play[1][1][0]][0]
    145. print(is_num)
    146. if is_num == 1:
    147. is_one(len(group))
    148. elif is_num == 2:
    149. is_two(len(group))
    150. elif is_num == 3:
    151. is_three()
    152. elif is_num == 4:
    153. is_four(len(group))
    154. elif is_num == 5:
    155. is_five(len(group))
    156. elif is_num == 6:
    157. is_six()
    158. elif is_num == 7:
    159. is_seven(len(group))
    160. if result:
    161. return True
    162. # pass
    163. elif play[0] == 5:
    164. if play[1] in hand:
    165. return True
    166. return False
    167. if __name__ == '__main__':
    168. # Example calls to the function.
    169. print(phazed_is_valid_play((3, (1, [['2S', '2S', '2C'],
    170. ['AS', '5S', '5S']])), 0, [(None, []), (None, []),
    171. (None, []), (None, [])], [(0, [(2, 'JS')])],
    172. [0, 0, 0, 0], ['AS', '2S', '2S', '2C', '5S', '5S',
    173. '7S', '8S', '9S', '0S', 'JS'], None))
    174. print(phazed_is_valid_play((4, ('KC', (1, 0, 0))),
    175. 1, [(None, []), (2, [['2S', '2S', 'AS', '5S',
    176. '5S', '7S', 'JS']]), (None, []), (None, [])],
    177. [(0, [(2, 'JS'), (5, 'JS')]), (1, [(1, 'XX'),
    178. (3, (
    179. 2,
    180. [['2S', '2S', 'AS', '5S', '5S', '7S', 'JS']]))])],
    181. [0, 2, 0, 0], ['5D', '0S', 'JS', 'KC'], '0H'))
    182. print(phazed_is_valid_play((5, 'JS'), 1, [(None, []),
    183. (1, [['2S', '2S', '2C'], ['AS', '5S', '5S']]),
    184. (None, []), (None, [])], [(0, [(2, 'JS'),
    185. (5, 'JS')]),
    186. (1, [(1, 'XX'), (3, (1, [['2S', '2S',
    187. '2C'], ['AS', '5S',
    188. '5S']]))])],
    189. [0, 1, 0, 0],
    190. ['AD', '8S', '9S', '0S', 'JS'], '3C'))