如何修复Pig骰子游戏中的分数重置问题:正确维护玩家累计得分

如何修复Pig骰子游戏中的分数重置问题:正确维护玩家累计得分

本文详解python实现pig骰子游戏时total_score在每回合重置的根本原因,并提供结构清晰、变量作用域合理的重构方案,确保得分持续累加直至达成胜利目标(100分)。

本文详解python实现pig骰子游戏时total_score在每回合重置的根本原因,并提供结构清晰、变量作用域合理的重构方案,确保得分持续累加直至达成胜利目标(100分)。

在原始代码中,total_score 和 turn_score 作为参数传入 process_player_turn() 函数,但由于 Python 中整数是不可变对象,函数内部对 total_score 的修改(如 total_score = total_score + turn_score)仅作用于局部副本,不会影响调用方的原始变量。因此每次进入新玩家回合时,total_score 始终从初始值(0)开始,造成“分数重置”的错觉。

根本解决思路是:将累计总分的管理逻辑移出函数作用域,由主循环统一维护;同时为每个玩家独立维护回合得分(turn_score),避免跨回合污染。以下是优化后的完整实现:

import random

MAX_SCORE = 100

print(f"""Welcome to Pig Dice. Get 2 to 10 players and one 6 sided die.
During a player's turn, they may roll the die as many times as they wish.
At the end of their turn, add all of their points together and pass the die to the next person.
However, if they roll a one, they lose all points gained, and that turn ends.
First one to score {MAX_SCORE} points wins.""")

# 获取玩家列表
players = []
while True:
    name = input("Player name (hit enter to quit): ").strip()
    if name:
        players.append(name)
    else:
        break

if len(players) < 2:
    print("Game requires at least 2 players.")
    exit()

# 全局总分(所有玩家共享,累计至获胜)
total_score = 0

# 主游戏循环
while True:
    for player in players:
        turn_score = 0  # 每位玩家每回合独立初始化回合分
        print(f"\n--- {player}'s Turn ---")

        while True:
            choice = input(f"{player}, would you like to roll or pass? ").strip().lower()

            if choice == "roll":
                value = random.randint(1, 6)
                print(f"{player} rolled a {value}")
                turn_score += value

                if value == 1:
                    print(f"{player} rolled a 1! All points lost this turn.")
                    turn_score = 0
                    print(f"Total score remains: {total_score}")
                    break  # 结束当前回合

            elif choice == "pass":
                total_score += turn_score
                print(f"{player} passed. Added {turn_score} points.")
                print(f"Total score: {total_score}")
                break

            else:
                print("Please enter 'roll' or 'pass'.")
                continue

        # 检查是否获胜(在每回合结束后立即判断)
        if total_score >= MAX_SCORE:
            print(f"\n? {player} reaches {total_score} points and WINS!")
            exit()

关键改进点说明:

  • 作用域清晰:total_score 在主循环外定义并持续更新,所有回合共享同一变量;turn_score 在每轮玩家循环内重新初始化,保证回合隔离。
  • 逻辑健壮性:增加输入校验(.strip().lower())、空名过滤、最少玩家数检查,提升用户体验。
  • 获胜判定及时:在每次 pass 或 roll=1 后立即检查 total_score >= MAX_SCORE,避免多轮无效执行。
  • 可读性增强:添加回合分隔提示、明确提示语、错误输入引导。

⚠️ 注意事项:

  • 当前版本为单总分模式(所有玩家共同累积至100分),若需实现“每位玩家独立计分、先达100者胜”,应改为 player_scores = {name: 0 for name in players} 字典存储,并在每回合更新对应玩家分数。
  • 实际项目中建议进一步封装为类(如 PigGame),以更好管理状态、支持重开、统计等扩展功能。

通过重构变量生命周期与控制流,彻底解决分数重置问题——让Pig游戏真正“记分”,而非“忘分”。

文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xitongjiaocheng/123760.html

上一篇 2026-07-01 13:26
JavaScript 定时器与 Promise 执行顺序的优先级分析
下一篇 2026-07-01 13:26

相关推荐