diff --git a/src/engine/scoring.py b/src/engine/scoring.py index 1e01d5b..3b0edd0 100644 --- a/src/engine/scoring.py +++ b/src/engine/scoring.py @@ -1,6 +1,6 @@ def calculate_score(fan: int, base_score: int, is_self_draw: bool, is_dealer: bool) -> dict: """ - 根据番数和底分计算总分。 + 根据规则计算得分。 参数: - fan: 总番数。 @@ -9,17 +9,15 @@ def calculate_score(fan: int, base_score: int, is_self_draw: bool, is_dealer: bo - is_dealer: 是否为庄家。 返回: - - scores: 一个字典,包含所有玩家的得分。 - - "winner": 胜利者的得分(正数)。 - - "loser": 输家们的得分(负数)。 + - scores: 字典,包含赢家得分和输家扣分。 """ - # 计算总分 = 底分 * (2 ** 番数) + # 翻倍计算总分 total_score = base_score * (2 ** fan) if is_self_draw: # 自摸,其他三家平摊 if is_dealer: - # 庄家自摸,三家平摊且输家每人付总分 + # 庄家自摸:每家付总分 loser_score = -total_score winner_score = total_score * 3 return { @@ -27,7 +25,7 @@ def calculate_score(fan: int, base_score: int, is_self_draw: bool, is_dealer: bo "loser": [loser_score] * 3 } else: - # 闲家自摸,庄家付双倍,其他两家付单倍 + # 闲家自摸:庄家付双倍,其他两家付单倍 dealer_loss = -total_score * 2 other_loss = -total_score winner_score = total_score * 4 diff --git a/tests/test_scoring.py b/tests/test_scoring.py new file mode 100644 index 0000000..8094042 --- /dev/null +++ b/tests/test_scoring.py @@ -0,0 +1,72 @@ +from src.engine.scoring import calculate_score + + +def test_dealer_self_draw(): + """ + 测试用例 1: 庄家自摸,总番数 3,底分 10 + """ + fan = 3 + base_score = 10 + is_self_draw = True + is_dealer = True + + scores = calculate_score(fan, base_score, is_self_draw, is_dealer) + expected_scores = {"winner": 240, "loser": [-80, -80, -80]} + assert scores == expected_scores, f"庄家自摸测试失败: {scores} != {expected_scores}" + + +def test_non_dealer_point_win(): + """ + 测试用例 2: 闲家点炮,总番数 2,底分 10 + """ + fan = 2 + base_score = 10 + is_self_draw = False + is_dealer = False + + scores = calculate_score(fan, base_score, is_self_draw, is_dealer) + expected_scores = {"winner": 40, "loser": [-40, 0, 0]} + assert scores == expected_scores, f"闲家点炮测试失败: {scores} != {expected_scores}" + + +def test_non_dealer_self_draw(): + """ + 测试用例 3: 闲家自摸,总番数 4,底分 10 + """ + fan = 4 + base_score = 10 + is_self_draw = True + is_dealer = False + + scores = calculate_score(fan, base_score, is_self_draw, is_dealer) + expected_scores = {"winner": 160, "loser": [-80, -40, -40]} + assert scores == expected_scores, f"闲家自摸测试失败: {scores} != {expected_scores}" + + +def test_dealer_point_win(): + """ + 测试用例 4: 庄家点炮,总番数 1,底分 5 + """ + fan = 1 + base_score = 5 + is_self_draw = False + is_dealer = True + + scores = calculate_score(fan, base_score, is_self_draw, is_dealer) + expected_scores = {"winner": 10, "loser": [-10, 0, 0]} + assert scores == expected_scores, f"庄家点炮测试失败: {scores} != {expected_scores}" + + +if __name__ == "__main__": + # 单独执行测试 + test_dealer_self_draw() + print("测试 1: 庄家自摸通过!") + + test_non_dealer_point_win() + print("测试 2: 闲家点炮通过!") + + test_non_dealer_self_draw() + print("测试 3: 闲家自摸通过!") + + test_dealer_point_win() + print("测试 4: 庄家点炮通过!")