就像我之前提出的关于我的心理数学游戏的问题一样,我已经为一个十道题的数学游戏写了一个脚本,而且似乎还有一个更简单的方法,有人能把我从黑暗中解救出来吗?
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()发布于 2015-12-12 16:06:15
正如在我先前的回答中提到的,您可以使用一个函数来删除这个复制:
如果用户回答num2 = num1+num2 answer=int(答案)useranswer=int(str( num1 )+ "+"+ str(Num2)+“=”),则输入:打印(“正确!”)rightqs=rightqs+1 else:打印(“错误,答案是",答案) questions=questions+1
变成:
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__":函数中。当您开始处理多个文件中的代码时,这将是预防问题。
发布于 2015-12-12 16:45:26
tenquestions函数有170行长。试着寻找尽可能小的功能来完成一件事情,并且做得很好。
当有类似的代码段实现相同的逻辑,但在某些位置上有不同的值时,这是方法提取的主要选择:逻辑应该移动到它自己的函数中,而更改的值应该用函数参数来替换。
@Hosch250 250开始解释这一点,让我们更进一步,并转换您的代码。按照第一个技巧和我先前对你上一个问题的回答中的一些其他技巧,您的代码如下:
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_add和play_sub中仍然有很多重复。因此,按照相同的逻辑,将公共部分提取到一个新函数中,让我们将其命名为play_operation,然后根据这一点实现play_add和play_sub:
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在这种情况下也能工作。
https://codereview.stackexchange.com/questions/113730
复制相似问题