《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
相关产品推荐
相关产品推荐

