我目前在我的代码中使用一个名为 correct
的全局变量。考虑到全局变量不受欢迎,是否有更好的方法来设置我的代码以“保护”全局变量?
from random import randint
from random import choice
lower = int(raw_input("Enter a lower integer constraint: "))
higher = int(raw_input("Enter a higher integer constraint: "))
correct = 0
def gen_randoms(lower, higher):
integers = list()
for x in xrange(4):
rand_int = randint(lower, higher)
integers.append(rand_int)
return integers
def gen_equation(integers):
nums = map(str, integers)
operators = ['*', '+', '-']
equation = 'num op num op num op num'
while 'op' in equation:
equation = equation.replace('op', choice(operators), 1)
while 'num' in equation:
equation = equation.replace('num', choice(nums), 1)
print equation
return equation
def evaluate(equation):
answer = eval(equation)
print answer
return answer
def compare_answers(gen_answer, game):
global correct
user_answer = int(raw_input("What is the answer? "))
if user_answer == gen_answer:
correct += 1
print 'Correct!'
print 'Current streak: %s' % str(correct)
game()
else:
print 'Incorrect!'
correct = 0
game()
def game():
nums = gen_randoms(lower, higher)
this_equation = gen_equation(nums)
gen_answer = evaluate(this_equation)
compare_answers(gen_answer, game)
game()
最佳答案
我可能会这样做:
#!/usr/bin/python
"""Equation solving game."""
from random import randint
from random import choice
def gen_randoms(lower, higher):
"""Generates four random numbers between provided bounds."""
integers = [randint(lower, higher) for x in range(4)]
return integers
def gen_equation(integers):
"""Generates a random equation from four provided integers."""
nums = [str(i) for i in integers]
operators = ['*', '+', '-']
equation = 'num op num op num op num'
while 'op' in equation:
equation = equation.replace('op', choice(operators), 1)
while 'num' in equation:
equation = equation.replace('num', choice(nums), 1)
return equation
def evaluate(equation):
"""Evaluates an equation."""
return eval(equation)
def main():
"""Main game function."""
lower = int(raw_input("Enter a lower integer constraint: "))
higher = int(raw_input("Enter a higher integer constraint: "))
nums = gen_randoms(lower, higher)
streak = 0
while True:
this_equation = gen_equation(nums)
print this_equation
user_answer = raw_input("What is the answer? ('Q' to quit) ")
if user_answer.lower()[0] == 'q':
break
gen_answer = evaluate(this_equation)
print 'The answer was: %d' % gen_answer
if gen_answer == int(user_answer):
streak += 1
print 'Correct!'
print 'Current streak: %d' % streak
else:
streak = 0
print 'Incorrect!'
if __name__ == "__main__":
main()
一些评论:
- 每个函数通常应该只做一件事,所以如果一个函数计算一个方程,通常最好不要让它也打印方程。
- 执行此操作时,弄清楚变量应该去哪里会变得容易得多,因为您不需要像每个函数做几件不同的事情时那样频繁地传递它们。
- 此处的主要游戏逻辑非常简单,您实际上不需要将其从主
game()
函数(或main()
函数,在我的例子中)这么多,把它留在那儿并没有使事情过于复杂。如果您想做更多的错误检查(例如,查看用户是否输入了无效数字,如果是,您想要返回并要求更多输入),那么您可能想要进一步分解。
关于Python:重构代码以删除全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18432293/