5

我目前在我的代码中使用一个名为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()
4

6 回答 6

3

我可能会这样做:

#!/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()在我的示例中为功能)中分离出来,将它留在那里并不会使事情变得过于复杂。如果您想进行更多的错误检查(例如,查看用户是否输入了无效的数字,如果是,则您想返回并要求更多输入),那么您可能需要将其分解。
于 2013-08-25T19:59:07.697 回答
1

像这样的东西:

def game(correct=0):    
    nums = gen_randoms(lower, higher)  
    this_equation = gen_equation(nums)  
    gen_answer = evaluate(this_equation)  
    correct = compare_answers(gen_answer, game, correct)  
    game(correct)  
于 2013-08-25T18:39:10.680 回答
0
  1. global correct从_compare_answers
  2. 设置为接受具有默认值game的关键字参数。correct0def game(correct =0)
  3. 设置compare_answers为第三个参数correct
  4. gamecompare_answers传入呼叫时correct

IE:

def compare_answers(gen_answer, game, 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(correct)
    else:
        print 'Incorrect!'
        correct = 0
        game(correct)


def game(correct = 0):
    nums = gen_randoms(lower, higher)
    this_equation = gen_equation(nums)
    gen_answer = evaluate(this_equation)
    compare_answers(gen_answer, game, correct)


game()
于 2013-08-25T19:14:19.440 回答
0

添加这个:

def game():
    correct = 0
    while True:
        nums = gen_randoms(lower, higher)
        this_equation = gen_equation(nums)
        gen_answer = evaluate(this_equation)
        user_answer = int(raw_input("What is the answer? "))
        if user_answer == gen_answer:
            correct += 1
            print 'Correct!'
            print 'Current streak: %s' % str(correct)
        else:
            print 'Incorrect!'
            correct = 0

然后删除这些旧代码:game()compare_answers()和全局变量correct

于 2013-08-25T19:01:56.937 回答
0

我最终接受了@JoelCornett 的建议并创建了一个课程:

from random import randint
from random import choice

class Math_Problem_Generator(object):

    def __init__(self):
        self.lower = int(raw_input("Enter a lower integer constraint: "))
        self.higher = int(raw_input("Enter a higher integer constraint: "))
        self.correct = 0
        self.game(self.correct)


    def gen_randoms(self, lower, higher):
        integers = list()
        for x in xrange(4):
            rand_int = randint(lower, higher)
            integers.append(rand_int)
        return integers


    def gen_equation(self, 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(self, equation):
        answer = eval(equation)
        print answer
        return answer


    def compare_answers(self, gen_answer):
        user_answer = int(raw_input("What is the answer? "))
        if user_answer == gen_answer:
            self.correct += 1
            print 'Correct!'
            print 'Current streak: %s' % str(self.correct)
            self.game(self.correct)
        else:
            print 'Incorrect!'
            self.correct = 0
            self.game(self.correct)


    def game(self, correct):
        nums = self.gen_randoms(self.lower, self.higher)
        this_equation = self.gen_equation(nums)
        gen_answer = self.evaluate(this_equation)
        self.compare_answers(gen_answer)
        self.game()


Math_Problem_Generator()
于 2013-08-25T19:25:07.033 回答
0

在调用者中收集结果,然后打印计数。这个版本摆脱了你的其他全局变量,lower并且higher.

def compare_answers(gen_answer):
    user_answer = int(raw_input("What is the answer? "))
    return user_anser == gen_answer

def game():

    correct = 0
    play_again = 'Y'

    while play_again.lower() == 'y':
        lower  = int(raw_input("Enter a lower integer constraint: "))
        higher = int(raw_input("Enter a higher integer constraint: "))
        nums = gen_randoms(lower, higher)
        this_equation = gen_equation(nums)
        gen_answer = evaluate(this_equation)
        if compare_answers(gen_answer):
           correct += 1
           print('You were right! Your winning streak is {0}'.format(correct))
        else:
           print('Sorry, your answer was wrong. :(')
           correct = 0

        play_again = raw_input('Would you like to play again? (Y/N): ')
于 2013-08-25T20:15:32.207 回答