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

如何在石头剪刀布游戏中剔除无效回合?代码优化求助

解决石头剪刀布游戏无效输入消耗对局次数的问题

问题说明

你的石头剪刀布游戏设置了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:53:14