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

石头剪刀布游戏identify_winner函数if语句失效,仅执行else分支求助

石头剪刀布代码问题修复

你的代码核心问题出在变量传递和函数返回值上,导致胜负判断逻辑完全失效,具体问题和修复方案如下:

问题点分析

  1. 函数未返回选择结果
    user_choose和comp_choose仅在函数内部处理输入和随机选择,但没有把结果返回给调用它们的identify_winner函数。因此identify_winner里的user和comp始终是初始值0,所有判断都基于0,自然只会触发平局的else分支。

  2. 电脑选择的随机数逻辑错误
    comp_choose里每次判断都调用random.randint(1,3),相当于每一次判断都会重新生成随机数,比如第一次生成1进入Rock分支,第二次生成3就会跳到Scissors分支,逻辑完全混乱,应该只生成一次随机数再做判断。

  3. 主函数冗余调用
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:06:27