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