《云计算全栈》-python篇:简单的加减法数学游戏

1 案例1:简单的加减法数学游戏
1.1 问题

编写math_game.py脚本,实现以下目标:

随机生成两个100以内的数字
随机选择加法或是减法
总是使用大的数字减去小的数字
如果用户答错三次,程序给出正确答案

1.2 方案

创建4个函数,分别实现返回两数之和、返回两数之差、判断表达式正确性、是否继续计算四种方法:

1.首先调用main()函数(是否继续计算功能),main函数利用循环无限次调用exam()函数进行计算,计算结束,用户选择是否继续(此过程利用try语句捕获索引错误、ctrl+c(中断)错误、ctrl+d错误),如果选择n即结束循环,不再调用exam()函数,否则循环继续

2.调用exam()函数:

a)输出运算公式:利用列表切片将随机生成的两个数打印(这两个数利用random模块及列表生成式随机生成,并利用sort()方法进行降序排序,确保相减时一直是大的数字减小的数字),利用random模块随机生成“+”“-”号,输出在两数之间

b)用户输入值,利用for循环进行三次判断,如果运算公式结果与用户输入值相同,循环结束,系统输出“你赢了”,exam()函数执行结束,否则系统输出“你答错了”,循环继续,3次都回答错误,利用循环的else分支输出运算公式及结果

c)上诉运算公式结果:利用random模块随机生成“+”“-”值对关系调用(其中“+”“-”号作为字典键,返回和函数add()及返回差函数sub()作为值,调用时将随机生成的两个数字作为参数传递给add()函数及sub()函数)
1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:编写脚本

[root@localhost day06]# vim math_game.py
#!/usr/bin/env python3
import random
def add(x, y):
    return x + y
def sub(x, y):
    return x - y
def exam():
    cmds = {'+': add, '-': sub}  # 将函数存入字典
    nums = [random.randint(1, 100) for i in range(2)] # 生成两个数
    nums.sort(reverse=True)  # 降序排列
    op = random.choice('+-')
    result = cmds[op](*nums)  # 调用存入字典的函数,把nums列表拆开,作为参数传入
    prompt = "%s %s %s = " % (nums[0], op, nums[1])
    for i in range(3):
        try:
            answer = int(input(prompt))
        except:
            continue
        if answer == result:
            print('你真棒,答对了!')
            break  # 答对了就不要再回答了,结束循环
        else:
            print('答错了')
    else:
        print("%s%s" % (prompt, result))   # 只有循环不被break才执行
def main():
    while True:
        exam()
        try:
            go_on = input('Continue(y/n)? ').strip()[0]
        except IndexError:
            continue
        except (KeyboardInterrupt, EOFError):
            go_on = 'n'
        if go_on in 'nN':
            print('\nBye-bye.')
            break
if __name__ == '__main__':
    main()

实现此案例还可利用while循环:

[root@localhost day06]# vim mygui.py
#!/usr/bin/env python3
import random
def add(x, y):
    return x + y
def sub(x, y):
    return x - y
def exam():
    cmds = {'+': add, '-': sub}  # 将函数存入字典
    nums = [random.randint(1, 100) for i in range(2)] # 生成两个数
    nums.sort(reverse=True)  # 降序排列
    op = random.choice('+-')
    result = cmds[op](*nums)  # 调用存入字典的函数,把nums列表拆开,作为参数传入
    prompt = "%s %s %s = " % (nums[0], op, nums[1])
    tries = 0
    while tries < 3:
        try:
            answer = int(input(prompt))
        except:
            continue
        if answer == result:
            print('你真棒,答对了!')
            break  # 答对了就不要再回答了,结束循环
        else:
            print('答错了')
            tries += 1
    else:
        print("%s%s" % (prompt, result))   # 只有循环不被break才执行
def main():
    while True:
        exam()
        try:
            go_on = input('Continue(y/n)? ').strip()[0]
        except IndexError:
            continue
        except (KeyboardInterrupt, EOFError):
            go_on = 'n'
        if go_on in 'nN':
            print('\nBye-bye.')
            break
if __name__ == '__main__':
    main()

步骤二:测试脚本执行

[root@localhost day06]# python3 math_game.py 
54 + 19 = 
54 + 19 = 
54 + 19 = 73
你真棒,答对了!
Continue(y/n)? y
60 + 39 = 99
你真棒,答对了!
Continue(y/n)? y
18 + 15 = 33
你真棒,答对了!
Continue(y/n)? y
35 + 20 = 55
你真棒,答对了!
Continue(y/n)? y
37 + 35 = 72
你真棒,答对了!
Continue(y/n)? y
77 - 57 = 20
你真棒,答对了!
Continue(y/n)? y
35 + 23 = 5
答错了
35 + 23 = 6
答错了
35 + 23 = 7
答错了
35 + 23 = 58
Continue(y/n)? y
75 + 47 = 122
你真棒,答对了!
Continue(y/n)? ^C
Bye-bye.
发布了275 篇原创文章 · 获赞 46 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xie_qi_chao/article/details/104726184