石头剪刀布游戏identify_winner函数if语句失效,仅执行else分支求助
石头剪刀布代码问题修复
你的代码核心问题出在变量传递和函数返回值上,导致胜负判断逻辑完全失效,具体问题和修复方案如下:
问题点分析
函数未返回选择结果
user_choose和comp_choose仅在函数内部处理输入和随机选择,但没有把结果返回给调用它们的identify_winner函数。因此identify_winner里的user和comp始终是初始值0,所有判断都基于0,自然只会触发平局的else分支。电脑选择的随机数逻辑错误
comp_choose里每次判断都调用random.randint(1,3),相当于每一次判断都会重新生成随机数,比如第一次生成1进入Rock分支,第二次生成3就会跳到Scissors分支,逻辑完全混乱,应该只生成一次随机数再做判断。主函数冗余调用
main里一开始调用的user_choose(None)和comp_choose(None)完全多余,因为identify_winner内部会循环调用这两个函数。
修复后的代码
import random ROCK = 1 PAPER = 2 SCISSORS = 3 def main(): identify_winner() def user_choose(): weapon = int(input('Choose Your Weapon' + '\n (Rock = 1, Paper = 2, Scissors = 3): ')) if weapon == 1: print('You have chosen Rock') elif weapon == 2: print('You have chosen Paper') elif weapon == 3: print('You have chosen Scissors') return weapon # 返回用户选择的数值 def comp_choose(): choice_num = random.randint(1,3) # 只生成一次随机数 if choice_num == 1: choice = 'Rock' elif choice_num == 2: choice = 'Paper' else: choice = 'Scissors' print('Your enemy has chosen', choice) return choice_num # 返回电脑选择对应的数值,方便判断胜负 def identify_winner(): while True: user = user_choose() comp = comp_choose() # 判断用户获胜的情况 if (user == 1 and comp == 3) or (user == 2 and comp == 1) or (user == 3 and comp == 2): print('Congratulations! You have defeated the foe!') break # 结束循环 # 判断电脑获胜的情况 elif (comp == 1 and user == 3) or (comp == 2 and user == 1) or (comp == 3 and user == 2): print('Alas, you have been defeated! Better luck next time!') break # 结束循环 else: print('Oh no, a tie! Choose again!') # 平局不break,继续循环 main()
关键修改说明
- 给
user_choose和comp_choose添加了return语句,把选择的数值返回给调用者,这样identify_winner里的user和comp才能拿到真实的选择结果。 - 修复了
comp_choose的随机数逻辑,只生成一次随机数再判断对应的武器,避免逻辑混乱。 - 简化了
identify_winner的循环逻辑,去掉了初始的0赋值,直接用while True循环,胜负后break,平局则继续。
内容的提问来源于stack exchange,提问作者adomo
相关产品推荐
相关产品推荐

