基于Python文本的游戏:使用While循环和Try-Except的猜谜游戏

基于Python文本的游戏:使用While循环和Try-Except的猜谜游戏,python,python-2.7,while-loop,try-except,Python,Python 2.7,While Loop,Try Except,我正在编写一个简单的基于文本的游戏,以增强我对Python的了解。在游戏的一个阶段,用户需要猜测集合[1,5]中的一个数字,才能实现自己的愿望。他们只试了三次。我有两个问题: 1) 让我们假设genie_number被随机选择为3。用户每次猜测后,该值是否会改变?我不希望程序在每次猜测后随机选择另一个整数。它应该保持不变,以便用户有3/5的机会猜对它 2) 我想惩罚那些不只是猜测整数的用户,我已经在除了ValueError一节中这样做了。但是,如果用户连续进行三次非整数猜测并用尽所有尝试,我希望

我正在编写一个简单的基于文本的游戏,以增强我对Python的了解。在游戏的一个阶段,用户需要猜测集合[1,5]中的一个数字,才能实现自己的愿望。他们只试了三次。我有两个问题:

1) 让我们假设
genie_number
被随机选择为3。用户每次猜测后,该值是否会改变?我不希望程序在每次猜测后随机选择另一个整数。它应该保持不变,以便用户有3/5的机会猜对它

2) 我想惩罚那些不只是猜测整数的用户,我已经在
除了ValueError
一节中这样做了。但是,如果用户连续进行三次非整数猜测并用尽所有尝试,我希望循环重新指向
else:dead(“精灵将你变成青蛙”)
。现在它给了我下面的错误消息。我该如何解决这个问题

“在我实现你的第一个愿望之前,”精灵说,“你必须回答这个问题。” “我想到的是集合[1,5]中包含的离散整数。尤哈 (这不是什么谜,但你最好照他说的去做。) 你猜怎么着?>什么 这不是一个选择。剩余次数:2次 你猜怎么着?>什么 这不是一个选择。剩余人数:1 你猜怎么着?>什么 这不是一个选择。剩余尝试次数:0 回溯(最近一次呼叫最后一次): 文件“ex36.py”,第76行,在 开始() 文件“ex36.py”,第68行,在开始处 灯() 文件“ex36.py”,第48行,在lamp中 摩擦() 文件“ex36.py”,第38行,在rub中 祝你一路顺风 文件“ex36.py”,第30行,在wish_1_riddle中 如果guess==精灵号: UnboundLocalError:赋值前引用的局部变量“guess” 以下是我目前的代码:

def wish_1_ridle():
打印“\n‘在我实现你的第一个愿望之前,’精灵说,‘你必须回答这个谜语!’
print“'我正在考虑集合[1,5]中包含的离散整数。您有三次尝试。”
“打印”(这不是什么谜语,但你最好照他说的去做。)
精灵号=randint(1,5)
尝试=0
尝试剩余=3
而<3时:
尝试:
guess=int(原始输入(“您的猜测是什么?>”)
尝试次数+=1
尝试u剩余-=1
如果guess==精灵号:
打印“正确!”
祝你好运
其他:
打印“不正确!剩余尝试次数:%d”%t剩余尝试次数
持续
除值错误外:
尝试次数+=1
尝试u剩余-=1
打印“这不是一个选项。精灵会惩罚你一次尝试。小心!”
打印“剩余尝试次数:%d”%t剩余尝试次数
如果guess==精灵号:
祝你好运
其他:
死亡(“妖怪把你变成青蛙。”)

回答您的第一个问题,否。如果您继续呼叫
randint(1,5)
,是的,它会改变,但一旦您分配它,值是固定的:

>>> import random
>>> x = random.randint(1, 10)
>>> x
8
>>> x
8
>>> x
8
>>> random.randint(1, 10)
4
>>> random.randint(1, 10)
8
>>> random.randint(1, 10)
10
如您所见,一旦我们将随机数分配给
x
x
始终保持不变。但是,如果我们继续调用
randint()
,它就会改变

回答第二个问题时,您不应该在
int(raw_input())
后面的
trys中添加1,如果该值是整数,它也会在trys中添加1。相反,尝试将您的代码合并到以下内容中:

>>> tries = 0
>>> while tries < 3:
...     try:
...             x = raw_input('Hello: ')
...             x = int(x)
...     except ValueError:
...             tries+=1
... 
Hello: hello
Hello: 1
Hello: 4
Hello: bye
Hello: cool
>>> 
但是,如果输入正确,
guess
将成为:

>>> tries = 0
>>> while tries < 3:
...     try:
...             guess = int(raw_input('Enter input: '))
...             print guess
...     except ValueError:
...             tries+=1
... 
Enter input: 4
4
Enter input: hello
Enter input: 9
9
Enter input: bye
Enter input: 6
6
Enter input: greetings
>>> guess
6
>>> 
如您所见,它是一个错误…)由于该错误,
x
永远不会被赋值,除非我们实际提供整数输入,因为该代码永远不会到达
打印x
,因为它因错误而中断:

>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> for k in range(1, 3):
...     try:
...             x = int(raw_input('Hello: '))
...             print x
...     except ValueError:
...             pass
... 
Hello: hello
Hello: 8
8
>>> x
8
>>> 
>x
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
名称错误:未定义名称“x”
>>>对于范围(1,3)内的k:
...     尝试:
...             x=int(原始输入('Hello:'))
...             打印x
...     除值错误外:
...             通过
... 
你好:你好
你好:8
8.
>>>x
8.
>>> 

当我们输入一个整数时,
x
有效。

您的答案确实正确。当我运行程序时,我误读了一条错误消息,得出了错误的结论。
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> for k in range(1):
...     x = 1
...     print x
... 
1
>>> x
1
>>> 
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> for k in range(1, 3):
...     try:
...             x = int(raw_input('Hello: '))
...             print x 
...     except ValueError:
...             pass
... 
Hello: hello
Hello: bye
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> 
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> for k in range(1, 3):
...     try:
...             x = int(raw_input('Hello: '))
...             print x
...     except ValueError:
...             pass
... 
Hello: hello
Hello: 8
8
>>> x
8
>>>