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

《Python编程:快速上手》RPS游戏代码执行异常求助

石头剪刀布游戏循环卡死问题解决

我参考《Python编程:快速上手——让繁琐工作自动化》中的「简短程序:石头剪刀布」示例编写了RPS游戏,但输入操作指令后始终卡在输入提示循环,无法触发电脑出拳和胜负判断逻辑。

执行日志

ROCK, PAPER, SCISSORS
0 Wins,0 Losses, 0 Ties
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
P
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
S
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
Q
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
p
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
r
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
s
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
p
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
r
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
s
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
ss
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
s
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
s
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
s
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
Enter your move: (r)ock (p)aper (s)cissors or (q)uits
s
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
s
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
Enter your move: (r)ock (p)aper (s)cissors or (q)uit

原代码

import random, sys

print('ROCK, PAPER, SCISSORS')

#These variables keep track of the number of wins, losses, and ties.
wins = 0
losses = 0
ties = 0

while True: # The main game loop.
    print('%s Wins, %s Losses, %s Ties' % (wins, losses, ties))
    while True: # The player input loop.
        print('Enter your move: (r)ock (p)aper (s)cissors or (q)uit')
        playerMove = input()
        if playerMove == 'q':
            sys.exit() # Quit the program.
            if playerMove == 'r' or playerMove == 'p' or playerMove == 's':
                break # Break out of the player input loop.
            print('Type one of r, p, s, or q.')

# Display what the player chose:
if playerMove == 'r':
    print('ROCK versus...')
elif playerMove == 'p':
    print('PAPER versus...')
elif playerMove == 's':
    print('SCISSORS versus...')

# Display what the computer chose:
randomNumber = random.randiant(1,3)
if randomNumber == 1:
    computerMove = 'r'
    print('ROCK')
elif randomNumber == 2:
    computerMove = 'p'
    print('PAPER')
elif randomNumber == 3:
    computerMove = 's'
    print('SCISSORS')

# Display and record the win/loss/tie:
if playerMove == computerMove:
    print('It is a tie!')
    ties = ties + 1
elif playerMove == 'r' and computerMove == 's':
        print('You win!')
        wins = wins + 1
elif playerMove == 'p' and computerMove == 'r':
        print('You win!')
        wins = wins + 1
elif playerMove == 's' and computerMove == 'p':
        print('You win!')
        wins = wins + 1
elif playerMove == 'r' and computerMove == 'p':
        print('You lose!')
        losses = losses + 1
elif playerMove == 'p' and computerMove == 's':
        print('You lose!')
        losses = losses + 1
elif playerMove == 's' and computerMove == 'r':
        print('You lose!')
        losses = losses + 1

问题原因

  • 缩进错误:输入有效性判断的代码被错误缩进在if playerMove == 'q':的代码块内,sys.exit()执行后后续代码不会运行;即使输入不是q,这段判断也永远不会触发,导致无法跳出输入循环。
  • 大小写不兼容:原代码仅判断小写的r/p/s/q,用户输入大写字母时无法识别,会一直提示重新输入。
  • 函数拼写错误:random.randiant应为random.randint,函数名错误会导致程序运行报错。
  • 代码块位置错误:电脑出拳、胜负判断的代码都写在主游戏循环之外,即使跳出输入循环也永远不会执行。

修正后的代码

import random, sys

print('ROCK, PAPER, SCISSORS')

# 记录胜负平次数
wins = 0
losses = 0
ties = 0

while True:  # 主游戏循环
    print('%s Wins, %s Losses, %s Ties' % (wins, losses, ties))
    while True:  # 玩家输入循环
        print('Enter your move: (r)ock (p)aper (s)cissors or (q)uit')
        playerMove = input().lower()  # 统一转为小写,兼容大小写输入
        if playerMove == 'q':
            sys.exit()  # 退出程序
        if playerMove in ['r', 'p', 's']:
            break  # 输入有效,跳出输入循环
        print('请输入r、p、s或q中的一个。')

    # 显示玩家选择
    if playerMove == 'r':
        print('ROCK versus...')
    elif playerMove == 'p':
        print('PAPER versus...')
    elif playerMove == 's':
        print('SCISSORS versus...')

    # 电脑出拳
    randomNumber = random.randint(1, 3)
    computerMove = ''
    if randomNumber == 1:
        computerMove = 'r'
        print('ROCK')
    elif randomNumber == 2:
        computerMove = 'p'
        print('PAPER')
    elif randomNumber == 3:
        computerMove = 's'
        print('SCISSORS')

    # 判断胜负并更新记录
    if playerMove == computerMove:
        print('平局!')
        ties += 1
    elif (playerMove == 'r' and computerMove == 's') or \
         (playerMove == 'p' and computerMove == 'r') or \
         (playerMove == 's' and computerMove == 'p'):
        print('你赢了!')
        wins += 1
    else:
        print('你输了!')
        losses += 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:55:27