Python石头剪刀布代码输入r/p/s后无法继续执行问题求助
石头剪刀布游戏流程卡住故障排查
问题表现
- 运行环境:PyCharm
- 现象:程序可正常接收
r/p/s/q输入,输入q可正常退出,但输入r/p/s后不会进入出拳展示、胜负判定环节,无任何报错信息,仅会重复打印战绩和输入提示。
故障原因
一共3处逻辑错误,和循环逻辑有关,但不是break语法本身的问题:
- 代码缩进错误导致核心逻辑永远不触发:内层输入循环的作用是校验用户输入是否合法,合法就break跳出输入循环。但原代码的出拳打印、电脑随机出拳、胜负判定所有核心逻辑,全部被缩进放在了内层输入循环的内部,且位于「输入合法则break」的判断之后。当用户输入合法的r/p/s时,代码直接执行break跳出内层循环,回到外层主循环重新打印战绩,根本不会走到后面的游戏逻辑,自然看起来没有任何推进。
- 失败计数变量拼写错误:所有判定玩家失败的分支里,计数变量写成了
lossess(多打了一个s),和一开始定义的losses不是同一个变量,就算走到判定逻辑,失败次数也不会正确累计。 - 额外小问题:输入提示里的剪刀单词拼错成了
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
相关产品推荐
相关产品推荐

