You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python剪刀石头布游戏随机多结果输出问题求助

问题根源分析

你的问题出在机器人的选择没有固定下来——每次判断胜负的条件里,你都调用了random.choice(RPS),这意味着每一次if判断都会让机器人重新随机选一次选项。比如:

  • 第一次判断平局时,机器人选了和你一样的选项,触发平局输出;
  • 紧接着判断你赢的条件时,机器人又随机选了另一个符合你赢的选项,又触发一次赢的输出;
  • 极端情况下甚至可能再触发输的条件,导致一次对局同时出现多个矛盾结果。

另外还有两个小细节问题:

  • import timeimport random放在while True循环里,虽然Python会缓存模块,但每次循环都导入完全没必要,应该移到代码最顶部;
  • 部分单词拼写错误,比如loose应该是losesmotherd应该是smothered
修正后的代码
import time
import random

while True: 
    print('Scissors ') 
    time.sleep(1) 
    print(' paper') 
    time.sleep(1) 
    print(' rock!') 
    choice = input().strip().lower()  # 支持大小写/前后空格的输入容错
    
    if choice not in ('rock', 'paper', 'scissors'): 
        print('Invalid Input')
        # 输入无效时直接进入下一轮,避免后续无效判断
        continue
    
    # 只生成一次机器人的选择,固定本次对局的结果基准
    bot_choice = random.choice(['rock', 'paper', 'scissors'])
    
    # 结果文本可以放在循环外,避免每次重复创建列表(也可保留在循环内,不影响功能)
    TIE = [f'The bot also chose {choice}', 'It is a tie!', 'TIE!'] 
    RWIN = ['The bot chose scissors, but you smashed them with your rock!', 'YOU WIN!', 'Your rock beat the bots scissors'] 
    PWIN = ['The bot chose rock, but you smothered it with your paper', 'YOU WIN!', 'Your paper beat the bots rock'] 
    SWIN = ['The bot chose paper but you cut it to bits!', 'YOU WIN!', 'Your scissors beat the bots paper!'] 
    RLOSS = ['The bot chose paper and smothered your rock :(', 'You lose...', 'Nice try but you lost...better luck next time'] 
    PLOSS = ['The bot chose scissors and chopped your paper to bits :(', 'You lose...', 'Nice try but you lost...better luck next time'] 
    SLOSS = ['The bot chose rock and smashed your scissors :(', 'You lose...', 'Nice try but you lost...better luck next time'] 
    
    # 用if-elif-else结构,确保一次对局只会触发一个结果分支
    if choice == bot_choice:
        print(random.choice(TIE))
    elif (choice == 'rock' and bot_choice == 'scissors') or \
         (choice == 'paper' and bot_choice == 'rock') or \
         (choice == 'scissors' and bot_choice == 'paper'):
        # 根据用户选择匹配对应的胜利文本
        if choice == 'rock':
            print(random.choice(RWIN))
        elif choice == 'paper':
            print(random.choice(PWIN))
        else:
            print(random.choice(SWIN))
    else:
        # 剩下的情况必然是用户输了,匹配对应失败文本
        if choice == 'rock':
            print(random.choice(RLOSS))
        elif choice == 'paper':
            print(random.choice(PLOSS))
        else:
            print(random.choice(SLOSS))
    
    while True: 
        time.sleep(1) 
        print(' ') 
        print('Again? (y/n) ') 
        answer = input().strip().lower() 
        if answer in ('y', 'n'): 
            break 
        print('Invalid input') 
    if answer == 'y': 
        continue 
    else: 
        print('Goodbye') 
        break
关键改进点
  1. 固定机器人选择:把bot_choice = random.choice(RPS)放在所有判断之前,确保一次对局中机器人的选择不会反复变化;
  2. 优化输入处理:增加.strip().lower(),让输入支持大小写和前后空格(比如用户输入" Rock "也能正常识别);
  3. 使用if-elif-else结构:确保每次只会触发一个结果分支,彻底避免多个条件同时满足的情况;
  4. 规范模块导入:把import移到代码顶部,符合Python编码规范;
  5. 修复拼写错误:修正了loosesmotherd的拼写问题;
  6. 输入无效处理:输入错误时直接进入下一轮循环,避免执行后续无效的胜负判断逻辑。

内容的提问来源于stack exchange,提问作者Joel Cameron

火山引擎 最新活动