如何在石头剪刀布游戏中剔除无效回合?代码优化求助
解决石头剪刀布游戏无效输入消耗对局次数的问题
问题说明
你的石头剪刀布游戏设置了5次对局循环,但玩家输入s/r/p以外的内容时,该回合仍会被计入5次的计数中,导致实际有效对局不足5次。另外原代码在输入无效时还会触发KeyError(因为game_choices[player]找不到对应键)。
解决方案
核心逻辑是只有玩家输入有效内容时,才推进对局并执行游戏流程,无效输入时重新获取输入,不消耗对局次数。以下是修改后的完整代码:
from random import randint game_choices = { 'r': "rock", 'p': "paper", 's': 'scissor' } def play_round(): """执行单回合游戏,返回双方得分变化""" player_score_change = 0 pc_score_change = 0 # 循环获取输入直到有效 while True: player = input('请输入你的选择:s(剪刀), r(石头), p(布):').lower() if player in game_choices: break print('输入无效,请重新输入!') print(f'你的选择是 {game_choices[player]}') pc = ['s', 'r', 'p'][randint(0, 2)] print(f'电脑的选择是 {game_choices[pc]}') # 判断胜负 if player == pc: print('_-_-_-_') print('平局') # 电脑获胜的三种情况 elif (player == 's' and pc == 'r') or (player == 'r' and pc == 'p') or (player == 'p' and pc == 's'): print('_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_') print('电脑获胜!得分加给电脑!') pc_score_change = 1 else: print('_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_') print('你获胜!得分加给你!') player_score_change = 1 return player_score_change, pc_score_change # 外层循环控制是否重新玩游戏 while True: player_score = 0 pc_score = 0 # 执行5次有效对局 for _ in range(5): p_change, pc_change = play_round() player_score += p_change pc_score += pc_change # 显示当前比分 print('---------------------------------------') print(f'你的总分: {player_score}') print('....................') print(f'电脑总分: {pc_score}') print('---------------------------------------') # 显示最终结果 if player_score == pc_score: print("无人获胜,平局") elif player_score > pc_score: print("恭喜!你是最终赢家") else: print("电脑是最终赢家") # 确认是否继续游戏 while True: play_again = input('是否再玩一局?(y/n):').lower() if play_again in ['y', 'n']: break print('输入无效,请输入y或n') if play_again != 'y': break
关键修改点
- 单回合逻辑封装成函数,代码更简洁易维护
- 用内层
while循环获取输入,确保只有有效输入才进入游戏环节,不会浪费对局次数 - 修复了无效输入导致的
KeyError问题 - 优化胜负判断逻辑,减少嵌套层级
- 修复原代码中“再玩一局”功能无效的问题(原代码
pass不会重启游戏)
内容的提问来源于stack exchange,提问作者z.m
相关产品推荐
相关产品推荐

