Compare commits

...

3 Commits

Author SHA1 Message Date
cd74bd3eb5 Update calculate_fan.py 2024-11-30 16:32:00 +08:00
839cb9f2f9 Update calculate_fan.py 2024-11-30 16:07:51 +08:00
93e6cc5909 Update README.md 2024-11-30 16:06:43 +08:00
2 changed files with 64 additions and 29 deletions

View File

@@ -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/目录下

View File

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