Jelajahi Sumber

发牌&判断牌大小

LAPTOP-2ACP37JG\shark 4 tahun lalu
induk
melakukan
5e580fe14e
1 mengubah file dengan 242 tambahan dan 0 penghapusan
  1. 242 0
      rule.py

+ 242 - 0
rule.py

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