You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:不使用global语句在函数内递增全局胜负变量的方法

问题解决:回合制游戏胜场计数不更新的问题

问题原因

你遇到的核心问题是Python中整数属于不可变类型,当你把p1_wins和p2_wins作为参数传入函数时,函数内部拿到的是这两个变量的副本。你在函数里对副本做的+=1操作,只会修改副本的值,完全不会影响外部的全局变量,所以外部的胜场计数始终不会更新。

解决方案

方案1:让函数返回更新后的胜场值

这是最直接的无全局变量方案,让函数处理完胜负判断后,返回更新后的p1_wins和p2_wins,然后在主循环中重新赋值给全局变量:

p1_wins = 0
p2_wins = 0

def judge_round(p1_wins, p2_wins, p1_answer, p2_answer):
    if p1_answer > p2_answer:
        print('Player 1 Won the Round')
        p1_wins += 1
    elif p1_answer < p2_answer:
        print('Player 2 Won the Round')
        p2_wins += 1
    # 平局的情况可以在这里补充处理
    return p1_wins, p2_wins

while True:
    # 先判断是否有人获胜,获胜后退出循环
    if p1_wins == 3:
        print('Player 1 Wins the Game!')
        break
    if p2_wins == 3:
        print('Player 2 Wins the Game!')
        break

    # 注意:输入的内容是字符串,需要转成整数才能比较
    p1_answer = int(input("Player 1 enter your number: "))
    p2_answer = int(input("Player 2 enter your number: "))

    # 接收函数返回的更新后的值
    p1_wins, p2_wins = judge_round(p1_wins, p2_wins, p1_answer, p2_answer)

方案2:用类封装游戏状态(更推荐的工程化写法)

如果游戏后续有扩展需求,比如添加玩家名字、平局次数统计等,用类来封装状态和逻辑会更清晰,彻底告别全局变量:

class TurnBasedGame:
    def __init__(self):
        self.p1_wins = 0
        self.p2_wins = 0

    def judge_round(self, p1_answer, p2_answer):
        if p1_answer > p2_answer:
            print('Player 1 Won the Round')
            self.p1_wins += 1
        elif p1_answer < p2_answer:
            print('Player 2 Won the Round')
            self.p2_wins += 1

    def start_game(self):
        while True:
            if self.p1_wins == 3:
                print('Player 1 Wins the Game!')
                break
            if self.p2_wins == 3:
                print('Player 2 Wins the Game!')
                break

            p1_answer = int(input("Player 1 enter your number: "))
            p2_answer = int(input("Player 2 enter your number: "))
            self.judge_round(p1_answer, p2_answer)

# 启动游戏
game = TurnBasedGame()
game.start_game()

关于是否需要这个函数的疑问

非常有必要保留这个函数。把胜负判断的逻辑抽离成独立函数,有几个好处:

  • 代码结构更清晰:主循环只负责流程控制(输入、胜负判定、退出),具体的回合胜负逻辑集中在一个地方
  • 可维护性更强:以后如果要修改胜负规则(比如改成比较奇偶、或者加入道具加成),只需要修改judge_round函数,不用动主循环的代码
  • 可复用性:如果后续要添加多轮模式、或者其他需要判断胜负的场景,可以直接调用这个函数

内容的提问来源于stack exchange,提问作者JLizotte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:37:03