5.4 综合练习

    我们已经基本学完了逻辑判断和循环的用法,现在开始做一点有意思的事情:设计一个小游戏猜大小,这个在文曲星上的小游戏陪伴我度过了小学时的无聊时光。

    在此之前,还是先行补充一些必要知识。

    首先,创建一个列表,放入数字,再使用 sum() 函数对列表中的所有整数求和,然后打印:

    a_list = [1,2,3]
    print(sum(a_list))

    结果是6,这应该很好理解。

    接着,Python中最方便的地方是有很多强大的库支持,现在我们导入一个 random 的内置库,然后使用它生成随机数:

    import random

    point1 = random.randrange(1,7)
    point2 = random.randrange(1,7)
    point3 = random.randrange(1,7)

    print(point1,point2,point3)

    结果就不展示了,因为每次打印结果肯定是不一样的,其中 random 中的 randrange 方法使用起来就像是 range 函数一样,两个参数即可限定随机数范围。

    在正式开始创建函数之前,我们先把游戏规则细化一下:

    游戏开始,首先玩家选择 Big or Small(押大小),选择完成后开始摇三个骰子计算总值,11 <= 总值 <=18 为 “大”,3 <= 总值 <= 10 为 “小”。然后告诉玩家猜对或是猜错的结果。看起来就像是这样:

    <<<<< GAME STARTS! >>>>>
    Big or Small:Big
    <<<<< ROLE THE DICE!>>>>>
    The points are [2, 6, 3] You Lose!

    好,现在我们就可以开始来制作小游戏了!

    我们先来梳理一下这个小游戏的程序设计思路:

    5.4 综合练习 - 图1

    首先,需要让程序知道如何摇骰子,我们需要构建一个摇骰子的函数。这里面有两个关键点,一是需要摇3个骰子,每个骰子都生成1~6的随机数,你需要考虑一下,用什么方式可以实现依次摇3个骰子,这是我们在这一章里面学到的知识点;二是创建一个列表,把摇骰子的结果存储在列表里面,并且每局游戏都更换结果,也就是说每局游戏开始前列表都被清空一次,这里也需要好好考虑下用什么方式实现。

    其次,我们摇出来的结果是3个骰子分别的点数,需要把点数转换为“大”或者“小”,其中“大”的点数范围是11 <= 总值 <=18,“小”的点数范围是3 <= 总值 <= 10。

    最后,让用户猜大小,如果猜对了就告诉用户赢的结果,如果猜错了就告诉用户输的结果。

    只要你掌握了本章的内容,这个小游戏的编程过程并不困难。如果你决心掌握编程这种魔法,实际上最需要的是,发展出设计与分解事物的思路。所谓逻辑关系就是不同事物之间的关联性,它们以何种方式连接、作用,又在什么边界条件下能实现转换或互斥。与其说是编程有趣,倒不如说是编程引发的这种思考给开发者带来了乐趣。

    有思路了吗?先试试自己动手做吧。下面会揭晓答案。

    首先,我们先来构造可以摇骰子的函数 roll_dice 。这个函数其实并不需要输入任何参数,调用后会返回储存着摇出来三个点数结果的列表。

    import random
    def roll_dice(numbers=3, points=None):
    print('<<<<< ROLL THE DICE! >>>>>')
    if points is None:
    points = []
    while numbers > 0:
    point = random.randrange(1,7)
    points.append(point)
    numbers = numbers - 1
    return points
    • 第2行:创建函数,设定两个默认参数作为可选,numbers——骰子数量,points——三个筛子的点数的列表;
    • 第3行:告知用户开始摇骰子;
    • 第4~5行:如果参数中并未指定 points,那么为 points 创建空的列表;
    • 第6~9行:摇三次骰子,每摇一次 numbers 就减 1 ,直至小于等于 0 时,循环停止;
    • 第10行:返回结果的列表。

    接着,我们再用一个函数来将点数转化成大小,并使用 if 语句来定义什么是“大”,什么是“小”:

    def roll_result(total):
    isBig = 11 <= total <=18
    isSmall = 3 <= total <=10
    if isBig:
    return 'Big'
    elif isSmall:
    return 'Small'
    • 第1行:创建函数,其中必要的参数是骰子的总点数;
    • 第2~3行:设定“大”与“小”的判断标准;
    • 第4~7行:在不同的条件下返回不同的结果。

    最后,创建一个开始游戏的函数,让用户输入猜大小,并且定义什么是猜对,什么是猜错,并输出对应的输赢结果。

    def start_game():
    print('<<<<< GAME STARTS! >>>>>')
    choices = ['Big','Small']
    your_choice = input('Big or Small :')
    if your_choice in choices:
    points = roll_dice()
    total = sum(points)
    youWin = your_choice == roll_result(total)
    if youWin:
    print('The points are',points,'You win !')
    else:
    print('The points are',points,'You lose !')
    else:
    print('Invalid Words')
    start_game()
    start_game()
    • 第1行:创建函数,并不需要什么特殊参数;
    • 第2行:告知用户游戏开始;
    • 第3行:规定什么是正确的输入;
    • 第4行:将用户输入的字符串储存在 your_choice中;
    • 第5、13~15行:如果符合输入规范则往下进行,不符合则告知用户并重新开始;
    • 第6行:调用 roll_dice函数,将返回的列表命名为 points;
    • 第7行:点数求和;
    • 第8行:设定胜利的条件——你所选的结果和计算机生成的结果是一致的;
    • 第9~12行:成立则告知胜利,反之,告知失败;
    • 第16行:调用函数,使程序运行。

    完成这个小游戏之后,你就可以试着和自己设计的程序玩猜大小了。同时你也掌握了循环和条件判断混用的方法,初步具备了设计更复杂的程序的能力了。

    练习题

    一、在最后一个项目的基础上增加这样的功能,下注金额和赔率。具体规则如下:

    • 初始金额为1000元;
    • 金额为0时游戏结束;
    • 默认赔率为1倍,也就是说押对了能得相应金额,押错了会输掉相应金额。

    5.4 综合练习 - 图2

    二、我们在注册应用的时候,常常使用手机号作为账户名,在短信验证之前一般都会检验号码的真实性,如果是不存在的号码就不会发送验证码。检验规则如下:

    • 长度不少于11位;
    • 是移动、联通、电信号段中的一个电话号码;
    • 因为是输入号码界面,输入除号码外其他字符的可能性可以忽略;
    • 移动号段,联通号段,电信号段如下:
    CN_mobile = [134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705]
    CN_union = [130,131,132,155,156,185,186,145,176,1709]
    CN_telecom = [133,153,180,181,189,177,1700]

    程序效果如下:

    5.4 综合练习 - 图3

    建议你动手练习一次,然后在微信公众号中回复 循环与判断提示 可以获得提示,回复 循环与判断答案 可以获得参考答案,微信公众号是:easypython

    5.4 综合练习 - 图4