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

Python石头剪刀布代码输入r/p/s后无法继续执行问题求助

石头剪刀布游戏流程卡住故障排查

问题表现

  • 运行环境:PyCharm
  • 现象:程序可正常接收r/p/s/q输入,输入q可正常退出,但输入r/p/s后不会进入出拳展示、胜负判定环节,无任何报错信息,仅会重复打印战绩和输入提示。

故障原因

一共3处逻辑错误,和循环逻辑有关,但不是break语法本身的问题:

  1. 代码缩进错误导致核心逻辑永远不触发:内层输入循环的作用是校验用户输入是否合法,合法就break跳出输入循环。但原代码的出拳打印、电脑随机出拳、胜负判定所有核心逻辑,全部被缩进放在了内层输入循环的内部,且位于「输入合法则break」的判断之后。当用户输入合法的r/p/s时,代码直接执行break跳出内层循环,回到外层主循环重新打印战绩,根本不会走到后面的游戏逻辑,自然看起来没有任何推进。
  2. 失败计数变量拼写错误:所有判定玩家失败的分支里,计数变量写成了lossess(多打了一个s),和一开始定义的losses不是同一个变量,就算走到判定逻辑,失败次数也不会正确累计。
  3. 额外小问题:输入提示里的剪刀单词拼错成了sissorcs,不影响运行但会误导用户。

修复后可运行代码

import random
import sys

print('Rock, Paper, Scissor')

# 分别记录胜场、负场、平局数
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()
        if playerMove == 'q':
            sys.exit()
        if playerMove == 'r' or playerMove == 'p' or playerMove == 's':
            break
        print('Type one of r, p, s, or q.')

    # 以下是核心游戏逻辑,和内层输入循环同级,拿到合法输入后必然执行
    # 打印玩家出拳
    if playerMove == 'r':
        print('Rock versus...')
    elif playerMove == 's':
        print('Scissors versus...')
    elif playerMove == 'p':
        print('Paper versus...')

    # 电脑随机出拳
    randomNumber = random.randint(1,3)
    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('Wow! It is a tie!')
        ties = ties + 1
    elif playerMove == 'r' and computerMove == 's':
        print('Rock smashes Scissors! You win!!!')
        wins = wins + 1
    elif playerMove == 'p' and computerMove == 'r':
        print('Paper smothers Rock! You win!!!')
        wins = wins + 1
    elif playerMove == 's' and computerMove == 'p':
        print('Scissors slice Paper! You win!!!')
        wins = wins + 1
    elif playerMove == 's' and computerMove == 'r':
        print('Rock smashes Scissors! You lose!!!')
        losses = losses + 1
    elif playerMove == 'r' and computerMove == 'p':
        print('Paper smothers Rock! You lose!!!')
        losses = losses + 1
    elif playerMove == 'p' and computerMove == 's':
        print('Scissors slice Paper! You lose!!!')
        losses = losses + 1

通用排查技巧

  • Python靠缩进划分代码块归属,遇到循环/分支逻辑不按预期走,先顺着缩进检查每段代码属于哪个层级:内层循环里的break只会跳出内层循环,不会执行循环内break语句之后的代码。
  • 无报错但逻辑断层时,在怀疑的执行节点插入简单的print("测试标记1")这类语句,看运行时哪些标记被打印了,就能快速定位到代码在哪一步断了。
  • 变量拼写错误不会触发语法报错,但会导致赋值/计数失效,开编辑器的变量高亮功能即可快速排查:没被识别成已定义变量的拼写,会和正常变量显示不同的颜色。

内容的提问来源于stack exchange,提问作者Sylas Sloan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 09:03:33