|
@@ -0,0 +1,242 @@
|
|
|
+import random
|
|
|
+
|
|
|
+def get_Poker():
|
|
|
+ pokers = []
|
|
|
+ i = 1
|
|
|
+ while i <= 54:
|
|
|
+ pokers.append(i)
|
|
|
+ i += 1
|
|
|
+ return pokers
|
|
|
+
|
|
|
+def _to_cards(pokers):
|
|
|
+ cards = []
|
|
|
+ number = ['3','4','5','6','7','8','9','10','J','Q','K','A','2']
|
|
|
+ color = ['黑桃', '红桃', '梅花', '方片']
|
|
|
+ for p in pokers:
|
|
|
+ if p == 53:
|
|
|
+ cards.append('小王')
|
|
|
+ elif p == 54:
|
|
|
+ cards.append('大王')
|
|
|
+ else:
|
|
|
+ cards.append(color[(p-1)%4] + number[(p-1)//4])
|
|
|
+ return cards
|
|
|
+
|
|
|
+
|
|
|
+def send_Card(pokers):
|
|
|
+ print('开始洗牌')
|
|
|
+ random.shuffle(pokers) # 使用shuffle打乱
|
|
|
+ print('开始发牌')
|
|
|
+
|
|
|
+ bottom = pokers[0:3]
|
|
|
+ bottom.sort()
|
|
|
+ bottom = _to_cards(bottom)
|
|
|
+
|
|
|
+ print('底牌为 : %s' % bottom)
|
|
|
+
|
|
|
+ player1 = pokers[3:20]
|
|
|
+ player2 = pokers[20:37]
|
|
|
+ player3 = pokers[37:54]
|
|
|
+
|
|
|
+ player1.sort()
|
|
|
+ player2.sort()
|
|
|
+ player3.sort()
|
|
|
+
|
|
|
+ player1 = _to_cards(player1)
|
|
|
+ player2 = _to_cards(player2)
|
|
|
+ player3 = _to_cards(player3)
|
|
|
+
|
|
|
+ print('player1 : ' + str(player1))
|
|
|
+ print('player2 : ' + str(player2))
|
|
|
+ print('player3 : ' + str(player3))
|
|
|
+
|
|
|
+pokers = get_Poker()
|
|
|
+# print(send_Card(pokers))
|
|
|
+
|
|
|
+CARD_TYPES = (
|
|
|
+ 'rocket', 'bomb',
|
|
|
+ 'single', 'pair', 'trio', 'trio_pair', 'trio_single',
|
|
|
+ 'seq_single','seq_pair','seq_trio', 'seq_trio_pair','seq_trio_single',
|
|
|
+ 'bomb_pair', 'bomb_single'
|
|
|
+)
|
|
|
+
|
|
|
+SEQ_TYPES = (
|
|
|
+ 'seq_single','seq_pair','seq_trio', 'seq_trio_pair','seq_trio_single'
|
|
|
+)
|
|
|
+
|
|
|
+
|
|
|
+def check_type(_pokers):
|
|
|
+
|
|
|
+
|
|
|
+ type = 'error'
|
|
|
+ value = 0
|
|
|
+ pokers = []
|
|
|
+ allpokers = get_Poker()
|
|
|
+
|
|
|
+ # 检查传入数据是否为列表类型和是否为空列表
|
|
|
+ if not isinstance(_pokers,list) or not _pokers:
|
|
|
+ return [type, value]
|
|
|
+
|
|
|
+ # 检查列表长度和列表内是否有重复数据
|
|
|
+ if len(_pokers)>20 or len(_pokers) != len(set(_pokers)):
|
|
|
+ return [type, value]
|
|
|
+
|
|
|
+ # 检查列表内数据是否为poker数据,并对数据进行处理
|
|
|
+ for poker in _pokers:
|
|
|
+ if poker not in allpokers:
|
|
|
+ return [type, value]
|
|
|
+ if poker == 54:
|
|
|
+ pokers.append(14)
|
|
|
+ else:
|
|
|
+ pokers.append((poker-1)//4)
|
|
|
+
|
|
|
+ pokers.sort()
|
|
|
+
|
|
|
+ #判断单张
|
|
|
+ if len(pokers) == 1:
|
|
|
+ type = 'single'
|
|
|
+ value = pokers[0]
|
|
|
+ return [type, value]
|
|
|
+
|
|
|
+ #判断火箭和单对
|
|
|
+ if len(pokers) == 2:
|
|
|
+ if pokers == [13,14]:
|
|
|
+ type = 'rocket'
|
|
|
+ value = 2000
|
|
|
+ else:
|
|
|
+ if pokers[0] == pokers[1]:
|
|
|
+ type = 'pair'
|
|
|
+ value = pokers[0]
|
|
|
+ return [type, value]
|
|
|
+
|
|
|
+ #判断三条
|
|
|
+ if len(pokers) == 3:
|
|
|
+ if pokers[0] == pokers[1] == pokers[2]:
|
|
|
+ type = 'trio'
|
|
|
+ value = pokers[0]
|
|
|
+ return [type, value]
|
|
|
+
|
|
|
+ #判断炸弹和三带一
|
|
|
+ if len(pokers) == 4:
|
|
|
+ if pokers[0] == pokers[1] == pokers[2] == pokers[3]:
|
|
|
+ type = 'bomb'
|
|
|
+ value = pokers[0]*100
|
|
|
+ else:
|
|
|
+ if pokers[0] == pokers[1] == pokers[2] or pokers[1] == pokers[2] == pokers[3]:
|
|
|
+ type = 'trio_single'
|
|
|
+ value = pokers[1]
|
|
|
+ return [type, value]
|
|
|
+
|
|
|
+ #判断单顺
|
|
|
+ if len(pokers) >= 5 and len(pokers) <= 12 and pokers[-1] <= 11:
|
|
|
+ seqpokers = []
|
|
|
+ i = pokers[0]
|
|
|
+ while i <= pokers[-1]:
|
|
|
+ seqpokers.append(i)
|
|
|
+ i += 1
|
|
|
+ if seqpokers == pokers:
|
|
|
+ type = 'seq_single'
|
|
|
+ value = pokers[0]
|
|
|
+
|
|
|
+ #判断三带一对
|
|
|
+ if len(pokers) == 5:
|
|
|
+ if (pokers[0] == pokers[1] and pokers[2] == pokers[3] == pokers[4])\
|
|
|
+ or (pokers[3] == pokers[4] and pokers[0] == pokers[1] == pokers[2]):
|
|
|
+ type = 'trio_pair'
|
|
|
+ value = pokers[2]
|
|
|
+ return [type, value]
|
|
|
+
|
|
|
+ #判断双顺
|
|
|
+ if len(pokers) >= 6 and len(pokers) % 2 == 0 and pokers[-1] <= 11:
|
|
|
+ seqpokers = []
|
|
|
+ i = pokers[0]
|
|
|
+ while i <= pokers[-1]:
|
|
|
+ seqpokers.append(i)
|
|
|
+ seqpokers.append(i)
|
|
|
+ i += 1
|
|
|
+ if seqpokers == pokers:
|
|
|
+ type = 'seq_pair'
|
|
|
+ value = pokers[0]
|
|
|
+
|
|
|
+ #判断三顺
|
|
|
+ if len(pokers) >= 6 and len(pokers) % 3 == 0 and pokers[-1] <= 11:
|
|
|
+ seqpokers = []
|
|
|
+ i = pokers[0]
|
|
|
+ while i <= pokers[-1]:
|
|
|
+ seqpokers.append(i)
|
|
|
+ seqpokers.append(i)
|
|
|
+ seqpokers.append(i)
|
|
|
+ i += 1
|
|
|
+ if seqpokers == pokers:
|
|
|
+ type = 'seq_trio'
|
|
|
+ value = pokers[0]
|
|
|
+
|
|
|
+ #判断四带二
|
|
|
+ if len(pokers) == 6:
|
|
|
+ if pokers[0] == pokers[1] == pokers[2] == pokers[3]\
|
|
|
+ or pokers[1] == pokers[2] == pokers[3] == pokers[4]\
|
|
|
+ or pokers[2] == pokers[3] == pokers[4] == pokers[5]:
|
|
|
+ type = 'bomb_single'
|
|
|
+ value = pokers[2]
|
|
|
+ return [type, value]
|
|
|
+
|
|
|
+ #判断带单飞机
|
|
|
+ if len(pokers) >= 8 and len(pokers) % 4 == 0:
|
|
|
+ tri = 0
|
|
|
+ for poker in set(pokers):
|
|
|
+ if pokers.count(poker) >= 3:
|
|
|
+ tri += 1
|
|
|
+ if poker >= value: value = poker
|
|
|
+ if tri >= (len(pokers) // 4) and tri < 6:
|
|
|
+ type = "seq_trio_single"
|
|
|
+
|
|
|
+
|
|
|
+ #判断四带两对
|
|
|
+ if len(pokers) == 8:
|
|
|
+ if pokers[0] == pokers[1] == pokers[2] == pokers[3] and pokers[4] == pokers[5] and pokers[6] == pokers[7]:
|
|
|
+ type = 'bomb_pair'
|
|
|
+ value = pokers[0]
|
|
|
+ return [type, value]
|
|
|
+ elif pokers[2] == pokers[3] == pokers[4] == pokers[5] and pokers[0] == pokers[1] and pokers[6] == pokers[7]:
|
|
|
+ type = 'bomb_pair'
|
|
|
+ value = pokers[2]
|
|
|
+ return [type, value]
|
|
|
+ elif pokers[4] == pokers[5] == pokers[6] == pokers[7] and pokers[0] == pokers[1] and pokers[2] == pokers[3]:
|
|
|
+ type = 'bomb_pair'
|
|
|
+ value = pokers[4]
|
|
|
+ return [type, value]
|
|
|
+
|
|
|
+ #判断带对飞机
|
|
|
+ if len(pokers) >= 10 and len(pokers) % 5 == 0 and type != 'seq_trio_single':
|
|
|
+ tri = 0
|
|
|
+ for poker in set(pokers):
|
|
|
+ if pokers.count(poker) == 3:
|
|
|
+ tri += 1
|
|
|
+ if poker >= value: value = poker
|
|
|
+ if pokers.count(poker) == 1:
|
|
|
+ return [type, value]
|
|
|
+ if tri >= (len(pokers) // 5) and tri < 5:
|
|
|
+ type = "seq_trio_pair"
|
|
|
+
|
|
|
+ return [type, value, len(pokers)]
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+def canPlay(lastTurnPoker, shotPoker):
|
|
|
+ last = check_type(lastTurnPoker)
|
|
|
+ shot = check_type(shotPoker)
|
|
|
+
|
|
|
+ if shot[0] == 'error':
|
|
|
+ return '出牌不合法'
|
|
|
+
|
|
|
+ if shot[0] != last[0] and shot[1] < 100:
|
|
|
+ return '出牌类型跟上家不一致'
|
|
|
+
|
|
|
+ if shot[1] <= last[1]:
|
|
|
+ return '出牌需要大于上家'
|
|
|
+
|
|
|
+ if shot[0] in SEQ_TYPES and shot[2] != last[2]:
|
|
|
+ return '牌型长度跟上家不一致'
|
|
|
+
|
|
|
+ return '可以出牌'
|
|
|
+
|
|
|
+print(canPlay([1,2,3],[2,3,4]))
|