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

Python石头剪刀布游戏:平局时重新调用random.choice的实现方法

石头剪刀布蜥蜴史波克游戏平局逻辑修正方案

问题描述

我在Python课程第二单元的期末项目中制作了一款包含石头(rock)、布(paper)、剪刀(scissors)、蜥蜴(lizard)、史波克(spock)的扩展版石头剪刀布游戏,为获取额外学分,我用函数增加了游戏复杂度。目前遇到的问题是:当触发平局条件时,我希望代码回到询问是否继续游戏的环节,并重新调用random.choice获取新的随机选项,请问该如何实现?

原代码

import random
import time

rps = random.choice(['rock', 'paper', 'scissors', 'lizard', 'spock'])
def win_cond():
    print('i choose...')
    time.sleep(0.9)
    print(rps)
    time.sleep(1)
    print('I WIN!!!')
    time.sleep(2)
    print('nerd!')
    play()


def lose_cond():
    print('i choose....')
    time.sleep(0.9)
    print(rps)
    time.sleep(1)
    print('GAH!!! I LOSE!!!')
    play()

def play():
    play = input('you wanna play!? yes or no / y or n: ')
    if (play == 'yes' or 'y'):
        game()
    else:
        print('okay lol')


def game():
    rpsU = input('welcome to the game ong!! choose rock, paper, scissors, lizard, or spock! ').lower()
    rps = random.choice(['rock', 'paper', 'scissors', 'lizard', 'spock'])
    print(rps)
        
    if (rpsU == 'rock' and (rps == 'paper' or rps == 'spock')):
        win_cond()
    elif (rpsU == 'rock' and 'rps' == 'rock'):
        print('tie,,')
        play()
    elif (rpsU == 'rock' and (rps == 'paper' or rps == 'spock')):
        lose_cond()
    
    
    if (rpsU == 'spock' and (rps == 'lizard' or rps == 'paper')):
        win_cond()
    elif (rpsU == 'spock' and rps == 'spock'):
        print('tie,,')
        play()
    elif (rpsU == 'spock' and (rps == 'scissors' or 'rock')):
        lose_cond()
    
    if (rpsU == 'scissors' and (rps == 'spock' or 'rock')):
        win_cond()
    elif (rpsU == 'scissors' and rps == 'scissors'):
        print('tie,,')
        play()
    elif (rpsU == 'scissors' and (rps == 'paper' or 'lizard')):
        lose_cond()
    
    if (rpsU == 'paper' and (rps == 'lizard' or 'scissors')):
        win_cond()
    elif (rpsU == 'paper' and rps == 'paper'):
        print('tie,,')
        play()
    elif(rpsU == 'paper' and (rps == 'spock' or 'rock')):
        lose_cond()

    if (rpsU == 'lizard' and (rps == 'rock' or 'scissors')):
        win_cond()
    elif (rpsU == 'lizard' and rps == 'lizard'):
        print('tie,,')
        play()
    elif (rpsU == 'lizard' and (rps == 'spock' or 'paper')):
        lose_cond()

    if (rpsU != 'rock' and rpsU != 'paper' and rpsU != 'scissors' and rpsU != 'lizard' and rpsU != 'spock'):
        print('what the freakazoids!?')
        
        
play()

问题分析与修正方案

原代码存在几个关键问题导致平局逻辑异常:

  1. 全局变量rps与game()内的局部变量rps冲突,导致胜负判断时打印的是旧的随机值。
  2. 平局判断存在语法错误(比如'rps' == 'rock'是字符串比较,而非变量比较)。
  3. 胜负条件重复定义,逻辑混乱。
  4. play()中的条件判断逻辑错误,会导致无论输入什么都会进入游戏。

以下是修正后的代码,完全满足平局后回到询问环节、重新生成随机选项的需求:

import random
import time

# 把AI选择作为参数传入,避免全局变量冲突
def win_cond(ai_choice):
    print('i choose...')
    time.sleep(0.9)
    print(ai_choice)
    time.sleep(1)
    print('I WIN!!!')
    time.sleep(2)
    print('nerd!')
    play()


def lose_cond(ai_choice):
    print('i choose....')
    time.sleep(0.9)
    print(ai_choice)
    time.sleep(1)
    print('GAH!!! I LOSE!!!')
    play()

def play():
    # 修复条件判断逻辑,确保只有输入yes/y才进入游戏
    play_input = input('you wanna play!? yes or no / y or n: ').lower()
    if play_input in ['yes', 'y']:
        game()
    else:
        print('okay lol')


def game():
    valid_choices = ['rock', 'paper', 'scissors', 'lizard', 'spock']
    rpsU = input('welcome to the game ong!! choose rock, paper, scissors, lizard, or spock! ').lower()
    
    # 先检查输入是否合法,非法输入直接回到询问环节
    if rpsU not in valid_choices:
        print('what the freakazoids!?')
        play()
        return
    
    # 每次游戏重新生成AI的随机选择
    ai_choice = random.choice(valid_choices)
    print(ai_choice)
    
    # 用字典定义胜负规则,简化冗余判断
    win_rules = {
        'rock': ['scissors', 'lizard'],
        'paper': ['rock', 'spock'],
        'scissors': ['paper', 'lizard'],
        'lizard': ['paper', 'spock'],
        'spock': ['rock', 'scissors']
    }
    
    if rpsU == ai_choice:
        print('tie,,')
        play()
    elif ai_choice in win_rules[rpsU]:
        lose_cond(ai_choice)
    else:
        win_cond(ai_choice)


play()

关键修改说明

  • 移除全局rps变量,将AI的选择作为参数传递给胜负函数,确保打印的是当前游戏的随机选项。
  • 修复play()中的条件判断错误,改为检查输入是否在合法列表中。
  • 使用字典统一管理胜负规则,大幅简化冗余的条件判断代码,后续修改规则更方便。
  • 平局后调用play(),下次进入game()时会重新执行random.choice生成新的随机选项,完全符合需求。
  • 提前检查用户输入合法性,非法输入后直接回到游戏询问环节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:05:45