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]))