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()
问题分析与修正方案
原代码存在几个关键问题导致平局逻辑异常:
- 全局变量
rps与game()内的局部变量rps冲突,导致胜负判断时打印的是旧的随机值。 - 平局判断存在语法错误(比如
'rps' == 'rock'是字符串比较,而非变量比较)。 - 胜负条件重复定义,逻辑混乱。
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
相关产品推荐
相关产品推荐

