Python项目实战

第一章:猜谜游戏

第二章:街霸游戏

第三章:购物系统

第四章:搜索引擎

首页 > Python项目实战 > 第一章:猜谜游戏 > 1.2节:进阶的猜姓名游戏

1.2节:进阶的猜姓名游戏

薯条老师 2021-02-15 14:13:02 236689 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师的线下Python小班办得很好,学员的平均就业薪资有11K。线下小班培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

进阶的猜姓名游戏

上节中实现了一个简单的猜数字游戏,程序启动时获取一个随机值,根据用户的输入提示大了还是小了。在本节的程序实战中,实现一个进阶的猜谜游戏:

定义一个人名集合,例如 {"王祖贤", "李嘉欣", "李嘉诚", "刘德华", "叶倩文","叶倩倩", "王李丹妮"}。如果用户的输入前缀匹配第一个字,则提示"不错,有点接近了",前缀匹配前面两个字,则提示"厉害,比较接近了",完全匹配则提示"哇塞,你是个猜姓名天才,请收下我的膝盖"

程序难点分析

实现该程序的难点在于如何快速判断用户的输入是否为某一个姓名的前缀,若将用户的输入与词典中的所有姓名逐字符进行比较,能实现该功能,但性能很差。在数据结构中有一种经典的Trie结构,可利用字典对象来构造一个类似于Trie树的索引结构,这样就可以快速的进行姓名的前缀匹配。

1613370823(1).jpg

构造该Trie结构的算法逻辑很简单,以第一次构造为例

将姓名中的第一个字作为键插入到指针指向的空字典中,键值为一个空字典,然后将指针指向键值所对应的空字典,接着将姓名中的第二个字作为键插入到指针指向的空字典中,键值为一个空字典,同样需要将指针指向键值所对应的空字典,不断重复这样的过程,直到遍历完姓名中的所有字符。

简化的代码实例:

name = "王八蛋"
trie = {}
trie[name[0]] =  {}
trie[name[0]][name[1]] =  {}
trie[name[0]][name[1]][name[2]] =  {}

这样在查找用户的输入是否包含某姓名的前缀时,只需要遍历用户输入的字符,然后在构造好的Trie结构中进行查找。

程序完整源码

# __author__ = 薯条老师
# 微信公众号 =  薯条编程
import time



def countdown(seconds=3, message=""):
    """
    :param seconds: 倒数的秒数
    :param message:  倒计时结束后输出的提示信息
    :return:
    """
    for _ in range(seconds, 0, -1):
        _, _ = print(_), time.sleep(1)
    else:
        print(message)
        
        
        
def build_lookup_table(data):
    """
    :param data: a set of names, e.g: {"王祖贤", "李嘉欣"}
    :return: lookup table e.g:{'王': {'祖': {'贤': {}}}, '李': {'嘉': {'欣': {}}}}
    """
    lookup_table = {}
    for name in data:
        lookup_table_ = lookup_table
        for char in name:
            if char not in lookup_table_:
                lookup_table_[char] = {}
            lookup_table_ = lookup_table_[char]
    return lookup_table
    
    
    
def guess_name():
    stars = {"王祖贤", "李嘉欣", "李嘉诚", "刘德华", "叶倩文", "叶倩倩", "王李丹妮"}
    # 构造一个查找表
    lookup_table = build_lookup_table(stars)
    countdown(3, "猜姓名游戏开始,Go!!!")
    messages = {0: "不要瞎猜好吗?",  1: "不错,有点接近了",  2: "厉害,比较接近了",
                66: "哇塞,你是个猜姓名天才,请收下我的膝盖"}
    end = 2
    while True:
        name = input("请输入你要猜的姓名:____\b\b\b\b")
        if name in stars:
            print(messages[66])
            if input("按键盘任意键继续玩猜数字游戏或输入quit退出游戏:____\b\b\b\b").lower() == "quit":
                break
        else:
            lookup_table_ = lookup_table
            index = 0
            for word in name:
                if word in lookup_table_:
                    lookup_table_ = lookup_table_[word]
                    index = index+1 if index < end else index
                else:
                    break
            print(messages[index])
if __name__ == "__main__":
    guess_name()

程序的输出界面

1613372737(1).jpg

项目扩展

增加一个限时猜谜的功能,比如限定在60秒内完成猜数字游戏,否则就终止当前的游戏

最具实力的小班培训

来这里参加Python和Java小班培训的学员大部分都找到了很好的工作,平均月薪有11K,学得好的同学,拿到的会更高。由于是小班教学,所以薯条老师有精力把每位学员都教好。打算参加线下小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,免费领取课程大纲
(3) Java后端开发工程师高薪就业班,月薪11K-20K, 免费领取课程大纲
(4) Python大数据分析,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取学习资料:

关注微信公众号.jpg







欢迎 发表评论: