Python石头剪刀布游戏

2023-12-15

我正在使用Python,我正在尝试编写一个简单的程序来模拟石头、剪刀、布游戏。一切正常,除了当我收到此错误时输入无效响应(石头、布或剪刀以外的其他内容)时。

Traceback (most recent call last):
File "C:/Users/home/Desktop/BAGARDNER/Python/rock_pape_scissors.py", line 88, in <module>
main()
File "C:/Users/home/Desktop/BAGARDNER/Python/rock_pape_scissors.py", line 14, in main
number = user_guess()
File "C:/Users/home/Desktop/BAGARDNER/Python/rock_pape_scissors.py", line 48, in user_guess
return number
UnboundLocalError: local variable 'number' referenced before assignment

我知道这告诉我没有引用数字,但根据我对代码的理解,当限定符为 false 时,它​​不应该需要数字。

#import random module
import random
#main function
def main():
    #intro message
    print("Let's play 'Rock, Paper, Scissors'!")
    #call the user's guess function
    number = user_guess()
    #call the computer's number function
    num = computer_number()
    #call the results function
    results(num, number)

#computer_number function
def computer_number():
    #get a random number in the range of 1 through 3
    num = random.randrange(1,4)
    #if/elif statement
    if num == 1:
        print("Computer chooses rock")
    elif num == 2:
        print("Computer chooses paper")
    elif num == 3:
        print("Computer chooses scissors")
    #return the number
    return num

#user_guess function
def user_guess():
    #get the user's guess
    guess = input("Choose 'rock', 'paper', or 'scissors' by typing that word. ")
    #while guess == 'paper' or guess == 'rock' or guess == 'scissors':
    if is_valid_guess(guess):
        #if/elif statement
        #assign 1 to rock
        if guess == 'rock':
            number = 1
        #assign 2 to paper
        elif guess == 'paper':
            number = 2
        #assign 3 to scissors
        elif guess == 'scissors':
            number = 3
        return number
    else:
        print('That response is invalid.')
        user_guess()

def is_valid_guess(guess):
    if guess == 'rock' or 'paper' or 'scissors':
        status = True
    else:
        status = False
    return status

def restart():
    answer = input("Would you like to play again? Enter 'y' for yes or \
    'n' for no: ")
    #if/elif statement
    if answer == 'y':
        main()
    elif answer == 'n':
        print("Goodbye!")
    else:
        print("Please enter only 'y' or 'n'!")
        #call restart
        restart()

#results function
def results(num, number):
    #find the difference in the two numbers
    difference = num - number
    #if/elif statement
    if difference == 0:
        print("TIE!")
        #call restart
        restart()
    elif difference % 3 == 1:
        print("I'm sorry! You lost :(")
        #call restart
        restart()
    elif difference % 3 == 2:
        print("Congratulations! You won :)")
        #call restart
        restart()

main()

感谢您的帮助!


这是你的问题:

if guess == 'rock' or 'paper' or 'scissors':

这条线在is_valid_guess并没有按照你的想法去做。相反,它总是返回True。你正在寻找的是这样的:

if guess == 'rock' or guess == 'paper' or guess == 'scissors':

或者更简洁地说:

if guess in ('rock', 'paper', 'scissors'):

问题是你总是会得到回报True因为 Python 如何在布尔上下文中计算字符串。线路if guess == 'rock' or 'paper' or 'scissors':评估为:

if (guess == 'rock') or ('paper') or ('scissors'):

这意味着 Python 检查是否guess == 'rock'。如果这是真的,则条件评估为True。如果为假,解释器会尝试评估bool('paper')。这总是评估为True因为所有非空字符串都是“true”。因此,你的整个条件总是True,并且每个字符串都是“有效的”。

因此,您的代码将所有字符串视为“有效”,然后在无法为实际不支持的猜测分配数字时崩溃。


最后一点,您的is_valid_guess方法可以稍微修剪一下,因为您只是返回布尔表达式的结果。而不是使用status变量作为中间体,您可以计算表达式并立即返回它。我也用lower()字符串对象的方法,以允许不区分大小写的猜测,以防万一您想要允许这样做。

def is_valid_guess(guess):
    return guess.lower() in ('rock', 'paper', 'scissors')

您还有另一个问题,您在评论中提到:您已经实施了user_guess以递归方式,以便在用户输入无效猜测时调用自身。但是,在这种情况下,它不会返回递归调用的结果。您需要通过更改最后一行来返回递归结果user_guess to:

return user_guess()

否则,您应该使该函数使用循环而不是递归,这就是我要做的,因为该函数本质上不是递归的。你可以这样做:

def user_guess():
    # get first guess
    guess = input("Choose 'rock', 'paper', or 'scissors' by typing that word. ")

    # If that guess is invalid, loop until we get a valid guess.
    while not is_valid_guess(guess):
        print('That response is invalid.')
        guess = input("Choose 'rock', 'paper', or 'scissors' by typing that word. ")

    # Now assign the (valid!) guess a number
    # This dictionary is just shorthand for your if/elif chain.
    guess_table = {
        'rock' : 1,
        'paper' : 2,
        'scissors' : 3
    }

    # Return the number associated with the guess.
    return guess_table[guess.lower()]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python石头剪刀布游戏 的相关文章

