请用python写一份斗地主的出牌规则和牌型定义
时间: 2023-11-28 14:48:49 浏览: 75
斗地主出牌规则和牌型定义:
在斗地主中,牌的大小顺序为:大王、小王、2、A、K、Q、J、10、9、8、7、6、5、4、3。
1. 牌型定义
- 单张:一张牌。
- 对子:两张点数相同的牌。
- 三带零:三张点数相同的牌,不带任何牌。
- 三带一:三张点数相同的牌,带一张单牌。
- 三带二:三张点数相同的牌,带一对牌。
- 炸弹:四张点数相同的牌。
- 连对:两个或两个以上的连续对子,如33,44,55。
- 顺子:五个或五个以上的连续单牌,如34567,45678910JQKA。
- 飞机带零:两个或两个以上的连续三张牌,不带任何牌。
- 飞机带单:两个或两个以上的连续三张牌,带相同数量的单牌。
- 飞机带对:两个或两个以上的连续三张牌,带相同数量的对子。
2. 出牌规则
- 单张、对子、三带零、炸弹可以单独出牌。
- 三带一、三带二需要满足带的牌与三张牌点数相同。
- 连对、顺子、飞机带零、飞机带单、飞机带对需要满足牌数相同,首尾牌点数相差不超过1,且牌点数大于上家出牌。
- 炸弹可以打过任何其他牌型。
- 如果手牌中有火箭(大王+小王),可以不按照规则出牌,直接将火箭打出。
下面是一份基于Python的斗地主出牌规则和牌型定义的代码示例:
```python
# 牌型定义
SINGLE_CARD = 1
PAIR = 2
TRIPLE_ZERO = 3
TRIPLE_ONE = 4
TRIPLE_TWO = 5
BOMB = 6
CONNECTED_PAIR = 7
STRAIGHT = 8
PLANE_ZERO = 9
PLANE_ONE = 10
PLANE_TWO = 11
# 出牌规则
def is_valid(cards, last_cards):
if not last_cards:
return True
last_type, last_rank, _ = analyze_cards(last_cards)
type, rank, _ = analyze_cards(cards)
if type == BOMB:
return True
elif type == last_type and rank > last_rank:
return True
return False
# 牌型分析
def analyze_cards(cards):
cards.sort()
length = len(cards)
if length == 1:
return SINGLE_CARD, cards[0], 1
elif length == 2:
if cards[0] == cards[1]:
return PAIR, cards[0], 2
elif cards[0] == BLACK_JOKER and cards[1] == RED_JOKER:
return BOMB, cards[0], 2
elif length == 3:
if cards[0] == cards[1] == cards[2]:
return TRIPLE_ZERO, cards[0], 3
elif length == 4:
if cards[0] == cards[1] == cards[2] == cards[3]:
return BOMB, cards[0], 4
elif cards[0] == cards[1] == cards[2]:
return TRIPLE_ONE, cards[0], 4
elif cards[1] == cards[2] == cards[3]:
return TRIPLE_TWO, cards[1], 4
elif length >= 5:
is_connected_pair = True
for i in range(0, length, 2):
if i == length - 1 or cards[i] != cards[i+1] or cards[i] - cards[i+1] != 1:
is_connected_pair = False
break
if is_connected_pair:
return CONNECTED_PAIR, cards[0], length
is_straight = True
for i in range(length-1):
if cards[i] - cards[i+1] != 1:
is_straight = False
break
if is_straight:
return STRAIGHT, cards[0], length
plane_length = length // 5
if plane_length >= 2:
is_plane = True
for i in range(plane_length):
for j in range(2):
if cards[i*3+j] != cards[i*3+j+1] or cards[i*3+j] != cards[i*3+j+2]:
is_plane = False
break
if not is_plane:
break
if is_plane:
if plane_length * 5 == length:
return PLANE_ZERO, cards[0], length
elif plane_length * 5 == length + plane_length:
return PLANE_ONE, cards[0], length
elif plane_length * 5 == length + plane_length * 2:
return PLANE_TWO, cards[0], length
return None, None, None
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)