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

编写带积分统计的Python石头剪刀布游戏时积分重置为0的问题排查求助

石头剪刀布游戏积分重置问题的解决办法

嘿,我来帮你搞定这个积分总是重置的问题!你的代码里主要有两个核心问题导致积分无法正确累加,咱们一步步拆解:

问题1:函数参数传递的坑

Python里整数属于不可变类型,当你把points和oppoints作为参数传给result函数时,函数内部修改的只是这两个变量的局部副本,根本不会影响外部定义的全局变量。也就是说,你在函数里points +=1的时候,改的只是函数内部的临时变量,外面的points还是原来的值,看起来就像是每次都重置成0了。

问题2:重复调用result函数的逻辑错误

不管玩家选了石头、布还是剪刀,你每次都调用三次result函数:

result("rock","scissors","papper",points,oppoints) 
result("papper","rock","scissors",points,oppoints) 
result("scissors","papper","rock",points,oppoints) 

这会导致同一个回合里重复判断三次,逻辑完全混乱,就算参数传递没问题,积分也会算错。

修正后的代码

我把这两个问题都修复了,还修正了拼写错误("papper"改成了正确的"paper"),你可以直接用:

import random 

points = 0 
oppoints = 0 
opt = ["rock", "paper", "scissors"] 
ans = "yes" 

# 修改函数,让它返回更新后的积分
def result(name, win, loose, current_points, current_oppoints, cho, opp): 
    if cho == name: 
        if opp == win: 
            current_points += 1 
            print("congrats you got a point") 
        elif opp == loose: 
            current_oppoints += 1 
            print("you lost the point") 
        else : 
            print("its a tie no one gets a point") 
    return current_points, current_oppoints  # 返回更新后的积分

while ans == "yes" : 
    # 先重置积分,准备新一局
    points = 0
    oppoints = 0
    while points < 2 and oppoints < 2 :  # 改成and,一方到2分就结束对局
        cho = input("rock paper scissors: ").lower()  # 转小写避免大小写问题
        # 验证输入是否合法
        while cho not in opt:
            print("Invalid input! Please enter rock, paper, or scissors.")
            cho = input("rock paper scissors: ").lower()
            
        opp = random.choice(opt) 
        print("opponent: " + opp) 
        
        # 根据玩家选择,只调用对应的判断函数
        if cho == "rock":
            points, oppoints = result("rock", "scissors", "paper", points, oppoints, cho, opp)
        elif cho == "paper":
            points, oppoints = result("paper", "rock", "scissors", points, oppoints, cho, opp)
        elif cho == "scissors":
            points, oppoints = result("scissors", "paper", "rock", points, oppoints, cho, opp)
            
        print("Your points:", points) 
        print("Opponent's points:", oppoints) 
        
    if points > oppoints : 
        print("you win!!") 
    else: 
        print("you lost :(") 
    ans = input("wanna play again?? ").lower() 

print("good bye")

额外优化点说明

  • 把循环条件从points < 2 or oppoints < 2改成了points < 2 and oppoints < 2,这样只要有一方先拿到2分,就结束当前对局,更符合常规规则。
  • 增加了输入验证,避免玩家输入错误的内容导致逻辑出错。
  • 把输入转成小写,玩家输入Rock、PAPER这类大小写混合的内容也能正常识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:52:35