Python石头剪刀布游戏胜负判断异常及循环无法终止求助
问题解释
- 循环无终止逻辑:你用了
while True无限循环,但代码里完全没加终止判断——就算满足胜负条件,程序也不知道要跳出循环。 - 得分统计搞反:
pattern函数里写的是用户赢的场景(比如用户出r、电脑出s),但主函数里却在pattern返回True时给电脑加得分,等于把输赢搞反了,得分统计全错。 - 胜负判断逻辑混乱:
score函数的条件完全错误,比如computer +2 > user根本不是“电脑领先2分”的判断,而且不管什么情况都返回True,还乱打印输赢,完全没起到正确判断胜负的作用。
修正方案
步骤1:修正pattern函数的输赢判断
让它正确判断电脑赢的场景:
def pattern(user, computer): # 电脑赢的情况:电脑s克用户r,电脑r克用户p,电脑p克用户s if (computer == 's' and user == 'r') or (computer == 'r' and user == 'p') or \ (computer == 'p' and user == 's'): return True
步骤2:重写score函数,正确判断胜负
让函数返回「是否结束游戏」的结果,同时明确打印输赢:
def score(user_score, computer_score): # 判断是否有人先拿到3分 if user_score == 3: print("You win!") return True if computer_score == 3: print("I win!") return True # 判断是否有人领先2分 score_diff = abs(user_score - computer_score) if score_diff >= 2: if user_score > computer_score: print("You win by 2 points!") else: print("I win by 2 points!") return True # 不满足获胜条件,游戏继续 return False
步骤3:给主循环加终止逻辑
调用score函数后,根据返回值跳出循环,同时补全细节优化:
import random # 必须导入random模块,否则会报错 def rpc_game_normal(): rpc = ['r', 'p', 's'] computer_wins = 0 user_wins = 0 # 变量名改成user_wins,避免歧义 while True: print(f"Me: {computer_wins} | You: {user_wins} ") user = input('Your move human: ').lower() # 增加输入校验,防止用户输错 if user not in rpc: print("Invalid move! Please enter r, p, or s.") continue computer = random.choice(rpc) if user == computer: print("It's a tie!") elif pattern(user, computer): computer_wins += 1 print("I won this round!") else: user_wins += 1 print("You won this round!") # 调用score判断是否结束游戏,满足条件就跳出循环 game_over = score(user_wins, computer_wins) if game_over: break print(f"I chose {computer} and you chose {user}.\n") # 启动游戏 rpc_game_normal()
额外优化说明
- 补了
import random:你之前的代码用了random.choice但没导入,运行会直接报错 - 增加输入校验:避免用户输入非r/p/s的内容,提升游戏体验
- 变量名优化:把
wins改成user_wins,更清晰易懂
内容的提问来源于stack exchange,提问作者Asiah Crutchfield
相关产品推荐
相关产品推荐

