首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >十道题数学游戏

十道题数学游戏
EN

Code Review用户
提问于 2015-12-12 15:50:24
回答 2查看 170关注 0票数 0

就像我之前提出的关于我的心理数学游戏的问题一样,我已经为一个十道题的数学游戏写了一个脚本,而且似乎还有一个更简单的方法,有人能把我从黑暗中解救出来吗?

代码语言:javascript
复制
def tenquestions():
    mode=input("(E)asy, (M)edium, (H)ard")
    questions=0
    rightqs=0
    while questions != 10:
        if operations == "A":
            if mode == "E":
                num1 = randint(5,1000)
                num2 = randint(5,1000)
                answer = num1+num2
                answer=int(answer)
                useranswer=int(input(str(num1) + "+"+ str(num2)+"="))
                if useranswer == answer:
                    print("Correct!")
                    rightqs=rightqs+1
                else:
                    print("Wrong, the answer was ", answer)
                questions=questions+1
            elif mode == "M":
                num1 = randint(1000,10000)
                num2 = randint(1000,10000)
                answer = num1+num2
                answer=int(answer)
                useranswer=int(input(str(num1) + "+"+ str(num2)+"="))
                if useranswer == answer:
                    print("Correct!")
                    rightqs=rightqs+1
                else:
                    print("Wrong, the answer was ", answer)
                questions=questions+1
            elif mode == "H":
                num1 = randint(10000,1000000)
                num2 = randint(10000,1000000)
                answer = num1+num2
                answer=int(answer)
                useranswer=int(input(str(num1) + "+"+ str(num2)+"="))
                if useranswer == answer:
                    print("Correct!")
                    rightqs=rightqs+1
                else:
                    print("Wrong, the answer was ", answer)
                questions=questions+1
            else:
                print("Invalid Input")
        elif operations == "S":
            if mode == "E":
                num1 = randint(50,100)
                num2 = randint(5,49)
                answer = num1-num2
                answer=int(answer)
                useranswer=int(input(str(num1)+ "-"+ str(num2)+"="))
                if useranswer == answer:
                    print("Correct!")
                    rightqs=rightqs+1
                else:
                    print("Wrong, the answer was ", answer)
                questions=questions+1
            elif mode == "M":
                num1 = randint(5000,10000)
                num2 = randint(100,5000)
                answer = num1-num2
                answer=int(answer)
                useranswer=int(input(str(num1) + "-"+ str(num2)+"="))
                if useranswer == answer:
                    print("Correct!")
                    rightqs=rightqs+1
                else:
                    print("Wrong, the answer was ", answer)
                questions=questions+1
            elif mode == "H":
                num1 = randint(50000,1000000)
                num2 = randint(10000,50000)
                answer = num1-num2
                answer=int(answer)
                useranswer=int(input(str(num1) + "-"+ str(num2)+"="))
                if useranswer == answer:
                    print("Correct!")
                    rightqs=rightqs+1
                else:
                    print("Wrong, the answer was ", answer)
                questions=questions+1
            else:
                print("Invalid Input")
        elif operations == "M":
            if mode == "E":
                num1 = randint(5,25)
                num2 = randint(1,10)
                answer = num1*num2
                answer=int(answer)
                useranswer=int(input(str(num1)+ "×"+ str(num2) +"="))
                if useranswer == answer:
                    print("Correct!")
                    rightqs=rightqs+1
                else:
                    print("Wrong, the answer was ", answer)
                questions=questions+1
            elif mode == "M":
                num1 = randint(25,100)
                num2 = randint(10,100)
                answer = num1*num2
                answer=int(answer)
                useranswer=int(input(str(num1) + "×"+ str(num2)+"="))
                if useranswer == answer:
                    print("Correct!")
                    rightqs=rightqs+1
                else:
                    print("Wrong, the answer was ", answer)
                questions=questions+1
            elif mode == "H":
                num1 = randint(100,2500)
                num2 = randint(100,1000)
                answer = num1*num2
                answer=int(answer)
                useranswer=int(input(str(num1) + "×"+ str(num2)+"="))
                if useranswer == answer:
                    print("Correct!")
                    rightqs=rightqs+1
                else:
                    print("Wrong, the answer was ", answer)
                questions=questions+1
            else:
                print("Invalid Input")
        elif operations == "D":
            if mode == "E":
                possnums1 = [30,40,60,70,80,90,100]
                possnums2 = [5,10,2]
                num1 = possnums1[randint(0,6)]
                num2 = possnums2[randint(0,2)]
                answer = num1/num2
                answer=int(answer)
                useranswer=int(input(str(num1) + "÷"+ str(num2) +"="))
                if useranswer == answer:
                    print("Correct!")
                    rightqs=rightqs+1
                else:
                    print("Wrong, the answer was ", answer)
                questions=questions+1
            elif mode == "M":
                possnums1 = [100,120,240,330,540,390,510]
                possnums2 = [5,10,2,6]
                num1 = possnums1[randint(0,6)]
                num2 = possnums2[randint(0,3)]
                answer = num1/num2
                answer=int(answer)
                useranswer=int(input(str(num1) + "÷"+ str(num2) +"="))
                if useranswer == answer:
                    print("Correct!")
                    rightqs=rightqs+1
                else:
                    print("Wrong, the answer was ", answer)
                questions=questions+1
            elif mode == "H":
                possnums1 = [280,3080,1680,308,196,5628,12588]
                possnums2 = [28,14,7]
                num1 = possnums1[randint(0,6)]
                num2 = possnums2[randint(0,2)]
                answer = num1/num2
                answer=int(answer)
                useranswer=int(input(str(num1) + "÷"+ str(num2) +"="))
                if useranswer == answer:
                    print("Correct!")
                    rightqs=rightqs+1
                else:
                    print("Wrong, the answer was ", answer)
                questions=questions+1
            else:
                print("Invalid Input")
        else:
            print("Invalid Input")
        print(str(rightqs) + " out of " +str(questions) + " correct")
    again=input("Again? Type 'Y' for yes and 'N' for no")
