如何实现无限循环的石头剪刀布游戏并简化Python代码?
解决方案:无限循环+简化版石头剪刀布代码
直接用下面的代码替换原有代码,它实现了无限循环直到输入q退出,同时大幅简化了逻辑:
import random # 定义合法的移动选项和胜负规则 VALID_MOVES = ["r", "p", "s"] WIN_CONDITIONS = {"r": "s", "p": "r", "s": "p"} # 玩家出key时能击败的电脑出法 while True: user_move = input("Enter your move: (r)ock (p)aper (s)cissors or (q)uit: ").lower() if user_move == "q": print("You've quit the game!") break if user_move not in VALID_MOVES: print("Invalid move, please enter r/p/s/q.") continue # 电脑随机出拳 computer_move = random.choice(VALID_MOVES) # 判断胜负 if computer_move == WIN_CONDITIONS[user_move]: print("You've won!") elif computer_move == user_move: print("You went even!") else: print("You lost!")
关键修改说明:
- 无限循环实现:用
while True作为循环主体,只有当用户输入q时才用break退出,同时把输入语句放到循环内部,保证每次循环都能重新获取用户输入。 - 修复原代码致命bug:你原代码中把
Move2列表重新赋值为单个字符(Move2=random.choice(Move2)),导致第二次循环时random.choice会报错,现在改用computer_move变量存储电脑的出拳,保留原列表VALID_MOVES。 - 简化胜负判断:用字典
WIN_CONDITIONS直接映射玩家获胜的情况,替代原代码中冗长的if-elif嵌套,逻辑更清晰,也更容易维护。 - 修正条件判断逻辑:原代码
if Move1 == "r" or "p" or "s" or "q"的写法是错误的(它等价于if (Move1 == "r") or True or True or True,永远为真),现在改用user_move in VALID_MOVES来判断合法输入。 - 移除多余break:原代码的每个胜负分支都有
break,导致一次游戏就结束,现在去掉这些break,让循环持续运行直到用户主动退出。
内容的提问来源于stack exchange,提问作者ThaSpoda
相关产品推荐
相关产品推荐

