Compare commits
3 Commits
c5c37bb36d
...
cd74bd3eb5
| Author | SHA1 | Date | |
|---|---|---|---|
| cd74bd3eb5 | |||
| 839cb9f2f9 | |||
| 93e6cc5909 |
40
README.md
40
README.md
@@ -92,28 +92,54 @@
|
|||||||
#### 详细番数计算
|
#### 详细番数计算
|
||||||
|
|
||||||
1. **平胡(基本胡)**:四坎牌加一对将,四坎牌可以是刻子或顺子,计为1番。
|
1. **平胡(基本胡)**:四坎牌加一对将,四坎牌可以是刻子或顺子,计为1番。
|
||||||
|
|
||||||
2. **清一色**:
|
2. **清一色**:
|
||||||
|
|
||||||
- 不带杠的清一色称为“素清”,计为2番。
|
- 不带杠的清一色称为“素清”,计为2番。
|
||||||
- 带杠的清一色或清一色对子胡(简称“清对”)计为3番,称为“极品”,点炮40分。
|
- 带杠的清一色或清一色对子胡(简称“清对”)计为3番,称为“极品”。
|
||||||
- 带两杠的清一色或清一色对子胡带杠计为4番,称为“极中极”或“精品”,点炮80分。
|
- 带两杠的清一色或清一色对子胡带杠计为4番,称为“极中极”或“精品”。<!--存疑-->
|
||||||
3. **带幺九**:手牌中含有1或9的牌,计为3番。
|
|
||||||
|
3. **带幺九**:
|
||||||
|
|
||||||
|
- **带幺九**:指玩家手上的牌全部是由1和9组成的顺子、刻子或对子。例如,123, 789, 111, 999, 11等。计为3番。
|
||||||
|
|
||||||
|
- **清带幺九**:指玩家手上的牌不仅全部由1和9组成,而且是同一花色(条、筒、万),即清一色的带幺九。计为1番。<!--存疑-->
|
||||||
|
|
||||||
4. **七对**:手牌由7个对子组成,计为2番。
|
4. **七对**:手牌由7个对子组成,计为2番。
|
||||||
|
|
||||||
5. **全求人**:所有牌都是通过碰、杠、吃别人打出的牌来完成的,计为6番。
|
5. **全求人**:所有牌都是通过碰、杠、吃别人打出的牌来完成的,计为6番。
|
||||||
|
|
||||||
6. **龙七对**:七对中有一对是三张相同的牌,计为12番。
|
6. **龙七对**:七对中有一对是三张相同的牌,计为12番。
|
||||||
|
|
||||||
7. **清七对**:全部由一种花色组成的七对,计为12番。
|
7. **清七对**:全部由一种花色组成的七对,计为12番。
|
||||||
|
|
||||||
8. **杠上开花**:在杠牌之后立即自摸胡牌,计为1番。
|
8. **杠上开花**:在杠牌之后立即自摸胡牌,计为1番。
|
||||||
|
|
||||||
9. **抢杠胡**:当其他玩家明杠时,你正好可以胡那张牌,计为1番。
|
9. **抢杠胡**:当其他玩家明杠时,你正好可以胡那张牌,计为1番。
|
||||||
|
|
||||||
10. **天胡**:庄家起牌后直接胡牌,计为12番。
|
10. **天胡**:庄家起牌后直接胡牌,计为12番。
|
||||||
|
|
||||||
11. **地胡**:闲家在第一轮打牌时就胡牌,计为12番。
|
11. **地胡**:闲家在第一轮打牌时就胡牌,计为12番。
|
||||||
|
|
||||||
12. **大对子**:手牌由四个对子加一个刻子组成,计为2番。
|
12. **大对子**:手牌由四个对子加一个刻子组成,计为2番。
|
||||||
|
|
||||||
13. **小七对**:有六对加上一个对子,计为2番。
|
13. **小七对**:有六对加上一个对子,计为2番。
|
||||||
14. **杠上炮**:在杠牌之后放炮让他人胡牌,通常不加分,但有时会根据地方规则有所调整。
|
|
||||||
15. **金钩吊**:手上只剩下一张牌等别人打出,然后胡牌,计为1番。
|
14. **金钩吊**:手上只剩下一张牌等别人打出,然后胡牌,计为1番。
|
||||||
16. **海底捞月**:最后一张牌被玩家摸到并胡牌,计为1番。
|
|
||||||
17. **海底炮**:最后一张牌被打出,导致玩家胡牌,计为1番。
|
15. **海底捞月**:最后一张牌被玩家摸到并胡牌,计为1番。
|
||||||
|
|
||||||
|
16. **海底炮**:最后一张牌被打出,导致玩家胡牌,计为1番。
|
||||||
|
|
||||||
这些番数可以叠加,例如,如果一个玩家同时满足了清一色和七对,那么他的总番数就是2番(清一色)+ 2番(七对)= 4番。
|
这些番数可以叠加,例如,如果一个玩家同时满足了清一色和七对,那么他的总番数就是2番(清一色)+ 2番(七对)= 4番。
|
||||||
|
|
||||||
|
### 计分规则
|
||||||
|
|
||||||
|
- **基本分值**:每番的具体分值可以根据不同的玩法和地区有所不同,但一般情况下,每番的分值可以设定为一个固定的数值,比如5分、10分等。
|
||||||
|
- **翻倍规则**:某些地方可能会有额外的翻倍规则,例如,如果胡牌者是在“海底捞月”或“杠上开花”等特殊情况下胡牌,可能会有额外的加分。
|
||||||
|
|
||||||
|
**自摸 **:是指玩家通过自己摸牌完成胡牌。自摸时,其他玩家都需要给赢家支付相应的分数。
|
||||||
|
|
||||||
## 成都麻将规则建模
|
## 成都麻将规则建模
|
||||||
|
|
||||||
麻将游戏引擎建模代码于项目根src/engine/目录下
|
麻将游戏引擎建模代码于项目根src/engine/目录下
|
||||||
@@ -16,34 +16,45 @@ def calculate_fan(hand, melds, is_self_draw, is_cleared, conditions):
|
|||||||
|
|
||||||
# 定义番种规则
|
# 定义番种规则
|
||||||
rules = {
|
rules = {
|
||||||
"basic_win": lambda: 1 if not (conditions.get("is_seven_pairs", False) or conditions.get("is_big_pairs", False) or conditions.get("is_dragon_seven_pairs", False)) else 0,
|
"basic_win": lambda: 1 if not (conditions.get("is_seven_pairs", False) or
|
||||||
"is_cleared": lambda: 2 if is_cleared else 0, # 清一色
|
conditions.get("is_big_pairs", False) or
|
||||||
"is_pure_cleared": lambda: 3 if is_cleared and len(melds) >= 1 else 0, # 清对
|
conditions.get("is_dragon_seven_pairs", False) or
|
||||||
"is_double_pure_cleared": lambda: 4 if is_cleared and len(melds) >= 2 else 0, # 极中极
|
conditions.get("is_pure_cleared", False) or
|
||||||
"is_seven_pairs": lambda: 2 if conditions.get("is_seven_pairs", False) and not conditions.get("is_dragon_seven_pairs", False) else 0,
|
conditions.get("is_double_pure_cleared", False)) else 0,
|
||||||
"is_dragon_seven_pairs": lambda: 12 if conditions.get("is_dragon_seven_pairs", False) else 0, # 龙七对
|
"is_cleared": lambda: 2 if is_cleared and not (conditions.get("is_pure_cleared", False) or
|
||||||
"is_clear_seven_pairs": lambda: 12 if conditions.get("is_clear_seven_pairs", False) else 0, # 清七对
|
conditions.get("is_double_pure_cleared", False)) else 0,
|
||||||
"is_big_pairs": lambda: 2 if conditions.get("is_big_pairs", False) else 0, # 大对子
|
"is_pure_cleared": lambda: 3 if is_cleared and len(melds) >= 1 and not conditions.get("is_double_pure_cleared",
|
||||||
"is_small_pairs": lambda: 2 if conditions.get("is_small_pairs", False) else 0, # 小七对
|
False) else 0,
|
||||||
"is_full_request": lambda: 6 if conditions.get("is_full_request", False) else 0, # 全求人
|
"is_double_pure_cleared": lambda: 4 if is_cleared and len(melds) >= 2 else 0,
|
||||||
"is_gang_flower": lambda: 1 if conditions.get("is_gang_flower", False) else 0, # 杠上开花
|
# 极中极,带两杠的清一色或清一色对子胡带杠计为4番,称为“极中极”或“精品”,点炮80分。
|
||||||
"is_rob_gang": lambda: 1 if conditions.get("is_rob_gang", False) else 0, # 抢杠胡
|
"is_seven_pairs": lambda: 2 if conditions.get("is_seven_pairs", False) and not conditions.get(
|
||||||
"is_under_the_sea": lambda: 1 if conditions.get("is_under_the_sea", False) else 0, # 海底捞月
|
"is_dragon_seven_pairs", False) else 0,
|
||||||
"is_cannon": lambda: 1 if conditions.get("is_cannon", False) else 0, # 放炮
|
# 七对:手牌由7个对子组成,计为2番。
|
||||||
"is_tian_hu": lambda: 12 if conditions.get("is_tian_hu", False) else 0, # 天胡
|
"is_dragon_seven_pairs": lambda: 12 if conditions.get("is_dragon_seven_pairs", False) else 0,
|
||||||
"is_di_hu": lambda: 12 if conditions.get("is_di_hu", False) else 0, # 地胡
|
# 龙七对,七对中有一对是三张相同的牌,计为12番。
|
||||||
"is_self_draw": lambda: 1 if is_self_draw and conditions.get("add_self_draw", True) else 0, # 自摸
|
"is_clear_seven_pairs": lambda: 12 if conditions.get("is_clear_seven_pairs", False) else 0,
|
||||||
|
# 清七对,全部由一种花色组成的七对,计为12番。
|
||||||
|
"is_big_pairs": lambda: 2 if conditions.get("is_big_pairs", False) else 0, # 大对子,手牌由四个对子加一个刻子组成,计为2番。
|
||||||
|
"is_small_pairs": lambda: 2 if conditions.get("is_small_pairs", False) else 0, # 小七对,有六对加上一个对子,计为2番。
|
||||||
|
"is_full_request": lambda: 6 if conditions.get("is_full_request", False) else 0,
|
||||||
|
# 全求人,所有牌都是通过碰、杠、吃别人打出的牌来完成的,计为6番。
|
||||||
|
"is_gang_flower": lambda: 1 if conditions.get("is_gang_flower", False) else 0, # 杠上开花,在杠牌之后立即自摸胡牌,计为1番。
|
||||||
|
"is_rob_gang": lambda: 1 if conditions.get("is_rob_gang", False) else 0, # 抢杠胡,当其他玩家明杠时,你正好可以胡那张牌,计为1番。
|
||||||
|
"is_under_the_sea": lambda: 1 if conditions.get("is_under_the_sea", False) else 0, # 海底捞月,最后一张牌被玩家摸到并胡牌,计为1番。
|
||||||
|
"is_tian_hu": lambda: 12 if conditions.get("is_tian_hu", False) else 0, # 天胡,庄家起牌后直接胡牌,计为12番。
|
||||||
|
"is_di_hu": lambda: 12 if conditions.get("is_di_hu", False) else 0, # 地胡,闲家在第一轮打牌时就胡牌,计为12番。
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 逐一应用规则
|
||||||
# 逐一应用规则
|
# 逐一应用规则
|
||||||
for rule, func in rules.items():
|
for rule, func in rules.items():
|
||||||
fan += func()
|
result = func()
|
||||||
|
fan += result
|
||||||
|
print(f"Rule: {rule}, Fan: {result}") # 调试输出
|
||||||
|
|
||||||
return fan
|
return fan
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def is_seven_pairs(hand):
|
def is_seven_pairs(hand):
|
||||||
"""
|
"""
|
||||||
检查手牌是否是七对。
|
检查手牌是否是七对。
|
||||||
@@ -70,5 +81,3 @@ def is_big_pairs(hand):
|
|||||||
result = counts.count(2) == 1 and counts.count(3) >= 3
|
result = counts.count(2) == 1 and counts.count(3) >= 3
|
||||||
print(f"Big pairs check: {result}, Counter: {Counter(counts)}")
|
print(f"Big pairs check: {result}, Counter: {Counter(counts)}")
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user