from random import randint
print("TEN QUICK QUESTIONS")
again = "Y"
while again=="Y":
    operations = input("(A)ddition, (S)ubtraction, (M)ultiplication, (D)ivision")
    tenquestions()
EN

回答 2

Code Review用户

发布于 2015-12-12 16:06:15

正如在我先前的回答中提到的,您可以使用一个函数来删除这个复制:

如果用户回答num2 = num1+num2 answer=int(答案)useranswer=int(str( num1 )+ "+"+ str(Num2)+“=”),则输入:打印(“正确!”)rightqs=rightqs+1 else:打印(“错误,答案是",答案) questions=questions+1

变成:

代码语言:javascript
复制
def addition(min, max):
    num1 = randint(min, max)
    num2 = randint(min, max)
    answer = num1+num2
    answer=int(answer)
    useranswer=int(input(str(num1) + "+"+ str(num2)+"="))
    if useranswer == answer:
        print("Correct!")
        rightqs=rightqs+1
    else:
        print("Wrong, the answer was ", answer)
    questions=questions+1

同样,这将导致加/减等方法之间的大量重复,而不能以类似的方式删除。你还会留下一条混乱的if/elifs链,这条链很可能也会被清理干净。

您可以将语句questions=questions+1简化为questions += 1

这是一个不必要的演员:

num1 =随机(最小,最大) num2 =随机(最小,最大)答案= num1+num2 answer=int(答案)

最后,但并非最不重要的是,您应该将起始代码放在if __name__ == "__main__":函数中。当您开始处理多个文件中的代码时,这将是预防问题

票数 5
EN

Code Review用户

发布于 2015-12-12 16:45:26

tenquestions函数有170行长。试着寻找尽可能小的功能来完成一件事情,并且做得很好。

当有类似的代码段实现相同的逻辑,但在某些位置上有不同的值时,这是方法提取的主要选择:逻辑应该移动到它自己的函数中,而更改的值应该用函数参数来替换。

@Hosch250 250开始解释这一点,让我们更进一步,并转换您的代码。按照第一个技巧和我先前对你上一个问题的回答中的一些其他技巧,您的代码如下:

代码语言:javascript
复制
def play_add(minvalue, maxvalue):
    num1 = randint(minvalue, maxvalue)
    num2 = randint(minvalue, maxvalue)
    answer = num1 + num2
    prompt = '{} + {} = '.format(num1, num2)
    useranswer = int(input(prompt))
    if useranswer == answer:
        print("Correct!")
        return True
    print("Wrong, the answer was", answer)
    return False


def play_sub(num1min, num1max, num2min, num2max):
    num1 = randint(num1min, num1max)
    num2 = randint(num2min, num2max)
    answer = num1 - num2
    prompt = '{} - {} = '.format(num1, num2)
    useranswer = int(input(prompt))
    if useranswer == answer:
        print("Correct!")
        return True
    print("Wrong, the answer was", answer)
    return False


def tenquestions():
    mode = input("(E)asy, (M)edium, (H)ard")
    questions = 0
    rightqs = 0
    while questions != 10:
        if operations == "A":
            if mode == "E":
                if play_add(5, 1000):
                    rightqs += 1
                questions += 1
            elif mode == "M":
                if play_add(1000, 10000):
                    rightqs += 1
                questions += 1
            elif mode == "H":
                if play_add(10000, 1000000):
                    rightqs += 1
                questions += 1
            else:
                print("Invalid Input")
        elif operations == "S":
            if mode == "E":
                if play_sub(50, 100, 5, 49):
                    rightqs += 1
                questions += 1
            elif mode == "M":
                if play_sub(5000, 10000, 100, 5000):
                    rightqs += 1
                questions += 1
            elif mode == "H":
                if play_sub(50000, 1000000, 10000, 50000):
                    rightqs += 1
                questions += 1
            else:
                print("Invalid Input")
        elif operations == "M":
            # ... and so on ...

诸若此类。你也可以在乘法和除法上做类似的事情。

好的,这消除了tenquestions中的很多复制,但是在play_addplay_sub中仍然有很多重复。因此,按照相同的逻辑,将公共部分提取到一个新函数中,让我们将其命名为play_operation,然后根据这一点实现play_addplay_sub

代码语言:javascript
复制
def play_operation(op, symbol, num1min, num1max, num2min, num2max):
    num1 = randint(num1min, num1max)
    num2 = randint(num2min, num2max)
    answer = op(num1, num2)
    prompt = '{} {} {} = '.format(num1, symbol, num2)
    useranswer = int(input(prompt))
    if useranswer == answer:
        print("Correct!")
        return True
    print("Wrong, the answer was", answer)
    return False


def play_add(minvalue, maxvalue):
    return play_operation(operator.add, '+', minvalue, maxvalue, minvalue, maxvalue)


def play_sub(num1min, num1max, num2min, num2max):
    return play_operation(operator.sub, '-', num1min, num1max, num2min, num2max)

在整个程序中迭代地遵循这个逻辑,并努力消除所有重复的代码块。

注意,除法比其他的要复杂一些。这很好,事实上,知道在哪里结束泛化是很重要的。在除法的情况下,您应该将公共逻辑提取到play_div函数中,您可以在此停止,不需要向后弯曲以改变play_operation在这种情况下也能工作。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/113730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档