随机推荐

  • 从 STL 文件渲染 2D 图像

    我想加载 STL 文件并生成一组不同旋转的 2D 图像 我了解了使用 numpy stl 的基础知识this例如 最终得到这个代码 from stl import mesh from mpl toolkits import mplot3d
  • 如何在保持透明度的情况下旋转GD图像库中的图像?

    我正在为我的网站制作一个皮肤预览器 我需要旋转图像的某些部分来创建该图像的表示形式以供用户查看 皮肤是一个PNG文件 它的所有部分可能都是透明的 甚至根本没有 我需要能够旋转该图像 同时保持图像内部的任何透明度透明 同时还使扩展边框 您知道
  • 当我单击表单中的按钮时提交表单。如何避免这种情况?

    我使用 twitter bootstrap 并且我想使用这些单选按钮以我的形式 问题是当我单击这些按钮中的任何一个时 表单都会立即提交 如何避免这种情况 我只想使用默认按钮 例如单选按钮 from div class control gro
  • 检查返回代码(或其他代码)以确保 MSI 已正确安装

    我正在使用 NSIS 安装一些 MSI 我在用着ExecWait msiexec passive liare SETUP LOG FILE i TEMP MyMsi msi 当 MSI 与已安装的应用程序版本相同时 安装会失败 已安装此产品
  • 删除 Django Rest Framework 响应中的标头

    我正在尝试删除Server来自 django Rest Framework 响应的标头 但我没有找到简单的方法 所以我创建了一个中间件来删除它 这是我的第一次尝试 中间件 py class RemoveHeaders object def
  • Vue.js 3 - 尝试构建一个具有 2 种布局的系统

    我是 vue js 初学者 3 我尝试构建一个具有两种布局的系统 1 对于已连接的用户 1 表示未连接的用户 在我的 router index js 中 我为每个路由添加一个元 const routes path name Home met
  • webview_flutter:未捕获(承诺中)NotAllowedError:写入权限被拒绝

    预期行为 使用复制文本Copy to clipboard从网站 行为 它会抛出以下错误 并且文本不会复制到 android 剪贴板 包 webview flutter I chromium 12065 INFO CONSOLE 0 Unca
  • Excel VBA - 退出for循环

    我想退出我的for当满足内部条件时循环 我怎样才能退出我的for循环时if条件已满足 我认为在我的人生结束时会有某种出口if声明 但不知道这将如何运作 Dim i As Long For i 1 To 50 Range B i Select
  • 使用 dataTable.js Bootstrap 表排序、过滤、分页

    我正在开发 asp net MVC 5 并创建了一个 Bootstrap 表来显示数据 现在我想应用分页 过滤和排序 为此我搜索了五篇文章并找到了这个链接 此链接中的技术非常简单 与我在项目中所做的相同 下面我已经包括了我的 js and
  • C 如何计算 sin() 和其他数学函数?

    我一直在研究 NET 反汇编和 GCC 源代码 但似乎找不到任何实际实现sin 和其他数学函数 它们似乎总是引用其他东西 谁能帮我找到他们吗 我觉得不太可能所有运行C的硬件都支持硬件中的三角函数 所以必须有一个软件算法某处 正确的 我知道有
  • “尽早失败”这句话是什么意思?您想什么时候这样做?

    尽早失败 这个表达是什么意思 在什么情况下这种方法最有用 什么时候你会避免这种方法 本质上 快速失败 又名早早失败 是对您的软件进行编码 以便 当出现问题时 软件会失败立刻 and 明显地如可能的 而不是试图在可能不稳定的状态下继续进行 快
  • 在Python中,如何将数字和字符串转换为字节数组?

    我想将一组配置选项编码为一长串十六进制数字 输入是数字 整数和浮点数 和字符串的混合 我可以用binascii a2b hex从字符串的标准库 整数的按位运算符 如果我去阅读一些关于浮点表示的内容 叹气 我可能也可以处理浮点数 现在 我的问
  • iOS Sprite Kit 碰撞与元素移动

    是否可以使用 Sprite 套件的物理主体进行元素碰撞并仍然允许元素相互穿过 我感兴趣的是仅当两个边界相互碰撞时才调用委托 然后允许它们相互穿过 是的 这是可能的 您可以注册对象之间碰撞的回调 但不会让碰撞影响对象本身 Raywenderl
  • 右键单击 Silverlight 4 应用程序中的列表框

    我正在尝试在 Winforms 应用程序中实现我以前认为理所当然的功能 我是一名 Silverlight 菜鸟 所以希望这一切都是基础知识 我在 Silverlight 4 应用程序中有一个列表框 我想做以下事情 右键单击列表框 让该项目位
  • 为什么 Promise 是 Monad?

    我一直在学习函数式编程 并且接触过 Monad Functor 和 Applicatives 根据我的理解 以下定义适用 a A gt B gt C A gt C B 函子 b A gt C B gt C A gt C B 单子 c C A
  • JQuery关键字“this”没有获取属性值

    我正在使用 JQuery 关键字 this 我遇到了一些我不明白的事情 这是我的代码 a jQuery com a
  • 如何使用 createBottomTabNavigator 对 React Navigation 过渡进行动画处理?

    我花了最后一天的时间试图找出如何使用反应导航实现简单的淡入淡出屏幕转换 但我找不到一种方法让它与底部选项卡导航器一起使用 有人可以帮我吗 我已经广泛阅读了文档 但动画似乎只能通过堆栈导航器使用 你能在这个小吃演示中进行过渡吗 只需创建一个A
  • Python 2.7 和 PyDev - matplotlib 和 NumPy 不起作用

    我正在尝试使用 Python 2 7 和 Eclipse 以及 PyDev 插件让 matplotlib 在 Windows 7 64 位 下工作 我安装了 NumPyhttp www lfd uci edu gohlke pythonli
  • 访问本地类中的隐藏变量

    我是 Java 新手 我对下面的示例感到困惑 public class Test int testOne member method int x 5 class inTest local class in member method voi
  • Python石头剪刀布游戏

    我正在使用Python 我正在尝试编写一个简单的程序来模拟石头 剪刀 布游戏 一切正常 除了当我收到此错误时输入无效响应 石头 布或剪刀以外的其他内容 时 Traceback most recent call last File C Use